Skip to content
  • Wang Nan's avatar
    perf bpf: Support BPF program attach to tracepoints · b4ee6d41
    Wang Nan authored
    To support 98b5c2c6
    
     ("perf, bpf: allow bpf programs attach to
    tracepoints"), this patch allows BPF scripts to select tracepoints in
    their section name.
    
    Example:
    
      # cat test_tracepoint.c
      /*********************************************/
      #include <uapi/linux/bpf.h>
      #define SEC(NAME) __attribute__((section(NAME), used))
      SEC("raw_syscalls:sys_enter")
      int func(void *ctx)
      {
     	/*
     	 * /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/format:
     	 * ...
     	 * field:long id;	offset:8;	size:8;	signed:1;
     	 * ...
     	 * ctx + 8 select 'id'
     	 */
     	u64 id = *((u64 *)(ctx + 8));
     	if (id == 1)
     		return 1;
     	return 0;
      }
      SEC("_write=sys_write")
      int _write(void *ctx)
      {
     	return 1;
      }
      char _license[] SEC("license") = "GPL";
      int _version SEC("version") = LINUX_VERSION_CODE;
      /*********************************************/
      # perf record -e ./test_tracepoint.c  dd if=/dev/zero of=/dev/null count=5
      5+0 records in
      5+0 records out
      2560 bytes (2.6 kB) copied, 6.2281e-05 s, 41.1 MB/s
      [ perf record: Woken up 1 times to write data ]
      # perf script
             dd 13436 [005] 1596.490869: raw_syscalls:sys_enter: NR 1 (1, 178d000, 200, 7ffe82470d60, ffffffffffffe020, fffff
             dd 13436 [005] 1596.490871:  perf_bpf_probe:_write: (ffffffff812351e0)
             dd 13436 [005] 1596.490873: raw_syscalls:sys_enter: NR 1 (1, 178d000, 200, ffffffffffffe000, ffffffffffffe020, f
             dd 13436 [005] 1596.490874:  perf_bpf_probe:_write: (ffffffff812351e0)
             dd 13436 [005] 1596.490876: raw_syscalls:sys_enter: NR 1 (1, 178d000, 200, ffffffffffffe000, ffffffffffffe020, f
             dd 13436 [005] 1596.490876:  perf_bpf_probe:_write: (ffffffff812351e0)
             dd 13436 [005] 1596.490878: raw_syscalls:sys_enter: NR 1 (1, 178d000, 200, ffffffffffffe000, ffffffffffffe020, f
             dd 13436 [005] 1596.490879:  perf_bpf_probe:_write: (ffffffff812351e0)
             dd 13436 [005] 1596.490881: raw_syscalls:sys_enter: NR 1 (1, 178d000, 200, ffffffffffffe000, ffffffffffffe020, f
             dd 13436 [005] 1596.490882:  perf_bpf_probe:_write: (ffffffff812351e0)
             dd 13436 [005] 1596.490900: raw_syscalls:sys_enter: NR 1 (2, 7ffe8246e640, 1f, 40acb8, 7f44bac74700, 7f44baa4fba
             dd 13436 [005] 1596.490901:  perf_bpf_probe:_write: (ffffffff812351e0)
             dd 13436 [005] 1596.490917: raw_syscalls:sys_enter: NR 1 (2, 7ffe8246e640, 1a, fffffffa, 7f44bac74700, 7f44baa4f
             dd 13436 [005] 1596.490918:  perf_bpf_probe:_write: (ffffffff812351e0)
             dd 13436 [005] 1596.490932: raw_syscalls:sys_enter: NR 1 (2, 7ffe8246e640, 1a, fffffff9, 7f44bac74700, 7f44baa4f
             dd 13436 [005] 1596.490933:  perf_bpf_probe:_write: (ffffffff812351e0)
    
    Committer note:
    
    Further testing:
    
      # trace --no-sys --event /home/acme/bpf/tracepoint.c cat /etc/passwd > /dev/null
         0.000 raw_syscalls:sys_enter:NR 1 (1, 7f0490504000, c48, 7f0490503010, ffffffffffffffff, 0))
         0.006 perf_bpf_probe:_write:(ffffffff81241bc0))
      #
    
    Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Zefan Li <lizefan@huawei.com>
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/1468406646-21642-6-git-send-email-wangnan0@huawei.com
    
    
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    b4ee6d41