[tip:perf/core] perf bpf: Support BPF program attach to tracepoints

2016-07-14 Thread tip-bot for Wang Nan
Commit-ID:  b4ee6d415e731b9d8a51451da0ebe33450c355d2
Gitweb: http://git.kernel.org/tip/b4ee6d415e731b9d8a51451da0ebe33450c355d2
Author: Wang Nan 
AuthorDate: Wed, 13 Jul 2016 10:44:05 +
Committer:  Arnaldo Carvalho de Melo 
CommitDate: Wed, 13 Jul 2016 23:09:04 -0300

perf bpf: Support BPF program attach to tracepoints

To support 98b5c2c65c29 ("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 
  #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, e020, f
 dd 13436 [005] 1596.490871:  perf_bpf_probe:_write: (812351e0)
 dd 13436 [005] 1596.490873: raw_syscalls:sys_enter: NR 1 (1, 178d000, 
200, e000, e020, f
 dd 13436 [005] 1596.490874:  perf_bpf_probe:_write: (812351e0)
 dd 13436 [005] 1596.490876: raw_syscalls:sys_enter: NR 1 (1, 178d000, 
200, e000, e020, f
 dd 13436 [005] 1596.490876:  perf_bpf_probe:_write: (812351e0)
 dd 13436 [005] 1596.490878: raw_syscalls:sys_enter: NR 1 (1, 178d000, 
200, e000, e020, f
 dd 13436 [005] 1596.490879:  perf_bpf_probe:_write: (812351e0)
 dd 13436 [005] 1596.490881: raw_syscalls:sys_enter: NR 1 (1, 178d000, 
200, e000, e020, f
 dd 13436 [005] 1596.490882:  perf_bpf_probe:_write: (812351e0)
 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: (812351e0)
 dd 13436 [005] 1596.490917: raw_syscalls:sys_enter: NR 1 (2, 
7ffe8246e640, 1a, fffa, 7f44bac74700, 7f44baa4f
 dd 13436 [005] 1596.490918:  perf_bpf_probe:_write: (812351e0)
 dd 13436 [005] 1596.490932: raw_syscalls:sys_enter: NR 1 (2, 
7ffe8246e640, 1a, fff9, 7f44bac74700, 7f44baa4f
 dd 13436 [005] 1596.490933:  perf_bpf_probe:_write: (812351e0)

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, 
, 0))
 0.006 perf_bpf_probe:_write:(81241bc0))
  #

Signed-off-by: Wang Nan 
Tested-by: Arnaldo Carvalho de Melo 
Cc: Alexei Starovoitov 
Cc: Jiri Olsa 
Cc: Zefan Li 
Cc: pi3or...@163.com
Link: 
http://lkml.kernel.org/r/1468406646-21642-6-git-send-email-wangn...@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo 
---
 tools/perf/util/bpf-loader.c | 65 
 1 file changed, 60 insertions(+), 5 deletions(-)

diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c
index f227014..1f12e4e 100644
--- a/tools/perf/util/bpf-loader.c
+++ b/tools/perf/util/bpf-loader.c
@@ -37,6 +37,9 @@ DEFINE_PRINT_FN(info, 1)
 DEFINE_PRINT_FN(debug, 1)
 
 struct bpf_prog_priv {
+   bool is_tp;
+   char *sys_name;
+   char *evt_name;
struct perf_probe_event pev;
bool need_prologue;
struct bpf_insn *insns_buf;
@@ -118,6 +121,8 @@ clear_prog_priv(struct bpf_program *prog __maybe_unused,
cleanup_perf_probe_events(>pev, 1);
zfree(>insns_buf);
zfree(>type_mapping);
+   zfree(>sys_name);
+   zfree(>evt_name);
free(priv);
 }
 
@@ -269,7 +274,8 @@ nextline:
 }
 
 static int
-parse_prog_config(const char *config_str, struct perf_probe_event *pev)
+parse_prog_config(const char *config_str, const char **p_main_str,
+ bool *is_tp, struct perf_probe_event *pev)
 {
int err;
const char *main_str = parse_prog_config_kvpair(config_str, pev);
@@ -277,6 +283,22 @@ 

[tip:perf/core] perf bpf: Support BPF program attach to tracepoints

2016-07-14 Thread tip-bot for Wang Nan
Commit-ID:  b4ee6d415e731b9d8a51451da0ebe33450c355d2
Gitweb: http://git.kernel.org/tip/b4ee6d415e731b9d8a51451da0ebe33450c355d2
Author: Wang Nan 
AuthorDate: Wed, 13 Jul 2016 10:44:05 +
Committer:  Arnaldo Carvalho de Melo 
CommitDate: Wed, 13 Jul 2016 23:09:04 -0300

perf bpf: Support BPF program attach to tracepoints

To support 98b5c2c65c29 ("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 
  #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, e020, f
 dd 13436 [005] 1596.490871:  perf_bpf_probe:_write: (812351e0)
 dd 13436 [005] 1596.490873: raw_syscalls:sys_enter: NR 1 (1, 178d000, 
200, e000, e020, f
 dd 13436 [005] 1596.490874:  perf_bpf_probe:_write: (812351e0)
 dd 13436 [005] 1596.490876: raw_syscalls:sys_enter: NR 1 (1, 178d000, 
200, e000, e020, f
 dd 13436 [005] 1596.490876:  perf_bpf_probe:_write: (812351e0)
 dd 13436 [005] 1596.490878: raw_syscalls:sys_enter: NR 1 (1, 178d000, 
200, e000, e020, f
 dd 13436 [005] 1596.490879:  perf_bpf_probe:_write: (812351e0)
 dd 13436 [005] 1596.490881: raw_syscalls:sys_enter: NR 1 (1, 178d000, 
200, e000, e020, f
 dd 13436 [005] 1596.490882:  perf_bpf_probe:_write: (812351e0)
 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: (812351e0)
 dd 13436 [005] 1596.490917: raw_syscalls:sys_enter: NR 1 (2, 
7ffe8246e640, 1a, fffa, 7f44bac74700, 7f44baa4f
 dd 13436 [005] 1596.490918:  perf_bpf_probe:_write: (812351e0)
 dd 13436 [005] 1596.490932: raw_syscalls:sys_enter: NR 1 (2, 
7ffe8246e640, 1a, fff9, 7f44bac74700, 7f44baa4f
 dd 13436 [005] 1596.490933:  perf_bpf_probe:_write: (812351e0)

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, 
, 0))
 0.006 perf_bpf_probe:_write:(81241bc0))
  #

Signed-off-by: Wang Nan 
Tested-by: Arnaldo Carvalho de Melo 
Cc: Alexei Starovoitov 
Cc: Jiri Olsa 
Cc: Zefan Li 
Cc: pi3or...@163.com
Link: 
http://lkml.kernel.org/r/1468406646-21642-6-git-send-email-wangn...@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo 
---
 tools/perf/util/bpf-loader.c | 65 
 1 file changed, 60 insertions(+), 5 deletions(-)

diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c
index f227014..1f12e4e 100644
--- a/tools/perf/util/bpf-loader.c
+++ b/tools/perf/util/bpf-loader.c
@@ -37,6 +37,9 @@ DEFINE_PRINT_FN(info, 1)
 DEFINE_PRINT_FN(debug, 1)
 
 struct bpf_prog_priv {
+   bool is_tp;
+   char *sys_name;
+   char *evt_name;
struct perf_probe_event pev;
bool need_prologue;
struct bpf_insn *insns_buf;
@@ -118,6 +121,8 @@ clear_prog_priv(struct bpf_program *prog __maybe_unused,
cleanup_perf_probe_events(>pev, 1);
zfree(>insns_buf);
zfree(>type_mapping);
+   zfree(>sys_name);
+   zfree(>evt_name);
free(priv);
 }
 
@@ -269,7 +274,8 @@ nextline:
 }
 
 static int
-parse_prog_config(const char *config_str, struct perf_probe_event *pev)
+parse_prog_config(const char *config_str, const char **p_main_str,
+ bool *is_tp, struct perf_probe_event *pev)
 {
int err;
const char *main_str = parse_prog_config_kvpair(config_str, pev);
@@ -277,6 +283,22 @@ parse_prog_config(const char *config_str, struct 
perf_probe_event *pev)
if (IS_ERR(main_str))
return PTR_ERR(main_str);
 
+