Last active
October 16, 2020 07:21
-
-
Save mattnite/9edb2e953cd0dd73389c3515d16391ec to your computer and use it in GitHub Desktop.
Main program for BPF perf buffer example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const std = @import("std"); | |
const bpf = @import("bpf"); | |
const mem = std.mem; | |
usingnamespace @import("common.zig"); | |
const os = std.os; | |
const assert = std.debug.assert; | |
const c = @cImport({ | |
@cInclude("net/if.h"); | |
}); | |
// tell the compiler to include multithreaded event loop | |
pub const io_mode = .evented; | |
// embed external file into .rodata section | |
const probe = @embedFile("probe.o"); | |
comptime { | |
@setEvalBranchQuota(4000); | |
assert(bpf.elf.has_section("socket1")); | |
} | |
fn consume_events(perf_buffer: *BPF.PerfBuffer) void { | |
while (perf_buffer.running.get()) { | |
const payload = perf_buffer.get(); | |
switch (payload.event) { | |
.sample => |data| { | |
defer data.deinit(); | |
std.debug.print("cpu: {}, sample: {}\n", .{ | |
payload.cpu, | |
mem.bytesToValue(usize, data.items[0..8]), | |
}); | |
}, | |
.lost => |cnt| { | |
std.debug.print("cpu: {}, lost: {}\n", .{ payload.cpu, cnt }); | |
}, | |
} | |
} | |
} | |
pub fn main() anyerror!void { | |
var gpa = std.heap.GeneralPurposeAllocator(.{}){}; | |
var obj = try bpf.Object.init(&gpa.allocator, probe); | |
defer obj.deinit(); | |
try obj.load(); | |
defer obj.unload(); | |
const sock_fd = try create_raw_socket("lo"); | |
defer os.close(sock_fd); | |
const prog = obj.find_prog("socket1") orelse unreachable; | |
try os.setsockopt(sock_fd, c.SOL_SOCKET, c.SO_ATTACH_BPF, mem.asBytes(&prog)); | |
const perf_event_array = try BPF.PerfEventArray.init(BPF.MapInfo{ | |
.fd = obj.find_map("events") orelse return error.NoEventsMap, | |
.def = BPF.kern.PerfEventArray.init(256, 0).map.def, | |
}); | |
var perf_buffer = try BPF.PerfBuffer.init(&gpa.allocator, perf_event_array, 64); | |
_ = async perf_buffer.run(); | |
_ = async consume_events(&perf_buffer); | |
// suspends current frame in event loop, which ends up running the program indefinitely | |
suspend; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment