linux/tools/perf/tests
Ian Rogers 70c90e4a6b perf parse-events: Avoid scanning PMUs before parsing
The event parser needs to handle two special cases:
1) legacy events like L1-dcache-load-miss. These event names don't
   appear in JSON or sysfs, and lookup tables are used for the config
   value.
2) raw events where 'r0xead' is the same as 'read' unless the PMU has
   an event called 'read' in which case the event has priority.

The previous parser to handle these cases would scan all PMUs for
components of event names. These components would then be used to
classify in the lexer whether the token should be part of a legacy
event, a raw event or an event. The grammar would handle legacy event
tokens or recombining the tokens back into a regular event name.  The
code wasn't PMU specific and had issues around events like AMD's
branch-brs that would fail to parse as it expects brs to be a suffix
on a legacy event style name:

$ perf stat -e branch-brs true
event syntax error: 'branch-brs'
                           \___ parser error

This change removes processing all PMUs by using the lexer in the form
of a regular expression matcher. The lexer will return the token for
the longest matched sequence of characters, and in the event of a tie
the first. The legacy events are a fixed number of regular
expressions, and by matching these before a name token its possible to
generate an accurate legacy event token with everything else matching
as a name. Because of the lexer change the handling of hyphens in the
grammar can be removed as hyphens just become a part of the name.

To handle raw events and terms the parser is changed to defer trying
to evaluate whether something is a raw event until the PMU is known in
the grammar. Once the PMU is known, the events of the PMU can be
scanned for the 'read' style problem. A new term type is added for
these raw terms, used to enable deferring the evaluation.

While this change is large, it has stats of:
170 insertions(+), 436 deletions(-)
the bulk of the change is deleting the old approach. It isn't possible
to break apart the code added due to the dependencies on how the parts
of the parsing work.

Signed-off-by: Ian Rogers <irogers@google.com>
Tested-by: Kan Liang <kan.liang@linux.intel.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ahmad Yasin <ahmad.yasin@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: Caleb Biggers <caleb.biggers@intel.com>
Cc: Edward Baker <edward.baker@intel.com>
Cc: Florian Fischer <florian.fischer@muhq.space>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: John Garry <john.g.garry@oracle.com>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Kang Minchul <tegongkang@gmail.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Perry Taylor <perry.taylor@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ravi Bangoria <ravi.bangoria@amd.com>
Cc: Rob Herring <robh@kernel.org>
Cc: Samantha Alt <samantha.alt@intel.com>
Cc: Stephane Eranian <eranian@google.com>
Cc: Sumanth Korikkar <sumanthk@linux.ibm.com>
Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
Cc: Thomas Richter <tmricht@linux.ibm.com>
Cc: Tiezhu Yang <yangtiezhu@loongson.cn>
Cc: Weilin Wang <weilin.wang@intel.com>
Cc: Xing Zhengjun <zhengjun.xing@linux.intel.com>
Cc: Yang Jihong <yangjihong1@huawei.com>
Link: https://lore.kernel.org/r/20230502223851.2234828-19-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2023-05-15 09:12:13 -03:00
..
attr perf test: Fix wrong size expectation for 'Setup struct perf_event_attr' 2023-04-04 09:39:55 -03:00
shell perf test: Add stat test for record and script 2023-05-10 14:36:18 -03:00
workloads perf test workload thloop: Make count increments atomic 2023-01-19 13:42:06 -03:00
.gitignore
api-io.c perf tests api-io: Use zfree() to reduce chances of use after free 2023-04-12 10:14:58 -03:00
attr.c
attr.py perf test: Add mechanism for skipping attr tests on kernel versions 2022-12-14 11:24:32 -03:00
backward-ring-buffer.c
bitmap.c perf tools: Use dedicated non-atomic clear/set bit helpers 2022-12-05 09:29:06 -03:00
bp_account.c perf test: Fix variable length array undefined behavior in bp_account 2022-06-19 10:41:43 -03:00
bp_signal_overflow.c
bp_signal.c
bpf-script-example.c perf test: Switch basic bpf filtering test to use syscall tracepoint 2023-01-23 09:58:01 -03:00
bpf-script-test-kbuild.c
bpf-script-test-prologue.c perf tests bpf prologue: Fix bpf-script-test-prologue test compile issue with clang 2023-01-09 11:57:47 -03:00
bpf-script-test-relocation.c
bpf.c perf evlist: Remove nr_groups 2023-03-13 17:42:27 -03:00
Build perf test: Add Symbols test 2023-01-22 18:09:56 -03:00
builtin-test-list.c perf test: Refactor shell tests allowing subdirs 2022-08-13 15:13:20 -03:00
builtin-test-list.h perf test: Refactor shell tests allowing subdirs 2022-08-13 15:13:20 -03:00
builtin-test.c perf test: Simplify for_each_test() to avoid tripping on -Werror=array-bounds 2023-04-14 21:43:39 -03:00
clang.c
code-reading.c perf map: Changes to reference counting 2023-04-06 22:13:43 -03:00
cpumap.c libperf: Add perf_cpu_map__refcnt() interanl accessor to use in the maps test 2023-04-17 15:52:36 -03:00
demangle-java-test.c
demangle-ocaml-test.c
dlfilter-test.c perf tools: Fix usage of the verbose variable 2022-12-20 15:16:33 -03:00
dso-data.c
dwarf-unwind.c perf test: Fix DWARF unwind test by adding non-inline to expected function in a backtrace 2023-01-30 14:54:13 -03:00
event_groups.c perf test: Update event group check for support of uncore event 2022-12-14 11:23:36 -03:00
event_update.c perf events: Prefer union over variable length array 2022-10-04 08:55:21 -03:00
event-times.c perf tools: Do not pass NULL to parse_events() 2022-08-10 14:30:09 -03:00
evsel-roundtrip-name.c perf test: Roundtrip name, don't assume 1 event per name 2023-05-15 09:12:13 -03:00
evsel-tp-sched.c
expand-cgroup.c perf evsel: Introduce evsel__name_is() method to check if the evsel name is equal to a given string 2023-04-24 14:28:11 -03:00
expr.c perf metric: Change divide by zero and !support events behavior 2023-05-10 12:35:02 -03:00
fdarray.c
genelf.c
hists_common.c perf map: Add accessor for dso 2023-04-04 16:41:57 -03:00
hists_common.h
hists_cumulate.c perf map: Changes to reference counting 2023-04-06 22:13:43 -03:00
hists_filter.c perf map: Changes to reference counting 2023-04-06 22:13:43 -03:00
hists_link.c perf map: Add reference count checking 2023-04-19 12:57:53 -03:00
hists_output.c perf map: Changes to reference counting 2023-04-06 22:13:43 -03:00
is_printable_array.c
keep-tracking.c perf tools: Do not pass NULL to parse_events() 2022-08-10 14:30:09 -03:00
kmod-path.c
llvm.c perf: Stop using bpf_object__open_buffer() API 2022-01-24 20:44:09 -08:00
llvm.h
make perf build: Fix unescaped # in perf build-test 2023-05-02 08:36:14 -03:00
maps.c perf map: Add set_ methods for map->{start,end,pgoff,pgoff,reloc,erange_warned,dso,map_ip,unmap_ip,priv} 2023-04-19 12:54:41 -03:00
mem2node.c perf tools: Use dedicated non-atomic clear/set bit helpers 2022-12-05 09:29:06 -03:00
mem.c
mmap-basic.c perf tests: Add missing event.h include 2022-10-31 11:07:08 -03:00
mmap-thread-lookup.c perf map: Changes to reference counting 2023-04-06 22:13:43 -03:00
openat-syscall-all-cpus.c perf tests: Avoid pthread.h inclusion 2022-10-04 08:55:19 -03:00
openat-syscall-tp-fields.c perf tools: Move 'struct perf_sample' to a separate header file to disentangle headers 2022-10-31 11:06:41 -03:00
openat-syscall.c perf thread_map: Reduce exposure of libperf internal API 2022-11-16 12:17:15 -03:00
parse-events.c perf parse-events: Avoid scanning PMUs before parsing 2023-05-15 09:12:13 -03:00
parse-metric.c perf metric: Change divide by zero and !support events behavior 2023-05-10 12:35:02 -03:00
parse-no-sample-id-all.c perf tools: Move 'struct perf_sample' to a separate header file to disentangle headers 2022-10-31 11:06:41 -03:00
pe-file-parsing.c
pe-file.c
pe-file.exe
pe-file.exe.debug
perf-hooks.c
perf-record.c perf tests: Add missing event.h include 2022-10-31 11:07:08 -03:00
perf-targz-src-pkg
perf-time-to-tsc.c perf tools: Move 'struct perf_sample' to a separate header file to disentangle headers 2022-10-31 11:06:41 -03:00
pfm.c perf evlist: Remove nr_groups 2023-03-13 17:42:27 -03:00
pmu-events.c perf parse-events: Avoid scanning PMUs before parsing 2023-05-15 09:12:13 -03:00
pmu.c perf pmu: Use relative path for sysfs scan 2023-04-04 13:23:58 -03:00
python-use.c
sample-parsing.c perf script: Show branch speculation info 2023-02-02 17:18:31 -03:00
sdt.c
sigtrap.c perf test: Skip sigtrap test on old kernels 2022-10-04 08:55:22 -03:00
stat.c
sw-clock.c perf tools: Move 'struct perf_sample' to a separate header file to disentangle headers 2022-10-31 11:06:41 -03:00
switch-tracking.c perf tools: Move 'struct perf_sample' to a separate header file to disentangle headers 2022-10-31 11:06:41 -03:00
symbols.c perf map: Add accessor for dso 2023-04-04 16:41:57 -03:00
task-exit.c
tests.h perf test: Add Symbols test 2023-01-22 18:09:56 -03:00
thread-map.c perf thread_map: Reduce exposure of libperf internal API 2022-11-16 12:17:15 -03:00
thread-maps-share.c perf test: Fix maps use after put 2023-04-20 08:23:52 -03:00
time-utils-test.c
topology.c perf stat: Rename to aggr_cpu_id.thread_idx 2022-10-06 08:03:53 -03:00
unit_number__scnprintf.c
vmlinux-kallsyms.c perf map: Add set_ methods for map->{start,end,pgoff,pgoff,reloc,erange_warned,dso,map_ip,unmap_ip,priv} 2023-04-19 12:54:41 -03:00
wp.c perf test: Skip watchpoint tests if no watchpoints available 2022-11-23 10:32:53 -03:00