Messages in this thread Patch in this message | | | From | jinshan.xiong@gmail ... | Subject | [PATCH] staging: tracing/kprobe: filter kprobe based perf event | Date | Tue, 17 Sep 2019 22:24:06 -0700 |
| |
From: Jinshan Xiong <jinshan.xiong@gmail.com>
Invoking bpf program only if kprobe based perf_event has been added into the percpu list. This is essential to make event tracing for cgroup to work properly.
Signed-off-by: Jinshan Xiong <jinshan.xiong@gmail.com> --- kernel/trace/trace_kprobe.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index 9d483ad9bb6c..40ef0f1945f7 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c @@ -1171,11 +1171,18 @@ static int kprobe_perf_func(struct trace_kprobe *tk, struct pt_regs *regs) { struct trace_event_call *call = trace_probe_event_call(&tk->tp); + struct hlist_head *head = this_cpu_ptr(call->perf_events); struct kprobe_trace_entry_head *entry; - struct hlist_head *head; int size, __size, dsize; int rctx; + /* + * If head is empty, the process currently running on this cpu is not + * interested by kprobe perf PMU. + */ + if (hlist_empty(head)) + return 0; + if (bpf_prog_array_valid(call)) { unsigned long orig_ip = instruction_pointer(regs); int ret; @@ -1193,10 +1200,6 @@ kprobe_perf_func(struct trace_kprobe *tk, struct pt_regs *regs) return 0; } - head = this_cpu_ptr(call->perf_events); - if (hlist_empty(head)) - return 0; - dsize = __get_data_size(&tk->tp, regs); __size = sizeof(*entry) + tk->tp.size + dsize; size = ALIGN(__size + sizeof(u32), sizeof(u64));
| |