Commit 25be6bb4 authored by yonghong-song's avatar yonghong-song Committed by GitHub

Merge pull request #1496 from palmtenor/fix_lost

Fix and improvement for perf_reader's lost_cb
parents 73b5401f b7bbd04f
...@@ -68,7 +68,7 @@ int bpf_open_raw_sock(const char *name); ...@@ -68,7 +68,7 @@ int bpf_open_raw_sock(const char *name);
typedef void (*perf_reader_cb)(void *cb_cookie, int pid, uint64_t callchain_num, typedef void (*perf_reader_cb)(void *cb_cookie, int pid, uint64_t callchain_num,
void *callchain); void *callchain);
typedef void (*perf_reader_raw_cb)(void *cb_cookie, void *raw, int raw_size); typedef void (*perf_reader_raw_cb)(void *cb_cookie, void *raw, int raw_size);
typedef void (*perf_reader_lost_cb)(uint64_t lost); typedef void (*perf_reader_lost_cb)(void *cb_cookie, uint64_t lost);
void *bpf_attach_kprobe(int progfd, enum bpf_probe_attach_type attach_type, void *bpf_attach_kprobe(int progfd, enum bpf_probe_attach_type attach_type,
const char *ev_name, const char *fn_name, const char *ev_name, const char *fn_name,
......
...@@ -243,9 +243,17 @@ void perf_reader_event_read(struct perf_reader *reader) { ...@@ -243,9 +243,17 @@ void perf_reader_event_read(struct perf_reader *reader) {
} }
if (e->type == PERF_RECORD_LOST) { if (e->type == PERF_RECORD_LOST) {
uint64_t lost = *(uint64_t *)(ptr + sizeof(*e)); /*
* struct {
* struct perf_event_header header;
* u64 id;
* u64 lost;
* struct sample_id sample_id;
* };
*/
uint64_t lost = *(uint64_t *)(ptr + sizeof(*e) + sizeof(uint64_t));
if (reader->lost_cb) { if (reader->lost_cb) {
reader->lost_cb(lost); reader->lost_cb(reader->cb_cookie, lost);
} else { } else {
fprintf(stderr, "Possibly lost %" PRIu64 " samples\n", lost); fprintf(stderr, "Possibly lost %" PRIu64 " samples\n", lost);
} }
......
...@@ -41,7 +41,7 @@ int bpf_open_raw_sock(const char *name); ...@@ -41,7 +41,7 @@ int bpf_open_raw_sock(const char *name);
typedef void (*perf_reader_cb)(void *cb_cookie, int pid, uint64_t callchain_num, void *callchain); typedef void (*perf_reader_cb)(void *cb_cookie, int pid, uint64_t callchain_num, void *callchain);
typedef void (*perf_reader_raw_cb)(void *cb_cookie, void *raw, int raw_size); typedef void (*perf_reader_raw_cb)(void *cb_cookie, void *raw, int raw_size);
typedef void (*perf_reader_lost_cb)(uint64_t lost); typedef void (*perf_reader_lost_cb)(void *cb_cookie, uint64_t lost);
void *bpf_attach_kprobe(int progfd, int attach_type, const char *ev_name, void *bpf_attach_kprobe(int progfd, int attach_type, const char *ev_name,
const char *fn_name, perf_reader_cb cb, const char *fn_name, perf_reader_cb cb,
......
...@@ -252,8 +252,8 @@ function PerfEventArray:_open_perf_buffer(cpu, callback, ctype, page_cnt, lost_c ...@@ -252,8 +252,8 @@ function PerfEventArray:_open_perf_buffer(cpu, callback, ctype, page_cnt, lost_c
local _lost_cb = nil local _lost_cb = nil
if lost_cb then if lost_cb then
_lost_cb = ffi.cast("perf_reader_lost_cb", _lost_cb = ffi.cast("perf_reader_lost_cb",
function (lost) function (cookie, lost)
lost_cb(lost) lost_cb(cookie, lost)
end) end)
end end
......
...@@ -89,7 +89,7 @@ lib.bpf_attach_kprobe.restype = ct.c_void_p ...@@ -89,7 +89,7 @@ lib.bpf_attach_kprobe.restype = ct.c_void_p
_CB_TYPE = ct.CFUNCTYPE(None, ct.py_object, ct.c_int, _CB_TYPE = ct.CFUNCTYPE(None, ct.py_object, ct.c_int,
ct.c_ulonglong, ct.POINTER(ct.c_ulonglong)) ct.c_ulonglong, ct.POINTER(ct.c_ulonglong))
_RAW_CB_TYPE = ct.CFUNCTYPE(None, ct.py_object, ct.c_void_p, ct.c_int) _RAW_CB_TYPE = ct.CFUNCTYPE(None, ct.py_object, ct.c_void_p, ct.c_int)
_LOST_CB_TYPE = ct.CFUNCTYPE(None, ct.c_ulonglong) _LOST_CB_TYPE = ct.CFUNCTYPE(None, ct.py_object, ct.c_ulonglong)
lib.bpf_attach_kprobe.argtypes = [ct.c_int, ct.c_int, ct.c_char_p, ct.c_char_p, lib.bpf_attach_kprobe.argtypes = [ct.c_int, ct.c_int, ct.c_char_p, ct.c_char_p,
_CB_TYPE, ct.py_object] _CB_TYPE, ct.py_object]
lib.bpf_detach_kprobe.restype = ct.c_int lib.bpf_detach_kprobe.restype = ct.c_int
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment