• K
    perf evsel: Only fall back group read for leader · 121f325f
    Kan Liang 提交于
    Perf doesn't support mixed events from different PMUs (except software
    event) in a group. The perf stat should output <not counted>/<not
    supported> for all events, but it doesn't. For example,
    
      perf stat -e '{cycles,uncore_imc_5/umask=0xF,event=0x4/,instructions}'
           <not counted>      cycles
           <not supported>    uncore_imc_5/umask=0xF,event=0x4/
               1,024,300      instructions
    
    If perf fails to open an event, it doesn't error out directly. It will
    disable some features and retry, until the event is opened or all
    features are disabled. The disabled features will not be re-enabled. The
    group read is one of these features.
    
    For the example as above, the IMC event and the leader event "cycles"
    are from different PMUs. Opening the IMC event must fail. The group read
    feature must be disabled for IMC event and the followed event
    "instructions". The "instructions" event has the same PMU as the leader
    "cycles". It can be opened successfully. Since the group read feature
    has been disabled, the "instructions" event will be read as a single
    event, which definitely has a value.
    
    The group read fallback is still useful for the case which kernel
    doesn't support group read. It is good enough to be handled only by the
    leader.
    
    For the fallback request from members, it must be caused by an error.
    The fallback only breaks the semantics of group.  Limit the group read
    fallback only for the leader.
    
    Committer testing:
    
    On a broadwell t450s notebook:
    
    Before:
    
      # perf stat -e '{cycles,unc_cbo_cache_lookup.read_i,instructions}' sleep 1
    
      Performance counter stats for 'sleep 1':
    
         <not counted>      cycles
       <not supported>      unc_cbo_cache_lookup.read_i
               818,206      instructions
    
           1.003170887 seconds time elapsed
    
      Some events weren't counted. Try disabling the NMI watchdog:
    	echo 0 > /proc/sys/kernel/nmi_watchdog
    	perf stat ...
    	echo 1 > /proc/sys/kernel/nmi_watchdog
    
    After:
    
      # perf stat -e '{cycles,unc_cbo_cache_lookup.read_i,instructions}' sleep 1
    
      Performance counter stats for 'sleep 1':
    
         <not counted>      cycles
       <not supported>      unc_cbo_cache_lookup.read_i
         <not counted>      instructions
    
           1.001380511 seconds time elapsed
    
      Some events weren't counted. Try disabling the NMI watchdog:
    	echo 0 > /proc/sys/kernel/nmi_watchdog
    	perf stat ...
    	echo 1 > /proc/sys/kernel/nmi_watchdog
      #
    Reported-by: NAndi Kleen <ak@linux.intel.com>
    Signed-off-by: NKan Liang <kan.liang@linux.intel.com>
    Tested-by: NArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Agustin Vega-Frias <agustinv@codeaurora.org>
    Cc: Ganapatrao Kulkarni <ganapatrao.kulkarni@cavium.com>
    Cc: Jin Yao <yao.jin@linux.intel.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Shaokun Zhang <zhangshaokun@hisilicon.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Fixes:  82bf311e ("perf stat: Use group read for event groups")
    Link: http://lkml.kernel.org/r/1524594014-79243-3-git-send-email-kan.liang@linux.intel.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
    121f325f
evsel.c 71.2 KB