• Ian Rogers's avatar
    perf metric: Encode and use metric-id as qualifier · ec5c5b3d
    Ian Rogers authored
    For a metric like IPC a group of events like {instructions,cycles}:W
    would be formed.
    
    If the events names were changed in parsing then the metric expression
    parser would fail to find them.
    
    This change makes the event encoding be something like:
    
      {instructions/metric-id=instructions/, cycles/metric-id=cycles/}
    
    and then uses the evsel's stable metric-id value to locate the events.
    
    This fixes the case that an event is restricted to user because of the
    paranoia setting:
    
      $ echo 2 > /proc/sys/kernel/perf_event_paranoid
      $ perf stat -M IPC /bin/true
       Performance counter stats for '/bin/true':
    
                 150,298      inst_retired.any:u        #      0.77 IPC
                 187,095      cpu_clk_unhalted.thread:u
    
             0.002042731 seconds time elapsed
    
             0.000000000 seconds user
             0.002377000 seconds sys
    
    Adding the metric-id as a qualifier has a complication in that
    qualifiers will become embedded in qualifiers.
    
    For example, msr/tsc/ could become msr/tsc,metric-id=msr/tsc// which
    will fail parse-events.
    
    To solve this problem the metric is encoded and decoded for the
    metric-id with !<num> standing in for an encoded value.
    
    Previously ! wasn't parsed.
    
    With this msr/tsc/ becomes msr/tsc,metric-id=msr!3tsc!3/
    
    The metric expression parser is changed so that @ isn't changed to /,
    instead this is done when the ID is encoded for parse events.
    
    metricgroup__add_metric_non_group() and metricgroup__add_metric_weak_group()
    need to inject the metric-id qualifier, so to avoid repetition they are
    merged into a single metricgroup__build_event_string with error codes
    more rigorously checked.
    
    stat-shadow's prepare_metric() uses the metric-id to match the metricgroup
    code.
    
    As "metric-id=..." is added to all events, it is adding during testing
    with the fake PMU.
    
    This complicates pmu_str_check code as PE_PMU_EVENT_FAKE won't match as
    part of a configuration.
    
    The testing fake PMU case is fixed so that if a known qualifier with an
    ! is parsed then it isn't reported as a fake PMU.
    
    This is sufficient to pass all testing but it and the original mechanism
    are somewhat brittle.
    Signed-off-by: default avatarIan Rogers <irogers@google.com>
    Acked-by: default avatarAndi Kleen <ak@linux.intel.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Alexander Antonov <alexander.antonov@linux.intel.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Andrew Kilroy <andrew.kilroy@arm.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Changbin Du <changbin.du@intel.com>
    Cc: Denys Zagorui <dzagorui@cisco.com>
    Cc: Fabian Hemmer <copy@copy.sh>
    Cc: Felix Fietkau <nbd@nbd.name>
    Cc: Heiko Carstens <hca@linux.ibm.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jacob Keller <jacob.e.keller@intel.com>
    Cc: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
    Cc: Jin Yao <yao.jin@linux.intel.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Joakim Zhang <qiangqing.zhang@nxp.com>
    Cc: John Garry <john.garry@huawei.com>
    Cc: Kajol Jain <kjain@linux.ibm.com>
    Cc: Kan Liang <kan.liang@linux.intel.com>
    Cc: Kees Kook <keescook@chromium.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Nicholas Fraser <nfraser@codeweavers.com>
    Cc: Nick Desaulniers <ndesaulniers@google.com>
    Cc: Paul Clarke <pc@us.ibm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Riccardo Mancini <rickyman7@gmail.com>
    Cc: Sami Tolvanen <samitolvanen@google.com>
    Cc: ShihCheng Tu <mrtoastcheng@gmail.com>
    Cc: Song Liu <songliubraving@fb.com>
    Cc: Stephane Eranian <eranian@google.com>
    Cc: Sumanth Korikkar <sumanthk@linux.ibm.com>
    Cc: Thomas Richter <tmricht@linux.ibm.com>
    Cc: Wan Jiabing <wanjiabing@vivo.com>
    Cc: Zhen Lei <thunder.leizhen@huawei.com>
    Link: https://lore.kernel.org/r/20211015172132.1162559-17-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    ec5c5b3d
stat-shadow.c 37.2 KB