Message ID | 3f0cdec313dfaefcc5254a10a58c4e1a380ad79c.1460931309.git.daniel@iogearbox.net |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
Hi Daniel, [auto build test ERROR on net-next/master] url: https://github.com/0day-ci/linux/commits/Daniel-Borkmann/bpf-trace-add-BPF_F_CURRENT_CPU-flag-for-bpf_perf_event_output/20160418-063147 config: m68k-allyesconfig (attached as .config) reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=m68k All errors (new ones prefixed by >>): net/core/filter.c: In function 'bpf_skb_event_output': >> net/core/filter.c:1599:2: error: implicit declaration of function 'perf_fetch_caller_regs' [-Werror=implicit-function-declaration] perf_fetch_caller_regs(regs); ^ cc1: some warnings being treated as errors vim +/perf_fetch_caller_regs +1599 net/core/filter.c 1593 static DEFINE_PER_CPU(struct pt_regs, bpf_pt_regs); 1594 1595 static u64 bpf_skb_event_output(u64 r1, u64 r2, u64 flags, u64 r4, u64 size) 1596 { 1597 struct pt_regs *regs = this_cpu_ptr(&bpf_pt_regs); 1598 > 1599 perf_fetch_caller_regs(regs); 1600 1601 return bpf_perf_event_output((long)regs, r2, flags, r4, size); 1602 } --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
On 04/18/2016 01:55 AM, kbuild test robot wrote: > Hi Daniel, > > [auto build test ERROR on net-next/master] > > url: https://github.com/0day-ci/linux/commits/Daniel-Borkmann/bpf-trace-add-BPF_F_CURRENT_CPU-flag-for-bpf_perf_event_output/20160418-063147 > config: m68k-allyesconfig (attached as .config) > reproduce: > wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross > chmod +x ~/bin/make.cross > # save the attached .config to linux build tree > make.cross ARCH=m68k > > All errors (new ones prefixed by >>): > > net/core/filter.c: In function 'bpf_skb_event_output': >>> net/core/filter.c:1599:2: error: implicit declaration of function 'perf_fetch_caller_regs' [-Werror=implicit-function-declaration] > perf_fetch_caller_regs(regs); > ^ > cc1: some warnings being treated as errors > > vim +/perf_fetch_caller_regs +1599 net/core/filter.c > > 1593 static DEFINE_PER_CPU(struct pt_regs, bpf_pt_regs); > 1594 > 1595 static u64 bpf_skb_event_output(u64 r1, u64 r2, u64 flags, u64 r4, u64 size) > 1596 { > 1597 struct pt_regs *regs = this_cpu_ptr(&bpf_pt_regs); > 1598 >> 1599 perf_fetch_caller_regs(regs); > 1600 > 1601 return bpf_perf_event_output((long)regs, r2, flags, r4, size); > 1602 } Sorry about that, missed this one. Will fix it up in v2! Thanks, Daniel
diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 5fb3c61..2116924 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -167,6 +167,8 @@ struct bpf_array { u64 bpf_tail_call(u64 ctx, u64 r2, u64 index, u64 r4, u64 r5); u64 bpf_get_stackid(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5); +u64 bpf_perf_event_output(u64 r1, u64 r2, u64 flags, u64 r4, u64 size); + void bpf_fd_array_map_clear(struct bpf_map *map); bool bpf_prog_array_compatible(struct bpf_array *array, const struct bpf_prog *fp); const struct bpf_func_proto *bpf_get_trace_printk_proto(void); diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 6bfe55c..7fe2f22 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -225,7 +225,7 @@ static const struct bpf_func_proto bpf_perf_event_read_proto = { .arg2_type = ARG_ANYTHING, }; -static u64 bpf_perf_event_output(u64 r1, u64 r2, u64 flags, u64 r4, u64 size) +u64 bpf_perf_event_output(u64 r1, u64 r2, u64 flags, u64 r4, u64 size) { struct pt_regs *regs = (struct pt_regs *) (long) r1; struct bpf_map *map = (struct bpf_map *) (long) r2; diff --git a/net/core/filter.c b/net/core/filter.c index 5d2ac2b..3521252 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -46,6 +46,7 @@ #include <linux/seccomp.h> #include <linux/if_vlan.h> #include <linux/bpf.h> +#include <linux/perf_event.h> #include <net/sch_generic.h> #include <net/cls_cgroup.h> #include <net/dst_metadata.h> @@ -1584,6 +1585,33 @@ static const struct bpf_func_proto bpf_csum_diff_proto = { .arg5_type = ARG_ANYTHING, }; +u64 __weak bpf_perf_event_output(u64 r1, u64 r2, u64 flags, u64 r4, u64 size) +{ + return -EACCES; +} + +static DEFINE_PER_CPU(struct pt_regs, bpf_pt_regs); + +static u64 bpf_skb_event_output(u64 r1, u64 r2, u64 flags, u64 r4, u64 size) +{ + struct pt_regs *regs = this_cpu_ptr(&bpf_pt_regs); + + perf_fetch_caller_regs(regs); + + return bpf_perf_event_output((long)regs, r2, flags, r4, size); +} + +static const struct bpf_func_proto bpf_skb_event_output_proto = { + .func = bpf_skb_event_output, + .gpl_only = true, + .ret_type = RET_INTEGER, + .arg1_type = ARG_PTR_TO_CTX, + .arg2_type = ARG_CONST_MAP_PTR, + .arg3_type = ARG_ANYTHING, + .arg4_type = ARG_PTR_TO_STACK, + .arg5_type = ARG_CONST_STACK_SIZE, +}; + static u64 bpf_clone_redirect(u64 r1, u64 ifindex, u64 flags, u64 r4, u64 r5) { struct sk_buff *skb = (struct sk_buff *) (long) r1, *skb2; @@ -2039,6 +2067,8 @@ tc_cls_act_func_proto(enum bpf_func_id func_id) return &bpf_redirect_proto; case BPF_FUNC_get_route_realm: return &bpf_get_route_realm_proto; + case BPF_FUNC_perf_event_output: + return &bpf_skb_event_output_proto; default: return sk_filter_func_proto(func_id); }