Message ID | 20200831155155.62754-1-alexei.starovoitov@gmail.com |
---|---|
State | New |
Headers | show |
Series | [v2,bpf-next] bpf: Fix build without BPF_SYSCALL, but with BPF_JIT. | expand |
On Mon, Aug 31, 2020 at 08:51:55AM -0700, Alexei Starovoitov wrote: > From: Alexei Starovoitov <ast@kernel.org> > > When CONFIG_BPF_SYSCALL is not set, but CONFIG_BPF_JIT=y > the kernel build fails: > In file included from ../kernel/bpf/trampoline.c:11: > ../kernel/bpf/trampoline.c: In function ‘bpf_trampoline_update’: > ../kernel/bpf/trampoline.c:220:39: error: ‘call_rcu_tasks_trace’ undeclared > ../kernel/bpf/trampoline.c: In function ‘__bpf_prog_enter_sleepable’: > ../kernel/bpf/trampoline.c:411:2: error: implicit declaration of function ‘rcu_read_lock_trace’ > ../kernel/bpf/trampoline.c: In function ‘__bpf_prog_exit_sleepable’: > ../kernel/bpf/trampoline.c:416:2: error: implicit declaration of function ‘rcu_read_unlock_trace’ > > This is due to: > obj-$(CONFIG_BPF_JIT) += trampoline.o > obj-$(CONFIG_BPF_JIT) += dispatcher.o > There is a number of functions that arch/x86/net/bpf_jit_comp.c is > using from these two files, but none of them will be used when > only cBPF is on (which is the case for BPF_SYSCALL=n BPF_JIT=y). > > Add rcu_trace functions to rcupdate_trace.h. The JITed code won't execute them > and BPF trampoline logic won't be used without BPF_SYSCALL. > > Reported-by: kernel test robot <lkp@intel.com> > Fixes: 1e6c62a88215 ("bpf: Introduce sleepable BPF programs") > Acked-by: Paul E. McKenney <paulmck@kernel.org> > Signed-off-by: Alexei Starovoitov <ast@kernel.org> Looks good, and unless someone tells me otherwise, I am assuming that this one goes up the normal BPF patch route. Thanx, Paul > --- > include/linux/rcupdate_trace.h | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/include/linux/rcupdate_trace.h b/include/linux/rcupdate_trace.h > index d9015aac78c6..aaaac8ac927c 100644 > --- a/include/linux/rcupdate_trace.h > +++ b/include/linux/rcupdate_trace.h > @@ -82,7 +82,14 @@ static inline void rcu_read_unlock_trace(void) > void call_rcu_tasks_trace(struct rcu_head *rhp, rcu_callback_t func); > void synchronize_rcu_tasks_trace(void); > void rcu_barrier_tasks_trace(void); > - > +#else > +/* > + * The BPF JIT forms these addresses even when it doesn't call these > + * functions, so provide definitions that result in runtime errors. > + */ > +static inline void call_rcu_tasks_trace(struct rcu_head *rhp, rcu_callback_t func) { BUG(); } > +static inline void rcu_read_lock_trace(void) { BUG(); } > +static inline void rcu_read_unlock_trace(void) { BUG(); } > #endif /* #ifdef CONFIG_TASKS_TRACE_RCU */ > > #endif /* __LINUX_RCUPDATE_TRACE_H */ > -- > 2.23.0 >
On 8/31/20 5:51 PM, Alexei Starovoitov wrote: > From: Alexei Starovoitov <ast@kernel.org> > > When CONFIG_BPF_SYSCALL is not set, but CONFIG_BPF_JIT=y > the kernel build fails: > In file included from ../kernel/bpf/trampoline.c:11: > ../kernel/bpf/trampoline.c: In function ‘bpf_trampoline_update’: > ../kernel/bpf/trampoline.c:220:39: error: ‘call_rcu_tasks_trace’ undeclared > ../kernel/bpf/trampoline.c: In function ‘__bpf_prog_enter_sleepable’: > ../kernel/bpf/trampoline.c:411:2: error: implicit declaration of function ‘rcu_read_lock_trace’ > ../kernel/bpf/trampoline.c: In function ‘__bpf_prog_exit_sleepable’: > ../kernel/bpf/trampoline.c:416:2: error: implicit declaration of function ‘rcu_read_unlock_trace’ > > This is due to: > obj-$(CONFIG_BPF_JIT) += trampoline.o > obj-$(CONFIG_BPF_JIT) += dispatcher.o > There is a number of functions that arch/x86/net/bpf_jit_comp.c is > using from these two files, but none of them will be used when > only cBPF is on (which is the case for BPF_SYSCALL=n BPF_JIT=y). > > Add rcu_trace functions to rcupdate_trace.h. The JITed code won't execute them > and BPF trampoline logic won't be used without BPF_SYSCALL. > > Reported-by: kernel test robot <lkp@intel.com> > Fixes: 1e6c62a88215 ("bpf: Introduce sleepable BPF programs") > Acked-by: Paul E. McKenney <paulmck@kernel.org> > Signed-off-by: Alexei Starovoitov <ast@kernel.org> Applied, thanks!
diff --git a/include/linux/rcupdate_trace.h b/include/linux/rcupdate_trace.h index d9015aac78c6..aaaac8ac927c 100644 --- a/include/linux/rcupdate_trace.h +++ b/include/linux/rcupdate_trace.h @@ -82,7 +82,14 @@ static inline void rcu_read_unlock_trace(void) void call_rcu_tasks_trace(struct rcu_head *rhp, rcu_callback_t func); void synchronize_rcu_tasks_trace(void); void rcu_barrier_tasks_trace(void); - +#else +/* + * The BPF JIT forms these addresses even when it doesn't call these + * functions, so provide definitions that result in runtime errors. + */ +static inline void call_rcu_tasks_trace(struct rcu_head *rhp, rcu_callback_t func) { BUG(); } +static inline void rcu_read_lock_trace(void) { BUG(); } +static inline void rcu_read_unlock_trace(void) { BUG(); } #endif /* #ifdef CONFIG_TASKS_TRACE_RCU */ #endif /* __LINUX_RCUPDATE_TRACE_H */