• Wang Nan's avatar
    perf tools: Enable BPF object configure syntax · a34f3be7
    Wang Nan authored
    This patch adds the final step for BPF map configuration. A new syntax
    is appended into parser so user can config BPF objects through '/' '/'
    enclosed config terms.
    
    After this patch, following syntax is available:
    
      # perf record -e ./test_bpf_map_1.c/map:channel.value=10/ ...
    
    It would takes effect after appling following commits.
    
    Test result:
    
      # cat ./test_bpf_map_1.c
      /************************ BEGIN **************************/
      #include <uapi/linux/bpf.h>
      #define SEC(NAME) __attribute__((section(NAME), used))
      struct bpf_map_def {
          unsigned int type;
          unsigned int key_size;
          unsigned int value_size;
          unsigned int max_entries;
      };
      static void *(*map_lookup_elem)(struct bpf_map_def *, void *) =
          (void *)BPF_FUNC_map_lookup_elem;
      static int (*trace_printk)(const char *fmt, int fmt_size, ...) =
          (void *)BPF_FUNC_trace_printk;
      struct bpf_map_def SEC("maps") channel = {
          .type = BPF_MAP_TYPE_ARRAY,
          .key_size = sizeof(int),
          .value_size = sizeof(int),
          .max_entries = 1,
      };
      SEC("func=sys_nanosleep")
      int func(void *ctx)
      {
          int key = 0;
          char fmt[] = "%d\n";
          int *pval = map_lookup_elem(&channel, &key);
          if (!pval)
              return 0;
          trace_printk(fmt, sizeof(fmt), *pval);
          return 0;
      }
      char _license[] SEC("license") = "GPL";
      int _version SEC("version") = LINUX_VERSION_CODE;
      /************************* END ***************************/
    
     - Normal case:
      # ./perf record -e './test_bpf_map_1.c/map:channel.value=10/' usleep 10
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 0.012 MB perf.data ]
    
     - Error case:
    
      # ./perf record -e './test_bpf_map_1.c/map:channel.value/' usleep 10
      event syntax error: '..ps:channel:value/'
                                       \___ Config value not set (missing '=')
      Hint:	Valid config term:
             map:[<arraymap>]:value=[value]
             (add -v to see detail)
      Run 'perf list' for a list of valid events
    
      Usage: perf record [<options>] [<command>]
         or: perf record [<options>] -- <command> [<options>]
    
         -e, --event <event>   event selector. use 'perf list' to list available events
    
      # ./perf record -e './test_bpf_map_1.c/xmap:channel.value=10/' usleep 10
      event syntax error: '..pf_map_1.c/xmap:channel.value=10/'
                                        \___ Invalid object config option
      [SNIP]
    
      # ./perf record -e './test_bpf_map_1.c/map:xchannel.value=10/' usleep 10
      event syntax error: '..p_1.c/map:xchannel.value=10/'
                                        \___ Target map not exist
      [SNIP]
    
      # ./perf record -e './test_bpf_map_1.c/map:channel.xvalue=10/' usleep 10
      event syntax error: '..ps:channel.xvalue=10/'
                                        \___ Invalid object map config option
      [SNIP]
    
      # ./perf record -e './test_bpf_map_1.c/map:channel.value=x10/' usleep 10
      event syntax error: '..nnel.value=x10/'
                                        \___ Incorrect value type for map
      [SNIP]
    
      Change BPF_MAP_TYPE_ARRAY to '1' in test_bpf_map_1.c:
    
      # ./perf record -e './test_bpf_map_1.c/map:channel.value=10/' usleep 10
      event syntax error: '..ps:channel.value=10/'
                                        \___ Can't use this config term to this type of map
    
      Hint:	Valid config term:
          	map:[<arraymap>].value=[value]
          	(add -v to see detail)
    Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
    [for parser part]
    Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
    Cc: Cody P Schafer <dev@codyps.com>
    Cc: He Kuang <hekuang@huawei.com>
    Cc: Jeremie Galarneau <jeremie.galarneau@efficios.com>
    Cc: Kirill Smelkov <kirr@nexedi.com>
    Cc: Li Zefan <lizefan@huawei.com>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Zefan Li <lizefan@huawei.com>
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/1456132275-98875-5-git-send-email-wangnan0@huawei.comSigned-off-by: default avatarHe Kuang <hekuang@huawei.com>
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    a34f3be7
parse-events.c 52.5 KB