Skip to content
  • Jiri Olsa's avatar
    perf tools: Fix eBPF event specification parsing · a271bfaf
    Jiri Olsa authored
    Looks like I've reached the new level of stupidity, adding missing braces.
    
    Committer testing:
    
    Given the following eBPF C filter, that will add a record when it
    returns true, i.e. when the tv_nsec variable is > 2000ns, should be
    built and installed via sys_bpf(), but fails to do so before this patch:
    
      # cat filter.c
      #include <uapi/linux/bpf.h>
      #define SEC(NAME) __attribute__((section(NAME), used))
    
      SEC("func=hrtimer_nanosleep rqtp->tv_nsec")
      int func(void *ctx, int err, long nsec)
      {
    	  return nsec > 1000;
      }
      char _license[] SEC("license") = "GPL";
      int _version SEC("version") = LINUX_VERSION_CODE;
      #
    
      # perf trace -e nanosleep,filter.c usleep 1
      invalid or unsupported event: 'filter.c'
      Run 'perf list' for a list of valid events
    
       Usage: perf trace [<options>] [<command>]
          or: perf trace [<options>] -- <command> [<options>]
          or: perf trace record [<options>] [<command>]
          or: perf trace record [<options>] -- <command> [<options>]
    
          -e, --event <event>   event/syscall selector. use 'perf list' to list available events
      #
    
    And works again after it is applied, the nothing is inserted when the co
    
      # perf trace -e *sleep,filter.c usleep 1
         0.000 ( 0.066 ms): usleep/23994 nanosleep(rqtp: 0x7ffead94a0d0) = 0
      # perf trace -e *sleep,filter.c usleep 2
         0.000 ( 0.008 ms): usleep/24378 nanosleep(rqtp: 0x7fffa021ba50) ...
         0.008 (         ): perf_bpf_probe:func:(ffffffffb410cb30) tv_nsec=2000)
         0.000 ( 0.066 ms): usleep/24378  ... [continued]: nanosleep()) = 0
      #
    
    The intent of 9445464b
    
     is kept:
    
      # perf stat -e 'cpu/uops_executed.core,krava/'  true
      event syntax error: '..cuted.core,krava/'
                                        \___ unknown term
    
      valid terms: cmask,pc,event,edge,in_tx,any,ldlat,inv,umask,in_tx_cp,offcore_rsp,config,config1,config2,name,period
      Run 'perf list' for a list of valid events
    
       Usage: perf stat [<options>] [<command>]
    
          -e, --event <event>   event selector. use 'perf list' to list available events
      #
      # perf stat -e 'cpu/uops_executed.core,period=1/'  true
    
       Performance counter stats for 'true':
    
               808,332      cpu/uops_executed.core,period=1/
    
           0.002997237 seconds time elapsed
    
      #
    
    Reported-by: default avatarArnaldo Carvalho de Melo <acme@kernel.org>
    Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
    Cc: Andi Kleen <andi@firstfloor.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Fixes: 9445464b ("perf tools: Unwind properly location after REJECT")
    Link: http://lkml.kernel.org/n/tip-diea0ihbwpxfw6938huv3whj@git.kernel.org
    
    
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    a271bfaf