Re: [PATCH v6 tip 2/8] tracing: attach BPF programs to kprobes
From: Peter Zijlstra <hidden>
Date: 2015-03-12 15:15:29
Also in:
lkml, netdev
From: Peter Zijlstra <hidden>
Date: 2015-03-12 15:15:29
Also in:
lkml, netdev
On Tue, Mar 10, 2015 at 09:18:48PM -0700, Alexei Starovoitov wrote:
+unsigned int trace_call_bpf(struct bpf_prog *prog, void *ctx)
+{
+ unsigned int ret;
+ int cpu;
+
+ if (in_nmi()) /* not supported yet */
+ return 1;
+
+ preempt_disable_notrace();
+
+ cpu = raw_smp_processor_id();
+ if (unlikely(per_cpu(bpf_prog_active, cpu)++ != 0)) {
+ /* since some bpf program is already running on this cpu,
+ * don't call into another bpf program (same or different)
+ * and don't send kprobe event into ring-buffer,
+ * so return zero here
+ */
+ ret = 0;
+ goto out;
+ }
+
+ rcu_read_lock();You've so far tried very hard to not get into tracing; and then you call rcu_read_lock() :-) So either document why this isn't a problem, provide rcu_read_lock_notrace() or switch to RCU-sched and thereby avoid the problem.
+ ret = BPF_PROG_RUN(prog, ctx); + rcu_read_unlock(); + + out: + per_cpu(bpf_prog_active, cpu)--; + preempt_enable_notrace(); + + return ret; +} +EXPORT_SYMBOL_GPL(trace_call_bpf);