Skip to content

Commit

Permalink
Add perf_reader_consume
Browse files Browse the repository at this point in the history
In order to read 'remainder' events from perf buffers w/ 'wakeup_events
> 1', an API to force reading from a program's perf buffers regardless
of whether their fds are in "ready to read" state is necessary. This
commit introduces such an API, perf_reader_consume, modeled after
libbpf's perf_buffer__consume.

Future work will refactor bcc to use libbpf's perf buffer
support as much as possible instead of duplicating functionality. For
now, since iovisor#3801 was commited let's add this piece of missing
functionality.
  • Loading branch information
davemarchevsky authored and yonghong-song committed Jan 11, 2022
1 parent 23a2142 commit ad697c8
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/cc/perf_reader.c
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,14 @@ int perf_reader_poll(int num_readers, struct perf_reader **readers, int timeout)
return 0;
}

int perf_reader_consume(int num_readers, struct perf_reader **readers) {
int i;
for (i = 0; i < num_readers; ++i) {
perf_reader_event_read(readers[i]);
}
return 0;
}

void perf_reader_set_fd(struct perf_reader *reader, int fd) {
reader->fd = fd;
}
Expand Down
1 change: 1 addition & 0 deletions src/cc/perf_reader.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ void perf_reader_free(void *ptr);
int perf_reader_mmap(struct perf_reader *reader);
void perf_reader_event_read(struct perf_reader *reader);
int perf_reader_poll(int num_readers, struct perf_reader **readers, int timeout);
int perf_reader_consume(int num_readers, struct perf_reader **readers);
int perf_reader_fd(struct perf_reader *reader);
void perf_reader_set_fd(struct perf_reader *reader, int fd);

Expand Down
12 changes: 12 additions & 0 deletions src/python/bcc/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1667,6 +1667,18 @@ def perf_buffer_poll(self, timeout = -1):
readers[i] = v
lib.perf_reader_poll(len(readers), readers, timeout)

def perf_buffer_consume(self):
"""perf_buffer_consume(self)
Consume all open perf buffers, regardless of whether or not
they currently contain events data. Necessary to catch 'remainder'
events when wakeup_events > 1 is set in open_perf_buffer
"""
readers = (ct.c_void_p * len(self.perf_buffers))()
for i, v in enumerate(self.perf_buffers.values()):
readers[i] = v
lib.perf_reader_consume(len(readers), readers)

def kprobe_poll(self, timeout = -1):
"""kprobe_poll(self)
Expand Down
2 changes: 2 additions & 0 deletions src/python/bcc/libbcc.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,8 @@ class bcc_perf_buffer_opts(ct.Structure):
lib.bpf_open_perf_event.argtypes = [ct.c_uint, ct.c_ulonglong, ct.c_int, ct.c_int]
lib.perf_reader_poll.restype = ct.c_int
lib.perf_reader_poll.argtypes = [ct.c_int, ct.POINTER(ct.c_void_p), ct.c_int]
lib.perf_reader_consume.restype = ct.c_int
lib.perf_reader_consume.argtypes = [ct.c_int, ct.POINTER(ct.c_void_p)]
lib.perf_reader_free.restype = None
lib.perf_reader_free.argtypes = [ct.c_void_p]
lib.perf_reader_fd.restype = int
Expand Down

0 comments on commit ad697c8

Please sign in to comment.