linux-perf-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC 00/59] libperf: Move in event parse code
@ 2021-11-08 13:36 Jiri Olsa
  2021-11-08 13:36 ` [PATCH 01/59] libperf: Move pmu-events.h file to libperf Jiri Olsa
                   ` (58 more replies)
  0 siblings, 59 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: John Garry, Jin Yao, Andi Kleen, Peter Zijlstra, Ingo Molnar,
	Mark Rutland, Alexander Shishkin, Michael Petlan,
	Stephane Eranian, Namhyung Kim, Ian Rogers, linux-perf-users

hi,
this *RFC* patchset moves event parser code to libperf.

It keeps the current perf functionality intact (hopefully)
and adds new libperf_parse_events API to libperf that
provides events parsing.

At the moment libperf_parse_events function supports only
breakpoint events, so it can be used to do things like:
(see the new libperf test)

  evlist = perf_evlist__new();
  err = libperf_parse_events(evlist, "mem:0:rw");


The other pmus parsing code directly depends on parsing
code, so now when the parser is in the libperf, it will
be easier to add the rest of pmus support.

I'm curious on any early feedback because it's big change.
My primary target is using this interface for bpftool prog
profile to allow using all the perf events there.

Also available in here:
  git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
  libperf/parse


I'm Cc-ing most of the folks just on the cover email,
because it's a lot of changes and most people won't be
interested ;-)

Please check the linux-perf-users mailing list or the git
branch above for all the changes.

thanks,
jirka


Cc: John Garry <john.garry@huawei.com>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Stephane Eranian <eranian@google.com>
---
Jiri Olsa (59):
      libperf: Move pmu-events.h file to libperf
      libperf: Move pmu-events framework to libperf
      libperf: Move pmu-events build to libperf
      libperf: Move perf_pmu__format_parse to libperf
      tools api fs: Move in the fncache from perf
      libperf: Move in the pmu hybrid support
      libperf: Move name to perf_evsel
      libperf: Move auto_merge_stats to perf_evsel
      libperf: Move config_terms to perf_evsel
      libperf: Move metric_id to perf_evsel
      libperf: Move tool_event to perf_evsel
      libperf: Move unit to perf_evsel
      libperf: Move exclude_GH to perf_evsel
      libperf: Move sample_read to perf_evsel
      libperf: Move precise_max to perf_evsel
      libperf: Move weak_group to perf_evsel
      libperf: Move bpf_counter to perf_evsel
      libperf: Move group_name to perf_evsel
      perf tools: Fix parse_events_term__num call
      perf tools: Pass parse_state all the way down to __add_event
      perf tools: Pass parse_state all the way down to add_tracepoint
      perf tools: Add evsel__new callback to parse_state_ops
      perf tools: Add evsel__new_tp callback to parse_state_ops
      perf tools: Add loc_term and loc_val helpers to parse_events_term__str
      perf tools: Add loc_term and loc_val helpers to parse_events_term__num
      libperf: Move in the event_symbols_hw/event_symbols_sw
      libperf: Move in struct parse_events_term code
      perf tools: Add perf_evsel__add_event function
      perf tools: Change struct parse_events_state::evlist to perf_evlist
      libperf: Move in struct parse_events_state
      perf tools: Move event_attr_init in evsel__new_idx function
      libperf: Move in perf_pmu__warn_invalid_config function
      libperf: Move in perf_evsel__add_event function
      perf tools: Move parse_events_update_lists to parser unit
      libperf: Add perf_evsel__is_group_leader function
      perf tools: Make parse_events__modifier_event work over perf_evsel
      perf tool: Pass perf_guest in struct parse_events_state
      libperf: Move in parse_events__modifier_group/event functions
      libperf: Move in parse_events__handle_error function
      libperf: Move in parse_events_evlist_error function
      perf tools: Add perf_evsel__delete callback to struct parse_events_ops
      libperf: Move in parse_events_name function
      perf tools: Move out parse_events_add_pmu fallback from parser code
      perf tools: Add add_pmu callback to struct parse_events_ops
      perf tools: Add add_pmu_multi callback to struct parse_events_ops
      perf tools: Add add_numeric callback to struct parse_events_ops
      perf tools: Add add_cache callback to struct parse_events_ops
      perf tools: Add add_breakpoint callback to struct parse_events_ops
      perf tools: Add add_tracepoint callback to struct parse_events_ops
      perf tools: Add add_bpf callback to struct parse_events_ops
      perf tools: Add add_tool callback to struct parse_events_ops
      perf tools: Add set_leader callback to struct parse_events_ops
      perf tools: Add parse_check callback to struct parse_events_ops
      perf tools: Move PE_* enums in parse_events__scanner
      libperf: Move in parse-events flex/bison parser
      libperf: Move in parse_events_add_breakpoint function
      libperf: Move in some lib objects from perf
      libperf: Add libperf_parse_events function
      libperf: Add parse-events test

 tools/lib/api/fs/Build                             |   1 +
 tools/{perf/util => lib/api/fs}/fncache.c          |   4 +-
 tools/lib/api/fs/fs.h                              |   2 +
 tools/lib/perf/Build                               |  79 ++
 tools/lib/perf/Makefile                            |  40 +-
 tools/lib/perf/include/internal/evsel.h            |  30 +
 tools/lib/perf/include/internal/parse-events.h     | 203 +++++
 .../perf/include/internal}/pmu-hybrid.h            |   2 +-
 tools/lib/perf/include/internal/pmu.h              |  59 ++
 tools/lib/perf/include/perf/evlist.h               |   2 +
 .../perf/include/perf}/pmu-events.h                |   0
 tools/lib/perf/libperf.map                         |   1 +
 tools/lib/perf/parse-events.c                      | 875 +++++++++++++++++++
 tools/{perf/util => lib/perf}/parse-events.l       |  16 +-
 tools/{perf/util => lib/perf}/parse-events.y       | 197 +++--
 tools/{ => lib}/perf/pmu-events/Build              |   2 +-
 tools/{ => lib}/perf/pmu-events/README             |   0
 .../pmu-events/arch/arm64/ampere/emag/branch.json  |   0
 .../pmu-events/arch/arm64/ampere/emag/bus.json     |   0
 .../pmu-events/arch/arm64/ampere/emag/cache.json   |   0
 .../pmu-events/arch/arm64/ampere/emag/clock.json   |   0
 .../arch/arm64/ampere/emag/exception.json          |   0
 .../arch/arm64/ampere/emag/instruction.json        |   0
 .../arch/arm64/ampere/emag/intrinsic.json          |   0
 .../pmu-events/arch/arm64/ampere/emag/memory.json  |   0
 .../arch/arm64/ampere/emag/pipeline.json           |   0
 .../arch/arm64/arm/cortex-a53/branch.json          |   0
 .../pmu-events/arch/arm64/arm/cortex-a53/bus.json  |   0
 .../arch/arm64/arm/cortex-a53/cache.json           |   0
 .../arch/arm64/arm/cortex-a53/memory.json          |   0
 .../arch/arm64/arm/cortex-a53/other.json           |   0
 .../arch/arm64/arm/cortex-a53/pipeline.json        |   0
 .../arm64/arm/cortex-a57-a72/core-imp-def.json     |   0
 .../arch/arm64/arm/cortex-a76-n1/branch.json       |   0
 .../arch/arm64/arm/cortex-a76-n1/bus.json          |   0
 .../arch/arm64/arm/cortex-a76-n1/cache.json        |   0
 .../arch/arm64/arm/cortex-a76-n1/exception.json    |   0
 .../arch/arm64/arm/cortex-a76-n1/instruction.json  |   0
 .../arch/arm64/arm/cortex-a76-n1/memory.json       |   0
 .../arch/arm64/arm/cortex-a76-n1/other.json        |   0
 .../arch/arm64/arm/cortex-a76-n1/pipeline.json     |   0
 .../arch/arm64/arm/neoverse-v1/branch.json         |   0
 .../pmu-events/arch/arm64/arm/neoverse-v1/bus.json |   0
 .../arch/arm64/arm/neoverse-v1/cache.json          |   0
 .../arch/arm64/arm/neoverse-v1/exception.json      |   0
 .../arch/arm64/arm/neoverse-v1/instruction.json    |   0
 .../arch/arm64/arm/neoverse-v1/memory.json         |   0
 .../arch/arm64/arm/neoverse-v1/other.json          |   0
 .../arch/arm64/arm/neoverse-v1/pipeline.json       |   0
 .../arch/arm64/armv8-common-and-microarch.json     |   0
 .../pmu-events/arch/arm64/armv8-recommended.json   |   0
 .../arch/arm64/cavium/thunderx2/core-imp-def.json  |   0
 .../arch/arm64/freescale/imx8mm/sys/ddrc.json      |   0
 .../arch/arm64/freescale/imx8mm/sys/metrics.json   |   0
 .../arch/arm64/freescale/imx8mn/sys/ddrc.json      |   0
 .../arch/arm64/freescale/imx8mn/sys/metrics.json   |   0
 .../arch/arm64/freescale/imx8mp/sys/ddrc.json      |   0
 .../arch/arm64/freescale/imx8mp/sys/metrics.json   |   0
 .../arch/arm64/freescale/imx8mq/sys/ddrc.json      |   0
 .../arch/arm64/freescale/imx8mq/sys/metrics.json   |   0
 .../arch/arm64/fujitsu/a64fx/branch.json           |   0
 .../pmu-events/arch/arm64/fujitsu/a64fx/bus.json   |   0
 .../pmu-events/arch/arm64/fujitsu/a64fx/cache.json |   0
 .../pmu-events/arch/arm64/fujitsu/a64fx/cycle.json |   0
 .../arch/arm64/fujitsu/a64fx/exception.json        |   0
 .../arch/arm64/fujitsu/a64fx/instruction.json      |   0
 .../arch/arm64/fujitsu/a64fx/memory.json           |   0
 .../pmu-events/arch/arm64/fujitsu/a64fx/other.json |   0
 .../arch/arm64/fujitsu/a64fx/pipeline.json         |   0
 .../pmu-events/arch/arm64/fujitsu/a64fx/sve.json   |   0
 .../arch/arm64/hisilicon/hip08/core-imp-def.json   |   0
 .../arch/arm64/hisilicon/hip08/metrics.json        |   0
 .../arch/arm64/hisilicon/hip08/uncore-ddrc.json    |   0
 .../arch/arm64/hisilicon/hip08/uncore-hha.json     |   0
 .../arch/arm64/hisilicon/hip08/uncore-l3c.json     |   0
 .../perf/pmu-events/arch/arm64/mapfile.csv         |   0
 .../perf/pmu-events/arch/nds32/mapfile.csv         |   0
 .../perf/pmu-events/arch/nds32/n13/atcpmu.json     |   0
 .../perf/pmu-events/arch/powerpc/mapfile.csv       |   0
 .../pmu-events/arch/powerpc/power10/cache.json     |   0
 .../arch/powerpc/power10/floating_point.json       |   0
 .../pmu-events/arch/powerpc/power10/frontend.json  |   0
 .../pmu-events/arch/powerpc/power10/locks.json     |   0
 .../pmu-events/arch/powerpc/power10/marked.json    |   0
 .../pmu-events/arch/powerpc/power10/memory.json    |   0
 .../arch/powerpc/power10/nest_metrics.json         |   0
 .../pmu-events/arch/powerpc/power10/others.json    |   0
 .../pmu-events/arch/powerpc/power10/pipeline.json  |   0
 .../perf/pmu-events/arch/powerpc/power10/pmc.json  |   0
 .../arch/powerpc/power10/translation.json          |   0
 .../perf/pmu-events/arch/powerpc/power8/cache.json |   0
 .../arch/powerpc/power8/floating-point.json        |   0
 .../pmu-events/arch/powerpc/power8/frontend.json   |   0
 .../pmu-events/arch/powerpc/power8/marked.json     |   0
 .../pmu-events/arch/powerpc/power8/memory.json     |   0
 .../pmu-events/arch/powerpc/power8/metrics.json    |   0
 .../perf/pmu-events/arch/powerpc/power8/other.json |   0
 .../pmu-events/arch/powerpc/power8/pipeline.json   |   0
 .../perf/pmu-events/arch/powerpc/power8/pmc.json   |   0
 .../arch/powerpc/power8/translation.json           |   0
 .../perf/pmu-events/arch/powerpc/power9/cache.json |   0
 .../arch/powerpc/power9/floating-point.json        |   0
 .../pmu-events/arch/powerpc/power9/frontend.json   |   0
 .../pmu-events/arch/powerpc/power9/marked.json     |   0
 .../pmu-events/arch/powerpc/power9/memory.json     |   0
 .../pmu-events/arch/powerpc/power9/metrics.json    |   0
 .../arch/powerpc/power9/nest_metrics.json          |   0
 .../perf/pmu-events/arch/powerpc/power9/other.json |   0
 .../pmu-events/arch/powerpc/power9/pipeline.json   |   0
 .../perf/pmu-events/arch/powerpc/power9/pmc.json   |   0
 .../arch/powerpc/power9/translation.json           |   0
 .../perf/pmu-events/arch/s390/cf_z10/basic.json    |   0
 .../perf/pmu-events/arch/s390/cf_z10/crypto.json   |   0
 .../perf/pmu-events/arch/s390/cf_z10/extended.json |   0
 .../perf/pmu-events/arch/s390/cf_z13/basic.json    |   0
 .../perf/pmu-events/arch/s390/cf_z13/crypto.json   |   0
 .../perf/pmu-events/arch/s390/cf_z13/extended.json |   0
 .../pmu-events/arch/s390/cf_z13/transaction.json   |   0
 .../perf/pmu-events/arch/s390/cf_z14/basic.json    |   0
 .../perf/pmu-events/arch/s390/cf_z14/crypto.json   |   0
 .../perf/pmu-events/arch/s390/cf_z14/extended.json |   0
 .../pmu-events/arch/s390/cf_z14/transaction.json   |   0
 .../perf/pmu-events/arch/s390/cf_z15/basic.json    |   0
 .../perf/pmu-events/arch/s390/cf_z15/crypto.json   |   0
 .../perf/pmu-events/arch/s390/cf_z15/crypto6.json  |   0
 .../perf/pmu-events/arch/s390/cf_z15/extended.json |   0
 .../pmu-events/arch/s390/cf_z15/transaction.json   |   0
 .../perf/pmu-events/arch/s390/cf_z196/basic.json   |   0
 .../perf/pmu-events/arch/s390/cf_z196/crypto.json  |   0
 .../pmu-events/arch/s390/cf_z196/extended.json     |   0
 .../perf/pmu-events/arch/s390/cf_zec12/basic.json  |   0
 .../perf/pmu-events/arch/s390/cf_zec12/crypto.json |   0
 .../pmu-events/arch/s390/cf_zec12/extended.json    |   0
 .../pmu-events/arch/s390/cf_zec12/transaction.json |   0
 .../perf/pmu-events/arch/s390/mapfile.csv          |   0
 .../perf/pmu-events/arch/test/arch-std-events.json |   0
 .../pmu-events/arch/test/test_soc/cpu/branch.json  |   0
 .../pmu-events/arch/test/test_soc/cpu/cache.json   |   0
 .../pmu-events/arch/test/test_soc/cpu/other.json   |   0
 .../pmu-events/arch/test/test_soc/cpu/uncore.json  |   0
 .../pmu-events/arch/test/test_soc/sys/uncore.json  |   0
 .../perf/pmu-events/arch/x86/amdzen1/branch.json   |   0
 .../perf/pmu-events/arch/x86/amdzen1/cache.json    |   0
 .../perf/pmu-events/arch/x86/amdzen1/core.json     |   0
 .../pmu-events/arch/x86/amdzen1/data-fabric.json   |   0
 .../arch/x86/amdzen1/floating-point.json           |   0
 .../perf/pmu-events/arch/x86/amdzen1/memory.json   |   0
 .../perf/pmu-events/arch/x86/amdzen1/other.json    |   0
 .../pmu-events/arch/x86/amdzen1/recommended.json   |   0
 .../perf/pmu-events/arch/x86/amdzen2/branch.json   |   0
 .../perf/pmu-events/arch/x86/amdzen2/cache.json    |   0
 .../perf/pmu-events/arch/x86/amdzen2/core.json     |   0
 .../pmu-events/arch/x86/amdzen2/data-fabric.json   |   0
 .../arch/x86/amdzen2/floating-point.json           |   0
 .../perf/pmu-events/arch/x86/amdzen2/memory.json   |   0
 .../perf/pmu-events/arch/x86/amdzen2/other.json    |   0
 .../pmu-events/arch/x86/amdzen2/recommended.json   |   0
 .../perf/pmu-events/arch/x86/amdzen3/branch.json   |   0
 .../perf/pmu-events/arch/x86/amdzen3/cache.json    |   0
 .../perf/pmu-events/arch/x86/amdzen3/core.json     |   0
 .../pmu-events/arch/x86/amdzen3/data-fabric.json   |   0
 .../arch/x86/amdzen3/floating-point.json           |   0
 .../perf/pmu-events/arch/x86/amdzen3/memory.json   |   0
 .../perf/pmu-events/arch/x86/amdzen3/other.json    |   0
 .../pmu-events/arch/x86/amdzen3/recommended.json   |   0
 .../perf/pmu-events/arch/x86/bonnell/cache.json    |   0
 .../arch/x86/bonnell/floating-point.json           |   0
 .../perf/pmu-events/arch/x86/bonnell/frontend.json |   0
 .../perf/pmu-events/arch/x86/bonnell/memory.json   |   0
 .../perf/pmu-events/arch/x86/bonnell/other.json    |   0
 .../perf/pmu-events/arch/x86/bonnell/pipeline.json |   0
 .../arch/x86/bonnell/virtual-memory.json           |   0
 .../pmu-events/arch/x86/broadwell/bdw-metrics.json |   0
 .../perf/pmu-events/arch/x86/broadwell/cache.json  |   0
 .../arch/x86/broadwell/floating-point.json         |   0
 .../pmu-events/arch/x86/broadwell/frontend.json    |   0
 .../perf/pmu-events/arch/x86/broadwell/memory.json |   0
 .../perf/pmu-events/arch/x86/broadwell/other.json  |   0
 .../pmu-events/arch/x86/broadwell/pipeline.json    |   0
 .../perf/pmu-events/arch/x86/broadwell/uncore.json |   0
 .../arch/x86/broadwell/virtual-memory.json         |   0
 .../arch/x86/broadwellde/bdwde-metrics.json        |   0
 .../pmu-events/arch/x86/broadwellde/cache.json     |   0
 .../arch/x86/broadwellde/floating-point.json       |   0
 .../pmu-events/arch/x86/broadwellde/frontend.json  |   0
 .../pmu-events/arch/x86/broadwellde/memory.json    |   0
 .../pmu-events/arch/x86/broadwellde/other.json     |   0
 .../pmu-events/arch/x86/broadwellde/pipeline.json  |   0
 .../arch/x86/broadwellde/uncore-cache.json         |   0
 .../arch/x86/broadwellde/uncore-memory.json        |   0
 .../arch/x86/broadwellde/uncore-power.json         |   0
 .../arch/x86/broadwellde/virtual-memory.json       |   0
 .../arch/x86/broadwellx/bdx-metrics.json           |   0
 .../perf/pmu-events/arch/x86/broadwellx/cache.json |   0
 .../arch/x86/broadwellx/floating-point.json        |   0
 .../pmu-events/arch/x86/broadwellx/frontend.json   |   0
 .../pmu-events/arch/x86/broadwellx/memory.json     |   0
 .../perf/pmu-events/arch/x86/broadwellx/other.json |   0
 .../pmu-events/arch/x86/broadwellx/pipeline.json   |   0
 .../arch/x86/broadwellx/uncore-cache.json          |   0
 .../arch/x86/broadwellx/uncore-interconnect.json   |   0
 .../arch/x86/broadwellx/uncore-memory.json         |   0
 .../arch/x86/broadwellx/uncore-power.json          |   0
 .../arch/x86/broadwellx/virtual-memory.json        |   0
 .../pmu-events/arch/x86/cascadelakex/cache.json    |   0
 .../arch/x86/cascadelakex/clx-metrics.json         |   0
 .../arch/x86/cascadelakex/floating-point.json      |   0
 .../pmu-events/arch/x86/cascadelakex/frontend.json |   0
 .../pmu-events/arch/x86/cascadelakex/memory.json   |   0
 .../pmu-events/arch/x86/cascadelakex/other.json    |   0
 .../pmu-events/arch/x86/cascadelakex/pipeline.json |   0
 .../arch/x86/cascadelakex/uncore-memory.json       |   0
 .../arch/x86/cascadelakex/uncore-other.json        |   0
 .../arch/x86/cascadelakex/virtual-memory.json      |   0
 .../pmu-events/arch/x86/elkhartlake/cache.json     |   0
 .../arch/x86/elkhartlake/ehl-metrics.json          |   0
 .../arch/x86/elkhartlake/floating-point.json       |   0
 .../pmu-events/arch/x86/elkhartlake/frontend.json  |   0
 .../pmu-events/arch/x86/elkhartlake/memory.json    |   0
 .../pmu-events/arch/x86/elkhartlake/other.json     |   0
 .../pmu-events/arch/x86/elkhartlake/pipeline.json  |   0
 .../arch/x86/elkhartlake/virtual-memory.json       |   0
 .../perf/pmu-events/arch/x86/goldmont/cache.json   |   0
 .../pmu-events/arch/x86/goldmont/frontend.json     |   0
 .../perf/pmu-events/arch/x86/goldmont/memory.json  |   0
 .../perf/pmu-events/arch/x86/goldmont/other.json   |   0
 .../pmu-events/arch/x86/goldmont/pipeline.json     |   0
 .../arch/x86/goldmont/virtual-memory.json          |   0
 .../pmu-events/arch/x86/goldmontplus/cache.json    |   0
 .../pmu-events/arch/x86/goldmontplus/frontend.json |   0
 .../pmu-events/arch/x86/goldmontplus/memory.json   |   0
 .../pmu-events/arch/x86/goldmontplus/other.json    |   0
 .../pmu-events/arch/x86/goldmontplus/pipeline.json |   0
 .../arch/x86/goldmontplus/virtual-memory.json      |   0
 .../perf/pmu-events/arch/x86/haswell/cache.json    |   0
 .../arch/x86/haswell/floating-point.json           |   0
 .../perf/pmu-events/arch/x86/haswell/frontend.json |   0
 .../pmu-events/arch/x86/haswell/hsw-metrics.json   |   0
 .../perf/pmu-events/arch/x86/haswell/memory.json   |   0
 .../perf/pmu-events/arch/x86/haswell/other.json    |   0
 .../perf/pmu-events/arch/x86/haswell/pipeline.json |   0
 .../perf/pmu-events/arch/x86/haswell/uncore.json   |   0
 .../arch/x86/haswell/virtual-memory.json           |   0
 .../perf/pmu-events/arch/x86/haswellx/cache.json   |   0
 .../arch/x86/haswellx/floating-point.json          |   0
 .../pmu-events/arch/x86/haswellx/frontend.json     |   0
 .../pmu-events/arch/x86/haswellx/hsx-metrics.json  |   0
 .../perf/pmu-events/arch/x86/haswellx/memory.json  |   0
 .../perf/pmu-events/arch/x86/haswellx/other.json   |   0
 .../pmu-events/arch/x86/haswellx/pipeline.json     |   0
 .../pmu-events/arch/x86/haswellx/uncore-cache.json |   0
 .../arch/x86/haswellx/uncore-interconnect.json     |   0
 .../arch/x86/haswellx/uncore-memory.json           |   0
 .../pmu-events/arch/x86/haswellx/uncore-power.json |   0
 .../arch/x86/haswellx/virtual-memory.json          |   0
 .../perf/pmu-events/arch/x86/icelake/cache.json    |   0
 .../arch/x86/icelake/floating-point.json           |   0
 .../perf/pmu-events/arch/x86/icelake/frontend.json |   0
 .../pmu-events/arch/x86/icelake/icl-metrics.json   |   0
 .../perf/pmu-events/arch/x86/icelake/memory.json   |   0
 .../perf/pmu-events/arch/x86/icelake/other.json    |   0
 .../perf/pmu-events/arch/x86/icelake/pipeline.json |   0
 .../arch/x86/icelake/virtual-memory.json           |   0
 .../perf/pmu-events/arch/x86/icelakex/cache.json   |   0
 .../arch/x86/icelakex/floating-point.json          |   0
 .../pmu-events/arch/x86/icelakex/frontend.json     |   0
 .../pmu-events/arch/x86/icelakex/icx-metrics.json  |   0
 .../perf/pmu-events/arch/x86/icelakex/memory.json  |   0
 .../perf/pmu-events/arch/x86/icelakex/other.json   |   0
 .../pmu-events/arch/x86/icelakex/pipeline.json     |   0
 .../arch/x86/icelakex/uncore-memory.json           |   0
 .../pmu-events/arch/x86/icelakex/uncore-other.json |   0
 .../pmu-events/arch/x86/icelakex/uncore-power.json |   0
 .../arch/x86/icelakex/virtual-memory.json          |   0
 .../perf/pmu-events/arch/x86/ivybridge/cache.json  |   0
 .../arch/x86/ivybridge/floating-point.json         |   0
 .../pmu-events/arch/x86/ivybridge/frontend.json    |   0
 .../pmu-events/arch/x86/ivybridge/ivb-metrics.json |   0
 .../perf/pmu-events/arch/x86/ivybridge/memory.json |   0
 .../perf/pmu-events/arch/x86/ivybridge/other.json  |   0
 .../pmu-events/arch/x86/ivybridge/pipeline.json    |   0
 .../perf/pmu-events/arch/x86/ivybridge/uncore.json |   0
 .../arch/x86/ivybridge/virtual-memory.json         |   0
 .../perf/pmu-events/arch/x86/ivytown/cache.json    |   0
 .../arch/x86/ivytown/floating-point.json           |   0
 .../perf/pmu-events/arch/x86/ivytown/frontend.json |   0
 .../pmu-events/arch/x86/ivytown/ivt-metrics.json   |   0
 .../perf/pmu-events/arch/x86/ivytown/memory.json   |   0
 .../perf/pmu-events/arch/x86/ivytown/other.json    |   0
 .../perf/pmu-events/arch/x86/ivytown/pipeline.json |   0
 .../pmu-events/arch/x86/ivytown/uncore-cache.json  |   0
 .../arch/x86/ivytown/uncore-interconnect.json      |   0
 .../pmu-events/arch/x86/ivytown/uncore-memory.json |   0
 .../pmu-events/arch/x86/ivytown/uncore-power.json  |   0
 .../arch/x86/ivytown/virtual-memory.json           |   0
 .../perf/pmu-events/arch/x86/jaketown/cache.json   |   0
 .../arch/x86/jaketown/floating-point.json          |   0
 .../pmu-events/arch/x86/jaketown/frontend.json     |   0
 .../pmu-events/arch/x86/jaketown/jkt-metrics.json  |   0
 .../perf/pmu-events/arch/x86/jaketown/memory.json  |   0
 .../perf/pmu-events/arch/x86/jaketown/other.json   |   0
 .../pmu-events/arch/x86/jaketown/pipeline.json     |   0
 .../pmu-events/arch/x86/jaketown/uncore-cache.json |   0
 .../arch/x86/jaketown/uncore-interconnect.json     |   0
 .../arch/x86/jaketown/uncore-memory.json           |   0
 .../pmu-events/arch/x86/jaketown/uncore-power.json |   0
 .../arch/x86/jaketown/virtual-memory.json          |   0
 .../pmu-events/arch/x86/knightslanding/cache.json  |   0
 .../arch/x86/knightslanding/frontend.json          |   0
 .../pmu-events/arch/x86/knightslanding/memory.json |   0
 .../arch/x86/knightslanding/pipeline.json          |   0
 .../arch/x86/knightslanding/uncore-memory.json     |   0
 .../arch/x86/knightslanding/virtual-memory.json    |   0
 .../{ => lib}/perf/pmu-events/arch/x86/mapfile.csv |   0
 .../perf/pmu-events/arch/x86/nehalemep/cache.json  |   0
 .../arch/x86/nehalemep/floating-point.json         |   0
 .../pmu-events/arch/x86/nehalemep/frontend.json    |   0
 .../perf/pmu-events/arch/x86/nehalemep/memory.json |   0
 .../perf/pmu-events/arch/x86/nehalemep/other.json  |   0
 .../pmu-events/arch/x86/nehalemep/pipeline.json    |   0
 .../arch/x86/nehalemep/virtual-memory.json         |   0
 .../perf/pmu-events/arch/x86/nehalemex/cache.json  |   0
 .../arch/x86/nehalemex/floating-point.json         |   0
 .../pmu-events/arch/x86/nehalemex/frontend.json    |   0
 .../perf/pmu-events/arch/x86/nehalemex/memory.json |   0
 .../perf/pmu-events/arch/x86/nehalemex/other.json  |   0
 .../pmu-events/arch/x86/nehalemex/pipeline.json    |   0
 .../arch/x86/nehalemex/virtual-memory.json         |   0
 .../pmu-events/arch/x86/sandybridge/cache.json     |   0
 .../arch/x86/sandybridge/floating-point.json       |   0
 .../pmu-events/arch/x86/sandybridge/frontend.json  |   0
 .../pmu-events/arch/x86/sandybridge/memory.json    |   0
 .../pmu-events/arch/x86/sandybridge/other.json     |   0
 .../pmu-events/arch/x86/sandybridge/pipeline.json  |   0
 .../arch/x86/sandybridge/snb-metrics.json          |   0
 .../pmu-events/arch/x86/sandybridge/uncore.json    |   0
 .../arch/x86/sandybridge/virtual-memory.json       |   0
 .../perf/pmu-events/arch/x86/silvermont/cache.json |   0
 .../pmu-events/arch/x86/silvermont/frontend.json   |   0
 .../pmu-events/arch/x86/silvermont/memory.json     |   0
 .../perf/pmu-events/arch/x86/silvermont/other.json |   0
 .../pmu-events/arch/x86/silvermont/pipeline.json   |   0
 .../arch/x86/silvermont/virtual-memory.json        |   0
 .../perf/pmu-events/arch/x86/skylake/cache.json    |   0
 .../arch/x86/skylake/floating-point.json           |   0
 .../perf/pmu-events/arch/x86/skylake/frontend.json |   0
 .../perf/pmu-events/arch/x86/skylake/memory.json   |   0
 .../perf/pmu-events/arch/x86/skylake/other.json    |   0
 .../perf/pmu-events/arch/x86/skylake/pipeline.json |   0
 .../pmu-events/arch/x86/skylake/skl-metrics.json   |   0
 .../perf/pmu-events/arch/x86/skylake/uncore.json   |   0
 .../arch/x86/skylake/virtual-memory.json           |   0
 .../perf/pmu-events/arch/x86/skylakex/cache.json   |   0
 .../arch/x86/skylakex/floating-point.json          |   0
 .../pmu-events/arch/x86/skylakex/frontend.json     |   0
 .../perf/pmu-events/arch/x86/skylakex/memory.json  |   0
 .../perf/pmu-events/arch/x86/skylakex/other.json   |   0
 .../pmu-events/arch/x86/skylakex/pipeline.json     |   0
 .../pmu-events/arch/x86/skylakex/skx-metrics.json  |   0
 .../arch/x86/skylakex/uncore-memory.json           |   0
 .../pmu-events/arch/x86/skylakex/uncore-other.json |   0
 .../arch/x86/skylakex/virtual-memory.json          |   0
 .../perf/pmu-events/arch/x86/tigerlake/cache.json  |   0
 .../arch/x86/tigerlake/floating-point.json         |   0
 .../pmu-events/arch/x86/tigerlake/frontend.json    |   0
 .../perf/pmu-events/arch/x86/tigerlake/memory.json |   0
 .../perf/pmu-events/arch/x86/tigerlake/other.json  |   0
 .../pmu-events/arch/x86/tigerlake/pipeline.json    |   0
 .../pmu-events/arch/x86/tigerlake/tgl-metrics.json |   0
 .../arch/x86/tigerlake/virtual-memory.json         |   0
 .../perf/pmu-events/arch/x86/tremontx/cache.json   |   0
 .../pmu-events/arch/x86/tremontx/frontend.json     |   0
 .../perf/pmu-events/arch/x86/tremontx/memory.json  |   0
 .../perf/pmu-events/arch/x86/tremontx/other.json   |   0
 .../pmu-events/arch/x86/tremontx/pipeline.json     |   0
 .../arch/x86/tremontx/uncore-memory.json           |   0
 .../pmu-events/arch/x86/tremontx/uncore-other.json |   0
 .../pmu-events/arch/x86/tremontx/uncore-power.json |   0
 .../arch/x86/tremontx/virtual-memory.json          |   0
 .../pmu-events/arch/x86/westmereep-dp/cache.json   |   0
 .../arch/x86/westmereep-dp/floating-point.json     |   0
 .../arch/x86/westmereep-dp/frontend.json           |   0
 .../pmu-events/arch/x86/westmereep-dp/memory.json  |   0
 .../pmu-events/arch/x86/westmereep-dp/other.json   |   0
 .../arch/x86/westmereep-dp/pipeline.json           |   0
 .../arch/x86/westmereep-dp/virtual-memory.json     |   0
 .../pmu-events/arch/x86/westmereep-sp/cache.json   |   0
 .../arch/x86/westmereep-sp/floating-point.json     |   0
 .../arch/x86/westmereep-sp/frontend.json           |   0
 .../pmu-events/arch/x86/westmereep-sp/memory.json  |   0
 .../pmu-events/arch/x86/westmereep-sp/other.json   |   0
 .../arch/x86/westmereep-sp/pipeline.json           |   0
 .../arch/x86/westmereep-sp/virtual-memory.json     |   0
 .../perf/pmu-events/arch/x86/westmereex/cache.json |   0
 .../arch/x86/westmereex/floating-point.json        |   0
 .../pmu-events/arch/x86/westmereex/frontend.json   |   0
 .../pmu-events/arch/x86/westmereex/memory.json     |   0
 .../perf/pmu-events/arch/x86/westmereex/other.json |   0
 .../pmu-events/arch/x86/westmereex/pipeline.json   |   0
 .../arch/x86/westmereex/virtual-memory.json        |   0
 tools/{ => lib}/perf/pmu-events/jevents.c          |   6 +-
 tools/{ => lib}/perf/pmu-events/jsmn.c             |   0
 tools/{ => lib}/perf/pmu-events/jsmn.h             |   0
 tools/{ => lib}/perf/pmu-events/json.c             |   0
 tools/{ => lib}/perf/pmu-events/json.h             |   0
 tools/{perf/util => lib/perf}/pmu-hybrid.c         |   3 +-
 tools/lib/perf/pmu.c                               | 117 +++
 tools/{perf/util => lib/perf}/pmu.l                |   3 +-
 tools/{perf/util => lib/perf}/pmu.y                |   2 +-
 tools/lib/perf/tests/Build                         |   1 +
 tools/lib/perf/tests/main.c                        |   1 +
 tools/lib/perf/tests/test-evlist.c                 |   2 +
 tools/lib/perf/tests/test-parse-events.c           |  43 +
 tools/lib/perf/tests/tests.h                       |   1 +
 tools/perf/Makefile.perf                           |  22 +-
 tools/perf/arch/x86/util/kvm-stat.c                |   8 +-
 tools/perf/arch/x86/util/pmu.c                     |   1 -
 tools/perf/builtin-c2c.c                           |   2 +-
 tools/perf/builtin-kvm.c                           |   6 +-
 tools/perf/builtin-list.c                          |   2 +-
 tools/perf/builtin-mem.c                           |   2 +-
 tools/perf/builtin-record.c                        |  12 +-
 tools/perf/builtin-stat.c                          |  18 +-
 tools/perf/builtin-top.c                           |   2 +-
 tools/perf/builtin-trace.c                         |  12 +-
 tools/perf/tests/event_update.c                    |   2 +-
 tools/perf/tests/evsel-roundtrip-name.c            |   2 +-
 tools/perf/tests/evsel-tp-sched.c                  |   6 +-
 tools/perf/tests/expand-cgroup.c                   |   8 +-
 tools/perf/tests/parse-events.c                    |  87 +-
 tools/perf/tests/parse-metric.c                    |   6 +-
 tools/perf/tests/perf-time-to-tsc.c                |   2 +-
 tools/perf/tests/pmu-events.c                      |   2 +-
 tools/perf/util/Build                              |  55 --
 tools/perf/util/amd-sample-raw.c                   |   2 +-
 tools/perf/util/arm-spe.c                          |   6 +-
 tools/perf/util/auxtrace.c                         |   6 +-
 tools/perf/util/bpf_counter.c                      |   2 +-
 tools/perf/util/cputopo.c                          |   2 +-
 tools/perf/util/evlist-hybrid.c                    |   5 +-
 tools/perf/util/evlist.c                           |  18 +-
 tools/perf/util/evsel.c                            | 109 +--
 tools/perf/util/evsel.h                            |  23 +-
 tools/perf/util/evsel_fprintf.c                    |   2 +-
 tools/perf/util/fncache.h                          |   7 -
 tools/perf/util/header.c                           |  32 +-
 tools/perf/util/intel-pt.c                         |   6 +-
 tools/perf/util/mem-events.c                       |   2 +-
 tools/perf/util/metricgroup.c                      |  22 +-
 tools/perf/util/metricgroup.h                      |   2 +-
 tools/perf/util/parse-events-hybrid.c              |  26 +-
 tools/perf/util/parse-events-hybrid.h              |   6 +-
 tools/perf/util/parse-events.c                     | 971 +++++----------------
 tools/perf/util/parse-events.h                     | 167 +---
 tools/perf/util/pmu.c                              | 113 +--
 tools/perf/util/pmu.h                              |  44 +-
 tools/perf/util/python-ext-sources                 |   2 -
 tools/perf/util/record.c                           |   4 +-
 tools/perf/util/s390-sample-raw.c                  |   2 +-
 tools/perf/util/sideband_evlist.c                  |   2 +-
 tools/perf/util/sort.c                             |   6 +-
 tools/perf/util/srccode.c                          |  10 +-
 tools/perf/util/stat-display.c                     |  29 +-
 tools/perf/util/stat-shadow.c                      |  14 +-
 tools/perf/util/synthetic-events.c                 |  10 +-
 tools/perf/util/trace-event-info.c                 |   6 +-
 466 files changed, 2051 insertions(+), 1556 deletions(-)
 rename tools/{perf/util => lib/api/fs}/fncache.c (95%)
 create mode 100644 tools/lib/perf/include/internal/parse-events.h
 rename tools/{perf/util => lib/perf/include/internal}/pmu-hybrid.h (96%)
 create mode 100644 tools/lib/perf/include/internal/pmu.h
 rename tools/{perf/pmu-events => lib/perf/include/perf}/pmu-events.h (100%)
 create mode 100644 tools/lib/perf/parse-events.c
 rename tools/{perf/util => lib/perf}/parse-events.l (96%)
 rename tools/{perf/util => lib/perf}/parse-events.y (76%)
 rename tools/{ => lib}/perf/pmu-events/Build (87%)
 rename tools/{ => lib}/perf/pmu-events/README (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/branch.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/bus.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/clock.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/exception.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/instruction.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/intrinsic.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a53/branch.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a53/bus.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a53/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a53/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a53/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a53/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a57-a72/core-imp-def.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/branch.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/bus.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/exception.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/instruction.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/branch.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/bus.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/exception.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/instruction.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/armv8-common-and-microarch.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/armv8-recommended.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/cavium/thunderx2/core-imp-def.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mm/sys/ddrc.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mm/sys/metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mn/sys/ddrc.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mn/sys/metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mp/sys/ddrc.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mp/sys/metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mq/sys/ddrc.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mq/sys/metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/branch.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/bus.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/cycle.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/exception.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/instruction.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/sve.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/hisilicon/hip08/core-imp-def.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/hisilicon/hip08/metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-ddrc.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-hha.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-l3c.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/arm64/mapfile.csv (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/nds32/mapfile.csv (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/nds32/n13/atcpmu.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/mapfile.csv (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/floating_point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/locks.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/marked.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/nest_metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/others.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/pmc.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/translation.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/marked.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/pmc.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/translation.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/marked.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/nest_metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/pmc.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/translation.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z10/basic.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z10/crypto.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z10/extended.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z13/basic.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z13/crypto.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z13/extended.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z13/transaction.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z14/basic.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z14/crypto.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z14/extended.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z14/transaction.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z15/basic.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z15/crypto.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z15/crypto6.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z15/extended.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z15/transaction.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z196/basic.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z196/crypto.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z196/extended.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_zec12/basic.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_zec12/crypto.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_zec12/extended.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_zec12/transaction.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/s390/mapfile.csv (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/test/arch-std-events.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/test/test_soc/cpu/branch.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/test/test_soc/cpu/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/test/test_soc/cpu/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/test/test_soc/cpu/uncore.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/test/test_soc/sys/uncore.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/branch.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/core.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/data-fabric.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/recommended.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/branch.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/core.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/data-fabric.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/recommended.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/branch.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/core.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/data-fabric.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/recommended.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/bdw-metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/uncore.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/bdwde-metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/uncore-cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/uncore-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/uncore-power.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/bdx-metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/uncore-cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/uncore-interconnect.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/uncore-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/uncore-power.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/clx-metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/uncore-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/uncore-other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/ehl-metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmont/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmont/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmont/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmont/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmont/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmont/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmontplus/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmontplus/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmontplus/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmontplus/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmontplus/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmontplus/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/hsw-metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/uncore.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/hsx-metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/uncore-cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/uncore-interconnect.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/uncore-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/uncore-power.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/icl-metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/icx-metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/uncore-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/uncore-other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/uncore-power.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/ivb-metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/uncore.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/ivt-metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/uncore-cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/uncore-interconnect.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/uncore-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/uncore-power.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/jkt-metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/uncore-cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/uncore-interconnect.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/uncore-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/uncore-power.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/knightslanding/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/knightslanding/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/knightslanding/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/knightslanding/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/knightslanding/uncore-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/knightslanding/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/mapfile.csv (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/snb-metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/uncore.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/silvermont/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/silvermont/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/silvermont/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/silvermont/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/silvermont/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/silvermont/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/skl-metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/uncore.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/skx-metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/uncore-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/uncore-other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/tgl-metrics.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/uncore-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/uncore-other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/uncore-power.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/cache.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/floating-point.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/frontend.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/other.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/pipeline.json (100%)
 rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/virtual-memory.json (100%)
 rename tools/{ => lib}/perf/pmu-events/jevents.c (99%)
 rename tools/{ => lib}/perf/pmu-events/jsmn.c (100%)
 rename tools/{ => lib}/perf/pmu-events/jsmn.h (100%)
 rename tools/{ => lib}/perf/pmu-events/json.c (100%)
 rename tools/{ => lib}/perf/pmu-events/json.h (100%)
 rename tools/{perf/util => lib/perf}/pmu-hybrid.c (97%)
 create mode 100644 tools/lib/perf/pmu.c
 rename tools/{perf/util => lib/perf}/pmu.l (91%)
 rename tools/{perf/util => lib/perf}/pmu.y (98%)
 create mode 100644 tools/lib/perf/tests/test-parse-events.c
 delete mode 100644 tools/perf/util/fncache.h


^ permalink raw reply	[flat|nested] 78+ messages in thread

* [PATCH 01/59] libperf: Move pmu-events.h file to libperf
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 03/59] libperf: Move pmu-events build " Jiri Olsa
                   ` (57 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving pmu-events.h under libperf to be exported as
<perf/pmu-events.h> header.

This is a preparation before moving the whole pmu-events
framework under libperf coming in following change.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/perf/pmu-events.h | 59 ++++++++++++++++++++++++
 tools/perf/pmu-events/Build              |  2 +-
 tools/perf/pmu-events/jevents.c          |  6 +--
 tools/perf/pmu-events/pmu-events.h       | 59 ------------------------
 tools/perf/tests/expand-cgroup.c         |  2 +-
 tools/perf/tests/parse-metric.c          |  2 +-
 tools/perf/tests/pmu-events.c            |  2 +-
 tools/perf/util/amd-sample-raw.c         |  2 +-
 tools/perf/util/metricgroup.h            |  2 +-
 tools/perf/util/pmu.h                    |  2 +-
 tools/perf/util/s390-sample-raw.c        |  2 +-
 11 files changed, 70 insertions(+), 70 deletions(-)
 create mode 100644 tools/lib/perf/include/perf/pmu-events.h
 delete mode 100644 tools/perf/pmu-events/pmu-events.h

diff --git a/tools/lib/perf/include/perf/pmu-events.h b/tools/lib/perf/include/perf/pmu-events.h
new file mode 100644
index 000000000000..6efe73976440
--- /dev/null
+++ b/tools/lib/perf/include/perf/pmu-events.h
@@ -0,0 +1,59 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef PMU_EVENTS_H
+#define PMU_EVENTS_H
+
+enum aggr_mode_class {
+	PerChip = 1,
+	PerCore
+};
+
+/*
+ * Describe each PMU event. Each CPU has a table of PMU events.
+ */
+struct pmu_event {
+	const char *name;
+	const char *compat;
+	const char *event;
+	const char *desc;
+	const char *topic;
+	const char *long_desc;
+	const char *pmu;
+	const char *unit;
+	const char *perpkg;
+	const char *aggr_mode;
+	const char *metric_expr;
+	const char *metric_name;
+	const char *metric_group;
+	const char *deprecated;
+	const char *metric_constraint;
+};
+
+/*
+ *
+ * Map a CPU to its table of PMU events. The CPU is identified by the
+ * cpuid field, which is an arch-specific identifier for the CPU.
+ * The identifier specified in tools/perf/pmu-events/arch/xxx/mapfile
+ * must match the get_cpuid_str() in tools/perf/arch/xxx/util/header.c)
+ *
+ * The  cpuid can contain any character other than the comma.
+ */
+struct pmu_events_map {
+	const char *cpuid;
+	const char *version;
+	const char *type;		/* core, uncore etc */
+	const struct pmu_event *table;
+};
+
+struct pmu_sys_events {
+	const char *name;
+	const struct pmu_event *table;
+};
+
+/*
+ * Global table mapping each known CPU for the architecture to its
+ * table of PMU events.
+ */
+extern const struct pmu_events_map pmu_events_map[];
+extern const struct pmu_sys_events pmu_sys_event_tables[];
+
+#endif
diff --git a/tools/perf/pmu-events/Build b/tools/perf/pmu-events/Build
index a055dee6a46a..5bc953ebdf25 100644
--- a/tools/perf/pmu-events/Build
+++ b/tools/perf/pmu-events/Build
@@ -1,7 +1,7 @@
 hostprogs := jevents
 
 jevents-y	+= json.o jsmn.o jevents.o
-HOSTCFLAGS_jevents.o	= -I$(srctree)/tools/include
+HOSTCFLAGS_jevents.o	= -I$(srctree)/tools/include -I$(srctree)/tools/lib/perf/include
 pmu-events-y	+= pmu-events.o
 JDIR		=  pmu-events/arch/$(SRCARCH)
 JSON		=  $(shell [ -d $(JDIR) ] &&				\
diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c
index 2e7c4153875b..2815caf602f3 100644
--- a/tools/perf/pmu-events/jevents.c
+++ b/tools/perf/pmu-events/jevents.c
@@ -49,7 +49,7 @@
 #include <linux/list.h>
 #include "jsmn.h"
 #include "json.h"
-#include "pmu-events.h"
+#include <perf/pmu-events.h>
 
 int verbose;
 char *prog;
@@ -958,7 +958,7 @@ static void create_empty_mapping(const char *output_file)
 		_Exit(1);
 	}
 
-	fprintf(outfp, "#include \"pmu-events/pmu-events.h\"\n");
+	fprintf(outfp, "#include <perf/pmu-events.h>\n");
 	print_mapping_table_prefix(outfp);
 	print_mapping_table_suffix(outfp);
 	print_system_event_mapping_table_prefix(outfp);
@@ -1239,7 +1239,7 @@ int main(int argc, char *argv[])
 	}
 
 	/* Include pmu-events.h first */
-	fprintf(eventsfp, "#include \"pmu-events/pmu-events.h\"\n");
+	fprintf(eventsfp, "#include <perf/pmu-events.h>\n");
 
 	/*
 	 * The mapfile allows multiple CPUids to point to the same JSON file,
diff --git a/tools/perf/pmu-events/pmu-events.h b/tools/perf/pmu-events/pmu-events.h
deleted file mode 100644
index 6efe73976440..000000000000
--- a/tools/perf/pmu-events/pmu-events.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef PMU_EVENTS_H
-#define PMU_EVENTS_H
-
-enum aggr_mode_class {
-	PerChip = 1,
-	PerCore
-};
-
-/*
- * Describe each PMU event. Each CPU has a table of PMU events.
- */
-struct pmu_event {
-	const char *name;
-	const char *compat;
-	const char *event;
-	const char *desc;
-	const char *topic;
-	const char *long_desc;
-	const char *pmu;
-	const char *unit;
-	const char *perpkg;
-	const char *aggr_mode;
-	const char *metric_expr;
-	const char *metric_name;
-	const char *metric_group;
-	const char *deprecated;
-	const char *metric_constraint;
-};
-
-/*
- *
- * Map a CPU to its table of PMU events. The CPU is identified by the
- * cpuid field, which is an arch-specific identifier for the CPU.
- * The identifier specified in tools/perf/pmu-events/arch/xxx/mapfile
- * must match the get_cpuid_str() in tools/perf/arch/xxx/util/header.c)
- *
- * The  cpuid can contain any character other than the comma.
- */
-struct pmu_events_map {
-	const char *cpuid;
-	const char *version;
-	const char *type;		/* core, uncore etc */
-	const struct pmu_event *table;
-};
-
-struct pmu_sys_events {
-	const char *name;
-	const struct pmu_event *table;
-};
-
-/*
- * Global table mapping each known CPU for the architecture to its
- * table of PMU events.
- */
-extern const struct pmu_events_map pmu_events_map[];
-extern const struct pmu_sys_events pmu_sys_event_tables[];
-
-#endif
diff --git a/tools/perf/tests/expand-cgroup.c b/tools/perf/tests/expand-cgroup.c
index aaad51aba12f..61dec9783a1e 100644
--- a/tools/perf/tests/expand-cgroup.c
+++ b/tools/perf/tests/expand-cgroup.c
@@ -6,7 +6,7 @@
 #include "rblist.h"
 #include "metricgroup.h"
 #include "parse-events.h"
-#include "pmu-events/pmu-events.h"
+#include <perf/pmu-events.h>
 #include "pfm.h"
 #include <subcmd/parse-options.h>
 #include <stdio.h>
diff --git a/tools/perf/tests/parse-metric.c b/tools/perf/tests/parse-metric.c
index dfc797ecc750..23ed50c26368 100644
--- a/tools/perf/tests/parse-metric.c
+++ b/tools/perf/tests/parse-metric.c
@@ -5,7 +5,7 @@
 #include <perf/evlist.h>
 #include "metricgroup.h"
 #include "tests.h"
-#include "pmu-events/pmu-events.h"
+#include <perf/pmu-events.h>
 #include "evlist.h"
 #include "rblist.h"
 #include "debug.h"
diff --git a/tools/perf/tests/pmu-events.c b/tools/perf/tests/pmu-events.c
index 50b1299fe643..78b03909bfe7 100644
--- a/tools/perf/tests/pmu-events.c
+++ b/tools/perf/tests/pmu-events.c
@@ -8,7 +8,7 @@
 #include <linux/kernel.h>
 #include <linux/zalloc.h>
 #include "debug.h"
-#include "../pmu-events/pmu-events.h"
+#include <perf/pmu-events.h>
 #include "util/evlist.h"
 #include "util/expr.h"
 #include "util/parse-events.h"
diff --git a/tools/perf/util/amd-sample-raw.c b/tools/perf/util/amd-sample-raw.c
index d19d765195c5..742c4f437c0b 100644
--- a/tools/perf/util/amd-sample-raw.c
+++ b/tools/perf/util/amd-sample-raw.c
@@ -15,7 +15,7 @@
 #include "session.h"
 #include "evlist.h"
 #include "sample-raw.h"
-#include "pmu-events/pmu-events.h"
+#include <perf/pmu-events.h>
 
 static u32 cpu_family, cpu_model, ibs_fetch_type, ibs_op_type;
 
diff --git a/tools/perf/util/metricgroup.h b/tools/perf/util/metricgroup.h
index 2b42b778d1bf..8cc6b0b0cb90 100644
--- a/tools/perf/util/metricgroup.h
+++ b/tools/perf/util/metricgroup.h
@@ -5,7 +5,7 @@
 #include <linux/list.h>
 #include <linux/rbtree.h>
 #include <stdbool.h>
-#include "pmu-events/pmu-events.h"
+#include <perf/pmu-events.h>
 
 struct evlist;
 struct evsel;
diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h
index 15bbec3a9959..31a52ee963c8 100644
--- a/tools/perf/util/pmu.h
+++ b/tools/perf/util/pmu.h
@@ -8,7 +8,7 @@
 #include <linux/list.h>
 #include <stdbool.h>
 #include "parse-events.h"
-#include "pmu-events/pmu-events.h"
+#include <perf/pmu-events.h>
 
 struct evsel_config_term;
 struct perf_cpu_map;
diff --git a/tools/perf/util/s390-sample-raw.c b/tools/perf/util/s390-sample-raw.c
index cd3a34840389..92af45ea22f6 100644
--- a/tools/perf/util/s390-sample-raw.c
+++ b/tools/perf/util/s390-sample-raw.c
@@ -27,7 +27,7 @@
 #include "color.h"
 #include "sample-raw.h"
 #include "s390-cpumcf-kernel.h"
-#include "pmu-events/pmu-events.h"
+#include <perf/pmu-events.h>
 
 static size_t ctrset_size(struct cf_ctrset_entry *set)
 {
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 03/59] libperf: Move pmu-events build to libperf
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
  2021-11-08 13:36 ` [PATCH 01/59] libperf: Move pmu-events.h file to libperf Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 04/59] libperf: Move perf_pmu__format_parse " Jiri Olsa
                   ` (56 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving the compilation of pmu-events under libperf.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/Makefile  | 33 +++++++++++++++++++++++++++++----
 tools/perf/Makefile.perf | 22 +++-------------------
 2 files changed, 32 insertions(+), 23 deletions(-)

diff --git a/tools/lib/perf/Makefile b/tools/lib/perf/Makefile
index 08fe6e3c4089..a7a919fb9e62 100644
--- a/tools/lib/perf/Makefile
+++ b/tools/lib/perf/Makefile
@@ -7,6 +7,12 @@ LIBPERF_EXTRAVERSION = 1
 
 MAKEFLAGS += --no-print-directory
 
+# Do not use make's built-in rules
+# (this improves performance and avoids hard-to-debug behaviour);
+MAKEFLAGS += -r
+
+.SUFFIXES:
+
 ifeq ($(srctree),)
 srctree := $(patsubst %/,%,$(dir $(CURDIR)))
 srctree := $(patsubst %/,%,$(dir $(srctree)))
@@ -80,6 +86,8 @@ all:
 
 export srctree OUTPUT CC LD CFLAGS V
 export DESTDIR DESTDIR_SQ
+export HOSTCC HOSTLD HOSTAR
+export SRCARCH
 
 include $(srctree)/tools/build/Makefile.include
 
@@ -111,6 +119,22 @@ endif
 LIBAPI = $(API_PATH)libapi.a
 export LIBAPI
 
+JEVENTS    := $(OUTPUT)pmu-events/jevents
+JEVENTS_IN := $(OUTPUT)pmu-events/jevents-in.o
+
+export JEVENTS
+
+PMU_EVENTS_IN := $(OUTPUT)pmu-events/pmu-events-in.o
+
+$(JEVENTS_IN): FORCE
+	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=pmu-events obj=jevents
+
+$(JEVENTS): $(JEVENTS_IN)
+	$(QUIET_LINK)$(HOSTCC) $(JEVENTS_IN) -o $@
+
+$(PMU_EVENTS_IN): $(JEVENTS) FORCE
+	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=pmu-events obj=pmu-events
+
 $(LIBAPI): FORCE
 	$(Q)$(MAKE) -C $(LIB_DIR) O=$(OUTPUT) $(OUTPUT)libapi.a
 
@@ -121,10 +145,10 @@ $(LIBAPI)-clean:
 $(LIBPERF_IN): FORCE
 	$(Q)$(MAKE) $(build)=libperf
 
-$(LIBPERF_A): $(LIBPERF_IN)
-	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIBPERF_IN)
+$(LIBPERF_A): $(LIBPERF_IN) $(PMU_EVENTS_IN)
+	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $^
 
-$(LIBPERF_SO): $(LIBPERF_IN) $(LIBAPI)
+$(LIBPERF_SO): $(LIBPERF_IN) $(LIBAPI) $(PMU_EVENTS_IN)
 	$(QUIET_LINK)$(CC) --shared -Wl,-soname,libperf.so \
                                     -Wl,--version-script=$(VERSION_SCRIPT) $^ -o $@
 	@ln -sf $(@F) $(OUTPUT)libperf.so
@@ -139,7 +163,8 @@ all: fixdep
 clean: $(LIBAPI)-clean
 	$(call QUIET_CLEAN, libperf) $(RM) $(LIBPERF_A) \
                 *.o *~ *.a *.so *.so.$(VERSION) *.so.$(LIBPERF_VERSION) .*.d .*.cmd tests/*.o LIBPERF-CFLAGS $(LIBPERF_PC) \
-                $(TESTS_STATIC) $(TESTS_SHARED)
+                $(TESTS_STATIC) $(TESTS_SHARED) \
+                $(OUTPUT)pmu-events/pmu-events.c $(OUTPUT)pmu-events/jevents
 
 TESTS_IN = tests-in.o
 
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index a3966f290297..6d10996388b4 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -647,30 +647,14 @@ strip: $(PROGRAMS) $(OUTPUT)perf
 
 PERF_IN := $(OUTPUT)perf-in.o
 
-JEVENTS       := $(OUTPUT)pmu-events/jevents
-JEVENTS_IN    := $(OUTPUT)pmu-events/jevents-in.o
-
-PMU_EVENTS_IN := $(OUTPUT)pmu-events/pmu-events-in.o
-
-export JEVENTS
-
 build := -f $(srctree)/tools/build/Makefile.build dir=. obj
 
 $(PERF_IN): prepare FORCE
 	$(Q)$(MAKE) $(build)=perf
 
-$(JEVENTS_IN): FORCE
-	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=pmu-events obj=jevents
-
-$(JEVENTS): $(JEVENTS_IN)
-	$(QUIET_LINK)$(HOSTCC) $(JEVENTS_IN) -o $@
-
-$(PMU_EVENTS_IN): $(JEVENTS) FORCE
-	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=pmu-events obj=pmu-events
-
-$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN) $(LIBTRACEEVENT_DYNAMIC_LIST)
+$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(LIBTRACEEVENT_DYNAMIC_LIST)
 	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS) \
-		$(PERF_IN) $(PMU_EVENTS_IN) $(LIBS) -o $@
+		$(PERF_IN) $(LIBS) -o $@
 
 $(GTK_IN): FORCE
 	$(Q)$(MAKE) $(build)=gtk
@@ -1086,7 +1070,7 @@ clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clea
 	$(call QUIET_CLEAN, core-objs)  $(RM) $(LIBPERF_A) $(OUTPUT)perf-archive $(OUTPUT)perf-with-kcore $(OUTPUT)perf-iostat $(LANG_BINDINGS)
 	$(Q)find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
 	$(Q)$(RM) $(OUTPUT).config-detected
-	$(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf perf-read-vdso32 perf-read-vdsox32 $(OUTPUT)pmu-events/jevents $(OUTPUT)$(LIBJVMTI).so
+	$(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf perf-read-vdso32 perf-read-vdsox32 $(OUTPUT)$(LIBJVMTI).so
 	$(call QUIET_CLEAN, core-gen)   $(RM)  *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope* $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)FEATURE-DUMP $(OUTPUT)util/*-bison* $(OUTPUT)util/*-flex* \
 		$(OUTPUT)util/intel-pt-decoder/inat-tables.c \
 		$(OUTPUT)tests/llvm-src-{base,kbuild,prologue,relocation}.c \
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 04/59] libperf: Move perf_pmu__format_parse to libperf
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
  2021-11-08 13:36 ` [PATCH 01/59] libperf: Move pmu-events.h file to libperf Jiri Olsa
  2021-11-08 13:36 ` [PATCH 03/59] libperf: Move pmu-events build " Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 05/59] tools api fs: Move in the fncache from perf Jiri Olsa
                   ` (55 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Move perf_pmu__format_parse function into new
pmu.c object under libperf.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/Build                  | 30 +++++++++
 tools/lib/perf/Makefile               |  8 ++-
 tools/lib/perf/include/internal/pmu.h | 29 +++++++++
 tools/lib/perf/pmu.c                  | 83 ++++++++++++++++++++++++
 tools/lib/perf/pmu.l                  | 44 +++++++++++++
 tools/lib/perf/pmu.y                  | 92 +++++++++++++++++++++++++++
 tools/perf/util/Build                 | 15 -----
 tools/perf/util/pmu.c                 | 77 ----------------------
 tools/perf/util/pmu.h                 | 12 +---
 tools/perf/util/pmu.l                 | 43 -------------
 tools/perf/util/pmu.y                 | 92 ---------------------------
 11 files changed, 286 insertions(+), 239 deletions(-)
 create mode 100644 tools/lib/perf/include/internal/pmu.h
 create mode 100644 tools/lib/perf/pmu.c
 create mode 100644 tools/lib/perf/pmu.l
 create mode 100644 tools/lib/perf/pmu.y
 delete mode 100644 tools/perf/util/pmu.l
 delete mode 100644 tools/perf/util/pmu.y

diff --git a/tools/lib/perf/Build b/tools/lib/perf/Build
index e8f5b7fb9973..275ec24cad7b 100644
--- a/tools/lib/perf/Build
+++ b/tools/lib/perf/Build
@@ -7,9 +7,39 @@ libperf-y += mmap.o
 libperf-y += zalloc.o
 libperf-y += xyarray.o
 libperf-y += lib.o
+libperf-y += pmu-flex.o
+libperf-y += pmu-bison.o
+libperf-y += pmu.o
 
 $(OUTPUT)zalloc.o: ../../lib/zalloc.c FORCE
 	$(call rule_mkdir)
 	$(call if_changed_dep,cc_o_c)
 
 tests-y += tests/
+
+
+$(OUTPUT)pmu-flex.c $(OUTPUT)pmu-flex.h: pmu.l $(OUTPUT)pmu-bison.c
+	$(call rule_mkdir)
+	$(Q)$(call echo-cmd,flex)$(FLEX) -o $(OUTPUT)pmu-flex.c \
+                --header-file=$(OUTPUT)pmu-flex.h $(PARSER_DEBUG_FLEX) $<
+
+$(OUTPUT)pmu-bison.c $(OUTPUT)pmu-bison.h: pmu.y
+	$(call rule_mkdir)
+	$(Q)$(call echo-cmd,bison)$(BISON) -v $< -d $(PARSER_DEBUG_BISON) $(BISON_FILE_PREFIX_MAP) \
+                -o $(OUTPUT)pmu-bison.c -p perf_pmu_
+
+FLEX_GE_26 := $(shell expr $(shell $(FLEX) --version | sed -e  's/flex \([0-9]\+\).\([0-9]\+\)/\1\2/g') \>\= 26)
+ifeq ($(FLEX_GE_26),1)
+  flex_flags := -Wno-switch-enum -Wno-switch-default -Wno-unused-function -Wno-redundant-decls -Wno-sign-compare -Wno-unused-parameter -Wno-missing-prototypes -Wno-missing-declarations
+  CC_HASNT_MISLEADING_INDENTATION := $(shell echo "int main(void) { return 0 }" | $(CC) -Werror -Wno-misleading-indentation -o /dev/null -xc - 2>&1 | grep -q -- -Wno-misleading-indentation ; echo $$?)
+  ifeq ($(CC_HASNT_MISLEADING_INDENTATION), 1)
+    flex_flags += -Wno-misleading-indentation
+  endif
+else
+  flex_flags := -w
+endif
+
+CFLAGS_pmu-flex.o  += $(flex_flags)
+CFLAGS_pmu-bison.o += -DYYLTYPE_IS_TRIVIAL=0 $(bison_flags)
+
+$(OUTPUT)pmu.o: $(OUTPUT)pmu-flex.c $(OUTPUT)pmu-bison.c
diff --git a/tools/lib/perf/Makefile b/tools/lib/perf/Makefile
index a7a919fb9e62..bb6f53c215ad 100644
--- a/tools/lib/perf/Makefile
+++ b/tools/lib/perf/Makefile
@@ -22,6 +22,11 @@ endif
 
 INSTALL = install
 
+FLEX    ?= flex
+BISON   ?= bison
+
+export FLEX BISON
+
 # Use DESTDIR for installing into a different root directory.
 # This is useful for building a package. The program will be
 # installed in this directory as if it was the root directory.
@@ -164,7 +169,8 @@ clean: $(LIBAPI)-clean
 	$(call QUIET_CLEAN, libperf) $(RM) $(LIBPERF_A) \
                 *.o *~ *.a *.so *.so.$(VERSION) *.so.$(LIBPERF_VERSION) .*.d .*.cmd tests/*.o LIBPERF-CFLAGS $(LIBPERF_PC) \
                 $(TESTS_STATIC) $(TESTS_SHARED) \
-                $(OUTPUT)pmu-events/pmu-events.c $(OUTPUT)pmu-events/jevents
+                $(OUTPUT)pmu-events/pmu-events.c $(OUTPUT)pmu-events/jevents \
+                $(OUTPUT)*-bison* $(OUTPUT)*-flex*
 
 TESTS_IN = tests-in.o
 
diff --git a/tools/lib/perf/include/internal/pmu.h b/tools/lib/perf/include/internal/pmu.h
new file mode 100644
index 000000000000..2c742acd933c
--- /dev/null
+++ b/tools/lib/perf/include/internal/pmu.h
@@ -0,0 +1,29 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __LIBPERF_INTERNAL_PMU_H
+#define __LIBPERF_INTERNAL_PMU_H
+
+#include <linux/list.h>
+#include <linux/bitmap.h>
+
+enum {
+	PERF_PMU_FORMAT_VALUE_CONFIG,
+	PERF_PMU_FORMAT_VALUE_CONFIG1,
+	PERF_PMU_FORMAT_VALUE_CONFIG2,
+};
+
+#define PERF_PMU_FORMAT_BITS 64
+
+struct perf_pmu_format {
+	char *name;
+	int value;
+	DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS);
+	struct list_head list;
+};
+
+int perf_pmu__new_format(struct list_head *list, char *name,
+			 int config, unsigned long *bits);
+void perf_pmu__set_format(unsigned long *bits, long from, long to);
+void perf_pmu_error(struct list_head *list, char *name, char const *msg);
+int perf_pmu__format_parse(char *dir, struct list_head *head);
+
+#endif /* __LIBPERF_INTERNAL_PMU_H */
diff --git a/tools/lib/perf/pmu.c b/tools/lib/perf/pmu.c
new file mode 100644
index 000000000000..2fa361516ca8
--- /dev/null
+++ b/tools/lib/perf/pmu.c
@@ -0,0 +1,83 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/list.h>
+#include <linux/compiler.h>
+#include <linux/string.h>
+#include <linux/zalloc.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <internal/pmu.h>
+
+extern FILE *perf_pmu_in;
+
+int perf_pmu_parse(struct list_head *list, char *name);
+
+int perf_pmu__new_format(struct list_head *list, char *name,
+			 int config, unsigned long *bits)
+{
+	struct perf_pmu_format *format;
+
+	format = zalloc(sizeof(*format));
+	if (!format)
+		return -ENOMEM;
+
+	format->name = strdup(name);
+	format->value = config;
+	memcpy(format->bits, bits, sizeof(format->bits));
+
+	list_add_tail(&format->list, list);
+	return 0;
+}
+
+void perf_pmu__set_format(unsigned long *bits, long from, long to)
+{
+	long b;
+
+	if (!to)
+		to = from;
+
+	memset(bits, 0, BITS_TO_BYTES(PERF_PMU_FORMAT_BITS));
+	for (b = from; b <= to; b++)
+		set_bit(b, bits);
+}
+
+/*
+ * Parse & process all the sysfs attributes located under
+ * the directory specified in 'dir' parameter.
+ */
+int perf_pmu__format_parse(char *dir, struct list_head *head)
+{
+	struct dirent *evt_ent;
+	DIR *format_dir;
+	int ret = 0;
+
+	format_dir = opendir(dir);
+	if (!format_dir)
+		return -EINVAL;
+
+	while (!ret && (evt_ent = readdir(format_dir))) {
+		char path[PATH_MAX];
+		char *name = evt_ent->d_name;
+		FILE *file;
+
+		if (!strcmp(name, ".") || !strcmp(name, ".."))
+			continue;
+
+		snprintf(path, PATH_MAX, "%s/%s", dir, name);
+
+		ret = -EINVAL;
+		file = fopen(path, "r");
+		if (!file)
+			break;
+
+		perf_pmu_in = file;
+		ret = perf_pmu_parse(head, name);
+		fclose(file);
+	}
+
+	closedir(format_dir);
+	return ret;
+}
diff --git a/tools/lib/perf/pmu.l b/tools/lib/perf/pmu.l
new file mode 100644
index 000000000000..372cd75ea70b
--- /dev/null
+++ b/tools/lib/perf/pmu.l
@@ -0,0 +1,44 @@
+%option prefix="perf_pmu_"
+
+%{
+#include <stdlib.h>
+#include <linux/bitops.h>
+#include <linux/bitmap.h>
+#include <internal/pmu.h>
+#include "pmu-bison.h"
+
+static int value(int base)
+{
+	long num;
+
+	errno = 0;
+	num = strtoul(perf_pmu_text, NULL, base);
+	if (errno)
+		return PP_ERROR;
+
+	perf_pmu_lval.num = num;
+	return PP_VALUE;
+}
+
+%}
+
+num_dec         [0-9]+
+
+%%
+
+{num_dec}	{ return value(10); }
+config		{ return PP_CONFIG; }
+config1		{ return PP_CONFIG1; }
+config2		{ return PP_CONFIG2; }
+-		{ return '-'; }
+:		{ return ':'; }
+,		{ return ','; }
+.		{ ; }
+\n		{ ; }
+
+%%
+
+int perf_pmu_wrap(void)
+{
+	return 1;
+}
diff --git a/tools/lib/perf/pmu.y b/tools/lib/perf/pmu.y
new file mode 100644
index 000000000000..715201e3b06f
--- /dev/null
+++ b/tools/lib/perf/pmu.y
@@ -0,0 +1,92 @@
+
+%parse-param {struct list_head *format}
+%parse-param {char *name}
+
+%{
+
+#include <linux/compiler.h>
+#include <linux/list.h>
+#include <linux/bitmap.h>
+#include <string.h>
+#include <internal/pmu.h>
+
+extern int perf_pmu_lex (void);
+
+#define ABORT_ON(val) \
+do { \
+        if (val) \
+                YYABORT; \
+} while (0)
+
+%}
+
+%token PP_CONFIG PP_CONFIG1 PP_CONFIG2
+%token PP_VALUE PP_ERROR
+%type <num> PP_VALUE
+%type <bits> bit_term
+%type <bits> bits
+
+%union
+{
+	unsigned long num;
+	DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS);
+}
+
+%%
+
+format:
+format format_term
+|
+format_term
+
+format_term:
+PP_CONFIG ':' bits
+{
+	ABORT_ON(perf_pmu__new_format(format, name,
+				      PERF_PMU_FORMAT_VALUE_CONFIG,
+				      $3));
+}
+|
+PP_CONFIG1 ':' bits
+{
+	ABORT_ON(perf_pmu__new_format(format, name,
+				      PERF_PMU_FORMAT_VALUE_CONFIG1,
+				      $3));
+}
+|
+PP_CONFIG2 ':' bits
+{
+	ABORT_ON(perf_pmu__new_format(format, name,
+				      PERF_PMU_FORMAT_VALUE_CONFIG2,
+				      $3));
+}
+
+bits:
+bits ',' bit_term
+{
+	bitmap_or($$, $1, $3, 64);
+}
+|
+bit_term
+{
+	memcpy($$, $1, sizeof($1));
+}
+
+bit_term:
+PP_VALUE '-' PP_VALUE
+{
+	perf_pmu__set_format($$, $1, $3);
+}
+|
+PP_VALUE
+{
+	perf_pmu__set_format($$, $1, 0);
+}
+
+%%
+
+void perf_pmu_error(struct list_head *list __maybe_unused,
+		    char *name __maybe_unused,
+		    char const *msg __maybe_unused)
+{
+}
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 15b2366ad384..03d5d6ed7fe4 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -70,8 +70,6 @@ perf-y += trace-event-parse.o
 perf-y += parse-events-flex.o
 perf-y += parse-events-bison.o
 perf-y += pmu.o
-perf-y += pmu-flex.o
-perf-y += pmu-bison.o
 perf-y += pmu-hybrid.o
 perf-y += trace-event-read.o
 perf-y += trace-event-info.o
@@ -233,16 +231,6 @@ $(OUTPUT)util/expr-bison.c $(OUTPUT)util/expr-bison.h: util/expr.y
 	$(Q)$(call echo-cmd,bison)$(BISON) -v $< -d $(PARSER_DEBUG_BISON) $(BISON_FILE_PREFIX_MAP) \
 		-o $(OUTPUT)util/expr-bison.c -p expr_
 
-$(OUTPUT)util/pmu-flex.c $(OUTPUT)util/pmu-flex.h: util/pmu.l $(OUTPUT)util/pmu-bison.c
-	$(call rule_mkdir)
-	$(Q)$(call echo-cmd,flex)$(FLEX) -o $(OUTPUT)util/pmu-flex.c \
-		--header-file=$(OUTPUT)util/pmu-flex.h $(PARSER_DEBUG_FLEX) $<
-
-$(OUTPUT)util/pmu-bison.c $(OUTPUT)util/pmu-bison.h: util/pmu.y
-	$(call rule_mkdir)
-	$(Q)$(call echo-cmd,bison)$(BISON) -v $< -d $(PARSER_DEBUG_BISON) $(BISON_FILE_PREFIX_MAP) \
-		-o $(OUTPUT)util/pmu-bison.c -p perf_pmu_
-
 FLEX_GE_26 := $(shell expr $(shell $(FLEX) --version | sed -e  's/flex \([0-9]\+\).\([0-9]\+\)/\1\2/g') \>\= 26)
 ifeq ($(FLEX_GE_26),1)
   flex_flags := -Wno-switch-enum -Wno-switch-default -Wno-unused-function -Wno-redundant-decls -Wno-sign-compare -Wno-unused-parameter -Wno-missing-prototypes -Wno-missing-declarations
@@ -254,7 +242,6 @@ else
   flex_flags := -w
 endif
 CFLAGS_parse-events-flex.o  += $(flex_flags)
-CFLAGS_pmu-flex.o           += $(flex_flags)
 CFLAGS_expr-flex.o          += $(flex_flags)
 
 bison_flags := -DYYENABLE_NLS=0
@@ -265,11 +252,9 @@ else
   bison_flags += -w
 endif
 CFLAGS_parse-events-bison.o += $(bison_flags)
-CFLAGS_pmu-bison.o          += -DYYLTYPE_IS_TRIVIAL=0 $(bison_flags)
 CFLAGS_expr-bison.o         += -DYYLTYPE_IS_TRIVIAL=0 $(bison_flags)
 
 $(OUTPUT)util/parse-events.o: $(OUTPUT)util/parse-events-flex.c $(OUTPUT)util/parse-events-bison.c
-$(OUTPUT)util/pmu.o: $(OUTPUT)util/pmu-flex.c $(OUTPUT)util/pmu-bison.c
 $(OUTPUT)util/expr.o: $(OUTPUT)util/expr-flex.c $(OUTPUT)util/expr-bison.c
 
 CFLAGS_bitmap.o        += -Wno-unused-parameter -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))"
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index f3072c71d132..55d834160428 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -31,57 +31,9 @@
 
 struct perf_pmu perf_pmu__fake;
 
-struct perf_pmu_format {
-	char *name;
-	int value;
-	DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS);
-	struct list_head list;
-};
-
-int perf_pmu_parse(struct list_head *list, char *name);
-extern FILE *perf_pmu_in;
-
 static LIST_HEAD(pmus);
 static bool hybrid_scanned;
 
-/*
- * Parse & process all the sysfs attributes located under
- * the directory specified in 'dir' parameter.
- */
-int perf_pmu__format_parse(char *dir, struct list_head *head)
-{
-	struct dirent *evt_ent;
-	DIR *format_dir;
-	int ret = 0;
-
-	format_dir = opendir(dir);
-	if (!format_dir)
-		return -EINVAL;
-
-	while (!ret && (evt_ent = readdir(format_dir))) {
-		char path[PATH_MAX];
-		char *name = evt_ent->d_name;
-		FILE *file;
-
-		if (!strcmp(name, ".") || !strcmp(name, ".."))
-			continue;
-
-		snprintf(path, PATH_MAX, "%s/%s", dir, name);
-
-		ret = -EINVAL;
-		file = fopen(path, "r");
-		if (!file)
-			break;
-
-		perf_pmu_in = file;
-		ret = perf_pmu_parse(head, name);
-		fclose(file);
-	}
-
-	closedir(format_dir);
-	return ret;
-}
-
 /*
  * Reading/parsing the default pmu format definition, which should be
  * located at:
@@ -1513,35 +1465,6 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms,
 	return 0;
 }
 
-int perf_pmu__new_format(struct list_head *list, char *name,
-			 int config, unsigned long *bits)
-{
-	struct perf_pmu_format *format;
-
-	format = zalloc(sizeof(*format));
-	if (!format)
-		return -ENOMEM;
-
-	format->name = strdup(name);
-	format->value = config;
-	memcpy(format->bits, bits, sizeof(format->bits));
-
-	list_add_tail(&format->list, list);
-	return 0;
-}
-
-void perf_pmu__set_format(unsigned long *bits, long from, long to)
-{
-	long b;
-
-	if (!to)
-		to = from;
-
-	memset(bits, 0, BITS_TO_BYTES(PERF_PMU_FORMAT_BITS));
-	for (b = from; b <= to; b++)
-		set_bit(b, bits);
-}
-
 void perf_pmu__del_formats(struct list_head *formats)
 {
 	struct perf_pmu_format *fmt, *tmp;
diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h
index 31a52ee963c8..3127c877e043 100644
--- a/tools/perf/util/pmu.h
+++ b/tools/perf/util/pmu.h
@@ -9,16 +9,11 @@
 #include <stdbool.h>
 #include "parse-events.h"
 #include <perf/pmu-events.h>
+#include <internal/pmu.h>
 
 struct evsel_config_term;
 struct perf_cpu_map;
 
-enum {
-	PERF_PMU_FORMAT_VALUE_CONFIG,
-	PERF_PMU_FORMAT_VALUE_CONFIG1,
-	PERF_PMU_FORMAT_VALUE_CONFIG2,
-};
-
 #define PERF_PMU_FORMAT_BITS 64
 #define EVENT_SOURCE_DEVICE_PATH "/bus/event_source/devices/"
 #define CPUS_TEMPLATE_CPU	"%s/bus/event_source/devices/%s/cpus"
@@ -98,12 +93,7 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms,
 			  struct perf_pmu_info *info);
 struct list_head *perf_pmu__alias(struct perf_pmu *pmu,
 				  struct list_head *head_terms);
-void perf_pmu_error(struct list_head *list, char *name, char const *msg);
 
-int perf_pmu__new_format(struct list_head *list, char *name,
-			 int config, unsigned long *bits);
-void perf_pmu__set_format(unsigned long *bits, long from, long to);
-int perf_pmu__format_parse(char *dir, struct list_head *head);
 void perf_pmu__del_formats(struct list_head *formats);
 
 struct perf_pmu *perf_pmu__scan(struct perf_pmu *pmu);
diff --git a/tools/perf/util/pmu.l b/tools/perf/util/pmu.l
deleted file mode 100644
index a15d9fbd7c0e..000000000000
--- a/tools/perf/util/pmu.l
+++ /dev/null
@@ -1,43 +0,0 @@
-%option prefix="perf_pmu_"
-
-%{
-#include <stdlib.h>
-#include <linux/bitops.h>
-#include "pmu.h"
-#include "pmu-bison.h"
-
-static int value(int base)
-{
-	long num;
-
-	errno = 0;
-	num = strtoul(perf_pmu_text, NULL, base);
-	if (errno)
-		return PP_ERROR;
-
-	perf_pmu_lval.num = num;
-	return PP_VALUE;
-}
-
-%}
-
-num_dec         [0-9]+
-
-%%
-
-{num_dec}	{ return value(10); }
-config		{ return PP_CONFIG; }
-config1		{ return PP_CONFIG1; }
-config2		{ return PP_CONFIG2; }
--		{ return '-'; }
-:		{ return ':'; }
-,		{ return ','; }
-.		{ ; }
-\n		{ ; }
-
-%%
-
-int perf_pmu_wrap(void)
-{
-	return 1;
-}
diff --git a/tools/perf/util/pmu.y b/tools/perf/util/pmu.y
deleted file mode 100644
index bfd7e8509869..000000000000
--- a/tools/perf/util/pmu.y
+++ /dev/null
@@ -1,92 +0,0 @@
-
-%parse-param {struct list_head *format}
-%parse-param {char *name}
-
-%{
-
-#include <linux/compiler.h>
-#include <linux/list.h>
-#include <linux/bitmap.h>
-#include <string.h>
-#include "pmu.h"
-
-extern int perf_pmu_lex (void);
-
-#define ABORT_ON(val) \
-do { \
-        if (val) \
-                YYABORT; \
-} while (0)
-
-%}
-
-%token PP_CONFIG PP_CONFIG1 PP_CONFIG2
-%token PP_VALUE PP_ERROR
-%type <num> PP_VALUE
-%type <bits> bit_term
-%type <bits> bits
-
-%union
-{
-	unsigned long num;
-	DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS);
-}
-
-%%
-
-format:
-format format_term
-|
-format_term
-
-format_term:
-PP_CONFIG ':' bits
-{
-	ABORT_ON(perf_pmu__new_format(format, name,
-				      PERF_PMU_FORMAT_VALUE_CONFIG,
-				      $3));
-}
-|
-PP_CONFIG1 ':' bits
-{
-	ABORT_ON(perf_pmu__new_format(format, name,
-				      PERF_PMU_FORMAT_VALUE_CONFIG1,
-				      $3));
-}
-|
-PP_CONFIG2 ':' bits
-{
-	ABORT_ON(perf_pmu__new_format(format, name,
-				      PERF_PMU_FORMAT_VALUE_CONFIG2,
-				      $3));
-}
-
-bits:
-bits ',' bit_term
-{
-	bitmap_or($$, $1, $3, 64);
-}
-|
-bit_term
-{
-	memcpy($$, $1, sizeof($1));
-}
-
-bit_term:
-PP_VALUE '-' PP_VALUE
-{
-	perf_pmu__set_format($$, $1, $3);
-}
-|
-PP_VALUE
-{
-	perf_pmu__set_format($$, $1, 0);
-}
-
-%%
-
-void perf_pmu_error(struct list_head *list __maybe_unused,
-		    char *name __maybe_unused,
-		    char const *msg __maybe_unused)
-{
-}
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 05/59] tools api fs: Move in the fncache from perf
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (2 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 04/59] libperf: Move perf_pmu__format_parse " Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 17:46   ` Ian Rogers
  2021-11-08 13:36 ` [PATCH 06/59] libperf: Move in the pmu hybrid support Jiri Olsa
                   ` (54 subsequent siblings)
  58 siblings, 1 reply; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving fncache from perf under libapi.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/api/fs/Build             |  1 +
 tools/lib/api/fs/fncache.c         | 63 ++++++++++++++++++++++++++++++
 tools/lib/api/fs/fs.h              |  2 +
 tools/perf/arch/x86/util/pmu.c     |  1 -
 tools/perf/tests/parse-events.c    |  1 -
 tools/perf/util/Build              |  1 -
 tools/perf/util/fncache.c          | 63 ------------------------------
 tools/perf/util/fncache.h          |  7 ----
 tools/perf/util/pmu-hybrid.c       |  1 -
 tools/perf/util/pmu.c              |  1 -
 tools/perf/util/python-ext-sources |  1 -
 tools/perf/util/srccode.c          | 10 ++++-
 12 files changed, 75 insertions(+), 77 deletions(-)
 create mode 100644 tools/lib/api/fs/fncache.c
 delete mode 100644 tools/perf/util/fncache.c
 delete mode 100644 tools/perf/util/fncache.h

diff --git a/tools/lib/api/fs/Build b/tools/lib/api/fs/Build
index 0f75b28654de..3af4b5265a5f 100644
--- a/tools/lib/api/fs/Build
+++ b/tools/lib/api/fs/Build
@@ -1,3 +1,4 @@
 libapi-y += fs.o
 libapi-y += tracing_path.o
 libapi-y += cgroup.o
+libapi-y += fncache.o
diff --git a/tools/lib/api/fs/fncache.c b/tools/lib/api/fs/fncache.c
new file mode 100644
index 000000000000..7fb4586c341a
--- /dev/null
+++ b/tools/lib/api/fs/fncache.c
@@ -0,0 +1,63 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/* Manage a cache of file names' existence */
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <linux/list.h>
+#include "fs.h"
+
+struct fncache {
+	struct hlist_node nd;
+	bool res;
+	char name[];
+};
+
+#define FNHSIZE 61
+
+static struct hlist_head fncache_hash[FNHSIZE];
+
+static unsigned shash(const unsigned char *s)
+{
+	unsigned h = 0;
+	while (*s)
+		h = 65599 * h + *s++;
+	return h ^ (h >> 16);
+}
+
+static bool lookup_fncache(const char *name, bool *res)
+{
+	int h = shash((const unsigned char *)name) % FNHSIZE;
+	struct fncache *n;
+
+	hlist_for_each_entry(n, &fncache_hash[h], nd) {
+		if (!strcmp(n->name, name)) {
+			*res = n->res;
+			return true;
+		}
+	}
+	return false;
+}
+
+static void update_fncache(const char *name, bool res)
+{
+	struct fncache *n = malloc(sizeof(struct fncache) + strlen(name) + 1);
+	int h = shash((const unsigned char *)name) % FNHSIZE;
+
+	if (!n)
+		return;
+	strcpy(n->name, name);
+	n->res = res;
+	hlist_add_head(&n->nd, &fncache_hash[h]);
+}
+
+/* No LRU, only use when bounded in some other way. */
+bool file_available(const char *name)
+{
+	bool res;
+
+	if (lookup_fncache(name, &res))
+		return res;
+	res = access(name, R_OK) == 0;
+	update_fncache(name, res);
+	return res;
+}
diff --git a/tools/lib/api/fs/fs.h b/tools/lib/api/fs/fs.h
index aa222ca30311..c42d4ff30ca7 100644
--- a/tools/lib/api/fs/fs.h
+++ b/tools/lib/api/fs/fs.h
@@ -59,4 +59,6 @@ int sysfs__read_str(const char *entry, char **buf, size_t *sizep);
 int sysfs__read_bool(const char *entry, bool *value);
 
 int sysfs__write_int(const char *entry, int value);
+
+bool file_available(const char *name);
 #endif /* __API_FS__ */
diff --git a/tools/perf/arch/x86/util/pmu.c b/tools/perf/arch/x86/util/pmu.c
index 74d69db1ea99..c875dded65bb 100644
--- a/tools/perf/arch/x86/util/pmu.c
+++ b/tools/perf/arch/x86/util/pmu.c
@@ -13,7 +13,6 @@
 #include "../../../util/intel-pt.h"
 #include "../../../util/intel-bts.h"
 #include "../../../util/pmu.h"
-#include "../../../util/fncache.h"
 
 #define TEMPLATE_ALIAS	"%s/bus/event_source/devices/%s/alias"
 
diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
index 8875e388563e..69381fe1655d 100644
--- a/tools/perf/tests/parse-events.c
+++ b/tools/perf/tests/parse-events.c
@@ -9,7 +9,6 @@
 #include "pmu-hybrid.h"
 #include <dirent.h>
 #include <errno.h>
-#include "fncache.h"
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 03d5d6ed7fe4..b93828aacc27 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -52,7 +52,6 @@ perf-y += header.o
 perf-y += callchain.o
 perf-y += values.o
 perf-y += debug.o
-perf-y += fncache.o
 perf-y += machine.o
 perf-y += map.o
 perf-y += pstack.o
diff --git a/tools/perf/util/fncache.c b/tools/perf/util/fncache.c
deleted file mode 100644
index 6225cbc52310..000000000000
--- a/tools/perf/util/fncache.c
+++ /dev/null
@@ -1,63 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/* Manage a cache of file names' existence */
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <linux/list.h>
-#include "fncache.h"
-
-struct fncache {
-	struct hlist_node nd;
-	bool res;
-	char name[];
-};
-
-#define FNHSIZE 61
-
-static struct hlist_head fncache_hash[FNHSIZE];
-
-unsigned shash(const unsigned char *s)
-{
-	unsigned h = 0;
-	while (*s)
-		h = 65599 * h + *s++;
-	return h ^ (h >> 16);
-}
-
-static bool lookup_fncache(const char *name, bool *res)
-{
-	int h = shash((const unsigned char *)name) % FNHSIZE;
-	struct fncache *n;
-
-	hlist_for_each_entry(n, &fncache_hash[h], nd) {
-		if (!strcmp(n->name, name)) {
-			*res = n->res;
-			return true;
-		}
-	}
-	return false;
-}
-
-static void update_fncache(const char *name, bool res)
-{
-	struct fncache *n = malloc(sizeof(struct fncache) + strlen(name) + 1);
-	int h = shash((const unsigned char *)name) % FNHSIZE;
-
-	if (!n)
-		return;
-	strcpy(n->name, name);
-	n->res = res;
-	hlist_add_head(&n->nd, &fncache_hash[h]);
-}
-
-/* No LRU, only use when bounded in some other way. */
-bool file_available(const char *name)
-{
-	bool res;
-
-	if (lookup_fncache(name, &res))
-		return res;
-	res = access(name, R_OK) == 0;
-	update_fncache(name, res);
-	return res;
-}
diff --git a/tools/perf/util/fncache.h b/tools/perf/util/fncache.h
deleted file mode 100644
index fe020beaefb1..000000000000
--- a/tools/perf/util/fncache.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef _FCACHE_H
-#define _FCACHE_H 1
-
-unsigned shash(const unsigned char *s);
-bool file_available(const char *name);
-
-#endif
diff --git a/tools/perf/util/pmu-hybrid.c b/tools/perf/util/pmu-hybrid.c
index f51ccaac60ee..65fdce81a384 100644
--- a/tools/perf/util/pmu-hybrid.c
+++ b/tools/perf/util/pmu-hybrid.c
@@ -13,7 +13,6 @@
 #include <stdarg.h>
 #include <locale.h>
 #include <api/fs/fs.h>
-#include "fncache.h"
 #include "pmu-hybrid.h"
 
 LIST_HEAD(perf_pmu__hybrid_pmus);
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index 55d834160428..13e1835955e0 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -26,7 +26,6 @@
 #include "header.h"
 #include "string2.h"
 #include "strbuf.h"
-#include "fncache.h"
 #include "pmu-hybrid.h"
 
 struct perf_pmu perf_pmu__fake;
diff --git a/tools/perf/util/python-ext-sources b/tools/perf/util/python-ext-sources
index a685d20165f7..992a76c2af01 100644
--- a/tools/perf/util/python-ext-sources
+++ b/tools/perf/util/python-ext-sources
@@ -39,4 +39,3 @@ util/affinity.c
 util/rwsem.c
 util/hashmap.c
 util/pmu-hybrid.c
-util/fncache.c
diff --git a/tools/perf/util/srccode.c b/tools/perf/util/srccode.c
index 476e99896d5e..5c1ff87eb98c 100644
--- a/tools/perf/util/srccode.c
+++ b/tools/perf/util/srccode.c
@@ -16,7 +16,7 @@
 #include "srccode.h"
 #include "debug.h"
 #include <internal/lib.h> // page_size
-#include "fncache.h"
+#include <api/fs/fs.h>
 
 #define MAXSRCCACHE (32*1024*1024)
 #define MAXSRCFILES     64
@@ -86,6 +86,14 @@ static void free_srcfile(struct srcfile *sf)
 	num_srcfiles--;
 }
 
+static unsigned shash(const unsigned char *s)
+{
+	unsigned h = 0;
+	while (*s)
+		h = 65599 * h + *s++;
+	return h ^ (h >> 16);
+}
+
 static struct srcfile *find_srcfile(char *fn)
 {
 	struct stat st;
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 06/59] libperf: Move in the pmu hybrid support
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (3 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 05/59] tools api fs: Move in the fncache from perf Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 07/59] libperf: Move name to perf_evsel Jiri Olsa
                   ` (53 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving in libperf the pmu hybrid support.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/Build                         |  1 +
 tools/lib/perf/Makefile                      |  1 +
 tools/lib/perf/include/internal/pmu-hybrid.h | 33 ++++++++
 tools/lib/perf/include/internal/pmu.h        | 28 +++++++
 tools/lib/perf/pmu-hybrid.c                  | 88 ++++++++++++++++++++
 tools/perf/builtin-c2c.c                     |  2 +-
 tools/perf/builtin-list.c                    |  2 +-
 tools/perf/builtin-mem.c                     |  2 +-
 tools/perf/builtin-record.c                  |  2 +-
 tools/perf/builtin-stat.c                    |  2 +-
 tools/perf/tests/evsel-roundtrip-name.c      |  2 +-
 tools/perf/tests/parse-events.c              |  2 +-
 tools/perf/tests/perf-time-to-tsc.c          |  2 +-
 tools/perf/util/Build                        |  1 -
 tools/perf/util/cputopo.c                    |  2 +-
 tools/perf/util/evlist-hybrid.c              |  3 +-
 tools/perf/util/evsel.c                      |  2 +-
 tools/perf/util/header.c                     |  2 +-
 tools/perf/util/mem-events.c                 |  2 +-
 tools/perf/util/metricgroup.c                |  2 +-
 tools/perf/util/parse-events-hybrid.c        |  2 +-
 tools/perf/util/parse-events.c               |  2 +-
 tools/perf/util/pmu-hybrid.c                 | 88 --------------------
 tools/perf/util/pmu-hybrid.h                 | 33 --------
 tools/perf/util/pmu.c                        |  2 +-
 tools/perf/util/pmu.h                        | 27 ------
 tools/perf/util/python-ext-sources           |  1 -
 tools/perf/util/stat-display.c               |  3 +-
 28 files changed, 171 insertions(+), 168 deletions(-)
 create mode 100644 tools/lib/perf/include/internal/pmu-hybrid.h
 create mode 100644 tools/lib/perf/pmu-hybrid.c
 delete mode 100644 tools/perf/util/pmu-hybrid.c
 delete mode 100644 tools/perf/util/pmu-hybrid.h

diff --git a/tools/lib/perf/Build b/tools/lib/perf/Build
index 275ec24cad7b..006a9bef9566 100644
--- a/tools/lib/perf/Build
+++ b/tools/lib/perf/Build
@@ -10,6 +10,7 @@ libperf-y += lib.o
 libperf-y += pmu-flex.o
 libperf-y += pmu-bison.o
 libperf-y += pmu.o
+libperf-y += pmu-hybrid.o
 
 $(OUTPUT)zalloc.o: ../../lib/zalloc.c FORCE
 	$(call rule_mkdir)
diff --git a/tools/lib/perf/Makefile b/tools/lib/perf/Makefile
index bb6f53c215ad..344cfb801408 100644
--- a/tools/lib/perf/Makefile
+++ b/tools/lib/perf/Makefile
@@ -86,6 +86,7 @@ override CFLAGS += -Werror -Wall
 override CFLAGS += -fPIC
 override CFLAGS += $(INCLUDES)
 override CFLAGS += -fvisibility=hidden
+override CFLAGS += -D_GNU_SOURCE
 
 all:
 
diff --git a/tools/lib/perf/include/internal/pmu-hybrid.h b/tools/lib/perf/include/internal/pmu-hybrid.h
new file mode 100644
index 000000000000..8a2fe7abffea
--- /dev/null
+++ b/tools/lib/perf/include/internal/pmu-hybrid.h
@@ -0,0 +1,33 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __PMU_HYBRID_H
+#define __PMU_HYBRID_H
+
+#include <linux/perf_event.h>
+#include <linux/compiler.h>
+#include <linux/list.h>
+#include <stdbool.h>
+#include <internal/pmu.h>
+
+extern struct list_head perf_pmu__hybrid_pmus;
+
+#define perf_pmu__for_each_hybrid_pmu(pmu)	\
+	list_for_each_entry(pmu, &perf_pmu__hybrid_pmus, hybrid_list)
+
+bool perf_pmu__hybrid_mounted(const char *name);
+
+struct perf_pmu *perf_pmu__find_hybrid_pmu(const char *name);
+bool perf_pmu__is_hybrid(const char *name);
+char *perf_pmu__hybrid_type_to_pmu(const char *type);
+
+static inline int perf_pmu__hybrid_pmu_num(void)
+{
+	struct perf_pmu *pmu;
+	int num = 0;
+
+	perf_pmu__for_each_hybrid_pmu(pmu)
+		num++;
+
+	return num;
+}
+
+#endif /* __PMU_HYBRID_H */
diff --git a/tools/lib/perf/include/internal/pmu.h b/tools/lib/perf/include/internal/pmu.h
index 2c742acd933c..b8a78e024f6d 100644
--- a/tools/lib/perf/include/internal/pmu.h
+++ b/tools/lib/perf/include/internal/pmu.h
@@ -12,6 +12,7 @@ enum {
 };
 
 #define PERF_PMU_FORMAT_BITS 64
+#define CPUS_TEMPLATE_CPU       "%s/bus/event_source/devices/%s/cpus"
 
 struct perf_pmu_format {
 	char *name;
@@ -20,6 +21,33 @@ struct perf_pmu_format {
 	struct list_head list;
 };
 
+struct perf_pmu_caps {
+	char *name;
+	char *value;
+	struct list_head list;
+};
+
+struct perf_event_attr;
+
+struct perf_pmu {
+	char *name;
+	char *alias_name;
+	char *id;
+	__u32 type;
+	bool selectable;
+	bool is_uncore;
+	bool is_hybrid;
+	bool auxtrace;
+	int max_precise;
+	struct perf_event_attr *default_config;
+	struct perf_cpu_map *cpus;
+	struct list_head format;  /* HEAD struct perf_pmu_format -> list */
+	struct list_head aliases; /* HEAD struct perf_pmu_alias -> list */
+	struct list_head caps;    /* HEAD struct perf_pmu_caps -> list */
+	struct list_head list;    /* ELEM */
+	struct list_head hybrid_list;
+};
+
 int perf_pmu__new_format(struct list_head *list, char *name,
 			 int config, unsigned long *bits);
 void perf_pmu__set_format(unsigned long *bits, long from, long to);
diff --git a/tools/lib/perf/pmu-hybrid.c b/tools/lib/perf/pmu-hybrid.c
new file mode 100644
index 000000000000..ffc214e77236
--- /dev/null
+++ b/tools/lib/perf/pmu-hybrid.c
@@ -0,0 +1,88 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/list.h>
+#include <linux/compiler.h>
+#include <linux/string.h>
+#include <linux/zalloc.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <stdarg.h>
+#include <locale.h>
+#include <api/fs/fs.h>
+#include <internal/pmu-hybrid.h>
+
+LIST_HEAD(perf_pmu__hybrid_pmus);
+
+bool perf_pmu__hybrid_mounted(const char *name)
+{
+	char path[PATH_MAX];
+	const char *sysfs;
+	FILE *file;
+	int n, cpu;
+
+	if (strncmp(name, "cpu_", 4))
+		return false;
+
+	sysfs = sysfs__mountpoint();
+	if (!sysfs)
+		return false;
+
+	snprintf(path, PATH_MAX, CPUS_TEMPLATE_CPU, sysfs, name);
+	if (!file_available(path))
+		return false;
+
+	file = fopen(path, "r");
+	if (!file)
+		return false;
+
+	n = fscanf(file, "%u", &cpu);
+	fclose(file);
+	if (n <= 0)
+		return false;
+
+	return true;
+}
+
+struct perf_pmu *perf_pmu__find_hybrid_pmu(const char *name)
+{
+	struct perf_pmu *pmu;
+
+	if (!name)
+		return NULL;
+
+	perf_pmu__for_each_hybrid_pmu(pmu) {
+		if (!strcmp(name, pmu->name))
+			return pmu;
+	}
+
+	return NULL;
+}
+
+bool perf_pmu__is_hybrid(const char *name)
+{
+	return perf_pmu__find_hybrid_pmu(name) != NULL;
+}
+
+char *perf_pmu__hybrid_type_to_pmu(const char *type)
+{
+	char *pmu_name = NULL;
+
+	if (asprintf(&pmu_name, "cpu_%s", type) < 0)
+		return NULL;
+
+	if (perf_pmu__is_hybrid(pmu_name))
+		return pmu_name;
+
+	/*
+	 * pmu may be not scanned, check the sysfs.
+	 */
+	if (perf_pmu__hybrid_mounted(pmu_name))
+		return pmu_name;
+
+	free(pmu_name);
+	return NULL;
+}
diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c
index a192014fa52b..9fe90eeb2730 100644
--- a/tools/perf/builtin-c2c.c
+++ b/tools/perf/builtin-c2c.c
@@ -43,7 +43,7 @@
 #include "ui/progress.h"
 #include "../perf.h"
 #include "pmu.h"
-#include "pmu-hybrid.h"
+#include <internal/pmu-hybrid.h>
 
 struct c2c_hists {
 	struct hists		hists;
diff --git a/tools/perf/builtin-list.c b/tools/perf/builtin-list.c
index 468958154ed9..bf62760edbb9 100644
--- a/tools/perf/builtin-list.c
+++ b/tools/perf/builtin-list.c
@@ -12,7 +12,7 @@
 
 #include "util/parse-events.h"
 #include "util/pmu.h"
-#include "util/pmu-hybrid.h"
+#include <internal/pmu-hybrid.h>
 #include "util/debug.h"
 #include "util/metricgroup.h"
 #include <subcmd/pager.h>
diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index fcf65a59bea2..49fc462b6d65 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -19,7 +19,7 @@
 #include "util/map.h"
 #include "util/symbol.h"
 #include "util/pmu.h"
-#include "util/pmu-hybrid.h"
+#include <internal/pmu-hybrid.h>
 #include <linux/err.h>
 
 #define MEM_OPERATION_LOAD	0x1
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 78185c982ebf..0f7440351842 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -47,7 +47,7 @@
 #include "util/util.h"
 #include "util/pfm.h"
 #include "util/clockid.h"
-#include "util/pmu-hybrid.h"
+#include <internal/pmu-hybrid.h>
 #include "util/evlist-hybrid.h"
 #include "asm/bug.h"
 #include "perf.h"
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index f0ecfda34ece..4157faf03b2e 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -70,7 +70,7 @@
 #include "util/pfm.h"
 #include "util/bpf_counter.h"
 #include "util/iostat.h"
-#include "util/pmu-hybrid.h"
+#include <internal/pmu-hybrid.h>
 #include "asm/bug.h"
 
 #include <linux/time64.h>
diff --git a/tools/perf/tests/evsel-roundtrip-name.c b/tools/perf/tests/evsel-roundtrip-name.c
index 4e09f0a312af..c421e8137d74 100644
--- a/tools/perf/tests/evsel-roundtrip-name.c
+++ b/tools/perf/tests/evsel-roundtrip-name.c
@@ -5,7 +5,7 @@
 #include "tests.h"
 #include "debug.h"
 #include "pmu.h"
-#include "pmu-hybrid.h"
+#include <internal/pmu-hybrid.h>
 #include <errno.h>
 #include <linux/kernel.h>
 
diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
index 69381fe1655d..d39aaeeaad0f 100644
--- a/tools/perf/tests/parse-events.c
+++ b/tools/perf/tests/parse-events.c
@@ -6,7 +6,7 @@
 #include "tests.h"
 #include "debug.h"
 #include "pmu.h"
-#include "pmu-hybrid.h"
+#include <internal/pmu-hybrid.h>
 #include <dirent.h>
 #include <errno.h>
 #include <sys/types.h>
diff --git a/tools/perf/tests/perf-time-to-tsc.c b/tools/perf/tests/perf-time-to-tsc.c
index 7c56bc1f4cff..82b23eb6e1f7 100644
--- a/tools/perf/tests/perf-time-to-tsc.c
+++ b/tools/perf/tests/perf-time-to-tsc.c
@@ -21,7 +21,7 @@
 #include "mmap.h"
 #include "tests.h"
 #include "pmu.h"
-#include "pmu-hybrid.h"
+#include <internal/pmu-hybrid.h>
 
 #define CHECK__(x) {				\
 	while ((x) < 0) {			\
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index b93828aacc27..1d697cecf4ea 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -69,7 +69,6 @@ perf-y += trace-event-parse.o
 perf-y += parse-events-flex.o
 perf-y += parse-events-bison.o
 perf-y += pmu.o
-perf-y += pmu-hybrid.o
 perf-y += trace-event-read.o
 perf-y += trace-event-info.o
 perf-y += trace-event-scripting.o
diff --git a/tools/perf/util/cputopo.c b/tools/perf/util/cputopo.c
index ec77e2a7b3ca..2520d2549d9e 100644
--- a/tools/perf/util/cputopo.c
+++ b/tools/perf/util/cputopo.c
@@ -7,12 +7,12 @@
 #include <api/fs/fs.h>
 #include <linux/zalloc.h>
 #include <perf/cpumap.h>
+#include <internal/pmu-hybrid.h>
 
 #include "cputopo.h"
 #include "cpumap.h"
 #include "debug.h"
 #include "env.h"
-#include "pmu-hybrid.h"
 
 #define CORE_SIB_FMT \
 	"%s/devices/system/cpu/cpu%d/topology/core_siblings_list"
diff --git a/tools/perf/util/evlist-hybrid.c b/tools/perf/util/evlist-hybrid.c
index 7c554234b43d..67c53acfaa29 100644
--- a/tools/perf/util/evlist-hybrid.c
+++ b/tools/perf/util/evlist-hybrid.c
@@ -5,9 +5,10 @@
 #include "evlist.h"
 #include "evsel.h"
 #include "../perf.h"
-#include "util/pmu-hybrid.h"
+#include <internal/pmu-hybrid.h>
 #include "util/evlist-hybrid.h"
 #include "debug.h"
+#include "pmu.h"
 #include <unistd.h>
 #include <stdlib.h>
 #include <linux/err.h>
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 2cfc2935d1d2..d1e580c88be7 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -47,11 +47,11 @@
 #include "memswap.h"
 #include "util.h"
 #include "hashmap.h"
-#include "pmu-hybrid.h"
 #include "../perf-sys.h"
 #include "util/parse-branch-options.h"
 #include <internal/xyarray.h>
 #include <internal/lib.h>
+#include <internal/pmu-hybrid.h>
 
 #include <linux/ctype.h>
 
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 1c7414f66655..971ae4744895 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -49,10 +49,10 @@
 #include "cputopo.h"
 #include "bpf-event.h"
 #include "clockid.h"
-#include "pmu-hybrid.h"
 
 #include <linux/ctype.h>
 #include <internal/lib.h>
+#include <internal/pmu-hybrid.h>
 
 /*
  * magic2 = "PERFILE2"
diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index f0e75df72b80..fb5f51432335 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -13,7 +13,7 @@
 #include "debug.h"
 #include "symbol.h"
 #include "pmu.h"
-#include "pmu-hybrid.h"
+#include <internal/pmu-hybrid.h>
 
 unsigned int perf_mem_events__loads_ldlat = 30;
 
diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
index 4917e9704765..4a533740c939 100644
--- a/tools/perf/util/metricgroup.c
+++ b/tools/perf/util/metricgroup.c
@@ -11,7 +11,7 @@
 #include "evsel.h"
 #include "strbuf.h"
 #include "pmu.h"
-#include "pmu-hybrid.h"
+#include <internal/pmu-hybrid.h>
 #include "expr.h"
 #include "rblist.h"
 #include <string.h>
diff --git a/tools/perf/util/parse-events-hybrid.c b/tools/perf/util/parse-events-hybrid.c
index 9fc86971027b..de901e74ce3d 100644
--- a/tools/perf/util/parse-events-hybrid.c
+++ b/tools/perf/util/parse-events-hybrid.c
@@ -12,7 +12,7 @@
 #include "parse-events-hybrid.h"
 #include "debug.h"
 #include "pmu.h"
-#include "pmu-hybrid.h"
+#include <internal/pmu-hybrid.h>
 #include "perf.h"
 
 static void config_hybrid_attr(struct perf_event_attr *attr,
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 278199ed788b..84c4ef32034b 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -36,7 +36,7 @@
 #include "util/event.h"
 #include "util/pfm.h"
 #include "util/parse-events-hybrid.h"
-#include "util/pmu-hybrid.h"
+#include <internal/pmu-hybrid.h>
 #include "perf.h"
 
 #define MAX_NAME_LEN 100
diff --git a/tools/perf/util/pmu-hybrid.c b/tools/perf/util/pmu-hybrid.c
deleted file mode 100644
index 65fdce81a384..000000000000
--- a/tools/perf/util/pmu-hybrid.c
+++ /dev/null
@@ -1,88 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#include <linux/list.h>
-#include <linux/compiler.h>
-#include <linux/string.h>
-#include <linux/zalloc.h>
-#include <sys/types.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdbool.h>
-#include <stdarg.h>
-#include <locale.h>
-#include <api/fs/fs.h>
-#include "pmu-hybrid.h"
-
-LIST_HEAD(perf_pmu__hybrid_pmus);
-
-bool perf_pmu__hybrid_mounted(const char *name)
-{
-	char path[PATH_MAX];
-	const char *sysfs;
-	FILE *file;
-	int n, cpu;
-
-	if (strncmp(name, "cpu_", 4))
-		return false;
-
-	sysfs = sysfs__mountpoint();
-	if (!sysfs)
-		return false;
-
-	snprintf(path, PATH_MAX, CPUS_TEMPLATE_CPU, sysfs, name);
-	if (!file_available(path))
-		return false;
-
-	file = fopen(path, "r");
-	if (!file)
-		return false;
-
-	n = fscanf(file, "%u", &cpu);
-	fclose(file);
-	if (n <= 0)
-		return false;
-
-	return true;
-}
-
-struct perf_pmu *perf_pmu__find_hybrid_pmu(const char *name)
-{
-	struct perf_pmu *pmu;
-
-	if (!name)
-		return NULL;
-
-	perf_pmu__for_each_hybrid_pmu(pmu) {
-		if (!strcmp(name, pmu->name))
-			return pmu;
-	}
-
-	return NULL;
-}
-
-bool perf_pmu__is_hybrid(const char *name)
-{
-	return perf_pmu__find_hybrid_pmu(name) != NULL;
-}
-
-char *perf_pmu__hybrid_type_to_pmu(const char *type)
-{
-	char *pmu_name = NULL;
-
-	if (asprintf(&pmu_name, "cpu_%s", type) < 0)
-		return NULL;
-
-	if (perf_pmu__is_hybrid(pmu_name))
-		return pmu_name;
-
-	/*
-	 * pmu may be not scanned, check the sysfs.
-	 */
-	if (perf_pmu__hybrid_mounted(pmu_name))
-		return pmu_name;
-
-	free(pmu_name);
-	return NULL;
-}
diff --git a/tools/perf/util/pmu-hybrid.h b/tools/perf/util/pmu-hybrid.h
deleted file mode 100644
index 2b186c26a43e..000000000000
--- a/tools/perf/util/pmu-hybrid.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef __PMU_HYBRID_H
-#define __PMU_HYBRID_H
-
-#include <linux/perf_event.h>
-#include <linux/compiler.h>
-#include <linux/list.h>
-#include <stdbool.h>
-#include "pmu.h"
-
-extern struct list_head perf_pmu__hybrid_pmus;
-
-#define perf_pmu__for_each_hybrid_pmu(pmu)	\
-	list_for_each_entry(pmu, &perf_pmu__hybrid_pmus, hybrid_list)
-
-bool perf_pmu__hybrid_mounted(const char *name);
-
-struct perf_pmu *perf_pmu__find_hybrid_pmu(const char *name);
-bool perf_pmu__is_hybrid(const char *name);
-char *perf_pmu__hybrid_type_to_pmu(const char *type);
-
-static inline int perf_pmu__hybrid_pmu_num(void)
-{
-	struct perf_pmu *pmu;
-	int num = 0;
-
-	perf_pmu__for_each_hybrid_pmu(pmu)
-		num++;
-
-	return num;
-}
-
-#endif /* __PMU_HYBRID_H */
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index 13e1835955e0..5bda7796f91a 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -26,7 +26,7 @@
 #include "header.h"
 #include "string2.h"
 #include "strbuf.h"
-#include "pmu-hybrid.h"
+#include <internal/pmu-hybrid.h>
 
 struct perf_pmu perf_pmu__fake;
 
diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h
index 3127c877e043..091f49a655f8 100644
--- a/tools/perf/util/pmu.h
+++ b/tools/perf/util/pmu.h
@@ -19,33 +19,6 @@ struct perf_cpu_map;
 #define CPUS_TEMPLATE_CPU	"%s/bus/event_source/devices/%s/cpus"
 #define MAX_PMU_NAME_LEN 128
 
-struct perf_event_attr;
-
-struct perf_pmu_caps {
-	char *name;
-	char *value;
-	struct list_head list;
-};
-
-struct perf_pmu {
-	char *name;
-	char *alias_name;
-	char *id;
-	__u32 type;
-	bool selectable;
-	bool is_uncore;
-	bool is_hybrid;
-	bool auxtrace;
-	int max_precise;
-	struct perf_event_attr *default_config;
-	struct perf_cpu_map *cpus;
-	struct list_head format;  /* HEAD struct perf_pmu_format -> list */
-	struct list_head aliases; /* HEAD struct perf_pmu_alias -> list */
-	struct list_head caps;    /* HEAD struct perf_pmu_caps -> list */
-	struct list_head list;    /* ELEM */
-	struct list_head hybrid_list;
-};
-
 extern struct perf_pmu perf_pmu__fake;
 
 struct perf_pmu_info {
diff --git a/tools/perf/util/python-ext-sources b/tools/perf/util/python-ext-sources
index 992a76c2af01..d36348c4d788 100644
--- a/tools/perf/util/python-ext-sources
+++ b/tools/perf/util/python-ext-sources
@@ -38,4 +38,3 @@ util/units.c
 util/affinity.c
 util/rwsem.c
 util/hashmap.c
-util/pmu-hybrid.c
diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c
index 588601000f3f..e3ffc084cb09 100644
--- a/tools/perf/util/stat-display.c
+++ b/tools/perf/util/stat-display.c
@@ -18,8 +18,9 @@
 #include <api/fs/fs.h>
 #include "util.h"
 #include "iostat.h"
-#include "pmu-hybrid.h"
+#include <internal/pmu-hybrid.h>
 #include "evlist-hybrid.h"
+#include "pmu.h"
 
 #define CNTR_NOT_SUPPORTED	"<not supported>"
 #define CNTR_NOT_COUNTED	"<not counted>"
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 07/59] libperf: Move name to perf_evsel
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (4 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 06/59] libperf: Move in the pmu hybrid support Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 08/59] libperf: Move auto_merge_stats " Jiri Olsa
                   ` (52 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving name to perf_evsel struct.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/evsel.h |  9 ++++++
 tools/perf/arch/x86/util/kvm-stat.c     |  8 +++---
 tools/perf/builtin-kvm.c                |  6 ++--
 tools/perf/builtin-record.c             |  8 +++---
 tools/perf/builtin-stat.c               | 10 +++----
 tools/perf/builtin-trace.c              | 12 ++++----
 tools/perf/tests/evsel-tp-sched.c       |  6 ++--
 tools/perf/tests/expand-cgroup.c        |  6 ++--
 tools/perf/tests/parse-events.c         | 12 ++++----
 tools/perf/tests/parse-metric.c         |  4 +--
 tools/perf/util/arm-spe.c               |  6 ++--
 tools/perf/util/evlist-hybrid.c         |  2 +-
 tools/perf/util/evlist.c                | 14 ++++-----
 tools/perf/util/evsel.c                 | 38 ++++++++++++-------------
 tools/perf/util/evsel.h                 |  1 -
 tools/perf/util/header.c                | 22 +++++++-------
 tools/perf/util/intel-pt.c              |  6 ++--
 tools/perf/util/metricgroup.c           | 10 +++----
 tools/perf/util/parse-events.c          |  8 +++---
 tools/perf/util/sort.c                  |  6 ++--
 tools/perf/util/stat-display.c          | 16 +++++------
 tools/perf/util/stat-shadow.c           | 14 ++++-----
 tools/perf/util/synthetic-events.c      |  4 +--
 tools/perf/util/trace-event-info.c      |  6 ++--
 24 files changed, 121 insertions(+), 113 deletions(-)

diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
index 1f3eacbad2e8..808720b4cf77 100644
--- a/tools/lib/perf/include/internal/evsel.h
+++ b/tools/lib/perf/include/internal/evsel.h
@@ -51,6 +51,15 @@ struct perf_evsel {
 	int			 nr_members;
 	bool			 system_wide;
 	int			 idx;
+
+	/*
+	 * These fields can be set in the parse-events code or similar.
+	 * Please check evsel__clone() to copy them properly so that
+	 * they can be released properly.
+	 */
+        struct {
+                char			*name;
+	};
 };
 
 void perf_evsel__init(struct perf_evsel *evsel, struct perf_event_attr *attr,
diff --git a/tools/perf/arch/x86/util/kvm-stat.c b/tools/perf/arch/x86/util/kvm-stat.c
index c5dd54f6ef5e..3c0e0c1cf663 100644
--- a/tools/perf/arch/x86/util/kvm-stat.c
+++ b/tools/perf/arch/x86/util/kvm-stat.c
@@ -47,7 +47,7 @@ static bool mmio_event_begin(struct evsel *evsel,
 		return true;
 
 	/* MMIO write begin event in kernel. */
-	if (!strcmp(evsel->name, "kvm:kvm_mmio") &&
+	if (!strcmp(evsel->core.name, "kvm:kvm_mmio") &&
 	    evsel__intval(evsel, sample, "type") == KVM_TRACE_MMIO_WRITE) {
 		mmio_event_get_key(evsel, sample, key);
 		return true;
@@ -64,7 +64,7 @@ static bool mmio_event_end(struct evsel *evsel, struct perf_sample *sample,
 		return true;
 
 	/* MMIO read end event in kernel.*/
-	if (!strcmp(evsel->name, "kvm:kvm_mmio") &&
+	if (!strcmp(evsel->core.name, "kvm:kvm_mmio") &&
 	    evsel__intval(evsel, sample, "type") == KVM_TRACE_MMIO_READ) {
 		mmio_event_get_key(evsel, sample, key);
 		return true;
@@ -102,7 +102,7 @@ static bool ioport_event_begin(struct evsel *evsel,
 			       struct perf_sample *sample,
 			       struct event_key *key)
 {
-	if (!strcmp(evsel->name, "kvm:kvm_pio")) {
+	if (!strcmp(evsel->core.name, "kvm:kvm_pio")) {
 		ioport_event_get_key(evsel, sample, key);
 		return true;
 	}
@@ -146,7 +146,7 @@ static bool msr_event_begin(struct evsel *evsel,
 			       struct perf_sample *sample,
 			       struct event_key *key)
 {
-	if (!strcmp(evsel->name, "kvm:kvm_msr")) {
+	if (!strcmp(evsel->core.name, "kvm:kvm_msr")) {
 		msr_event_get_key(evsel, sample, key);
 		return true;
 	}
diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
index c6f352ee57e6..0c582500363e 100644
--- a/tools/perf/builtin-kvm.c
+++ b/tools/perf/builtin-kvm.c
@@ -74,7 +74,7 @@ void exit_event_get_key(struct evsel *evsel,
 
 bool kvm_exit_event(struct evsel *evsel)
 {
-	return !strcmp(evsel->name, kvm_exit_trace);
+	return !strcmp(evsel->core.name, kvm_exit_trace);
 }
 
 bool exit_event_begin(struct evsel *evsel,
@@ -90,7 +90,7 @@ bool exit_event_begin(struct evsel *evsel,
 
 bool kvm_entry_event(struct evsel *evsel)
 {
-	return !strcmp(evsel->name, kvm_entry_trace);
+	return !strcmp(evsel->core.name, kvm_entry_trace);
 }
 
 bool exit_event_end(struct evsel *evsel,
@@ -305,7 +305,7 @@ static bool is_child_event(struct perf_kvm_stat *kvm,
 		return false;
 
 	for (; child_ops->name; child_ops++) {
-		if (!strcmp(evsel->name, child_ops->name)) {
+		if (!strcmp(evsel->core.name, child_ops->name)) {
 			child_ops->get_key(evsel, sample, key);
 			return true;
 		}
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 0f7440351842..d5b899b235be 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -1606,14 +1606,14 @@ static void record__uniquify_name(struct record *rec)
 		if (!evsel__is_hybrid(pos))
 			continue;
 
-		if (strchr(pos->name, '/'))
+		if (strchr(pos->core.name, '/'))
 			continue;
 
 		ret = asprintf(&new_name, "%s/%s/",
-			       pos->pmu_name, pos->name);
+			       pos->pmu_name, pos->core.name);
 		if (ret) {
-			free(pos->name);
-			pos->name = new_name;
+			free(pos->core.name);
+			pos->core.name = new_name;
 		}
 	}
 }
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 4157faf03b2e..f7fda777f122 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -265,9 +265,9 @@ static void evlist__check_cpu_maps(struct evlist *evlist)
 
 		if (verbose) {
 			cpu_map__snprint(leader->core.cpus, buf, sizeof(buf));
-			pr_warning("     %s: %s\n", leader->name, buf);
+			pr_warning("     %s: %s\n", leader->core.name, buf);
 			cpu_map__snprint(evsel->core.cpus, buf, sizeof(buf));
-			pr_warning("     %s: %s\n", evsel->name, buf);
+			pr_warning("     %s: %s\n", evsel->core.name, buf);
 		}
 
 		for_each_group_evsel(pos, leader) {
@@ -466,9 +466,9 @@ static void read_counters(struct timespec *rs)
 
 	evlist__for_each_entry(evsel_list, counter) {
 		if (counter->err)
-			pr_debug("failed to read counter %s\n", counter->name);
+			pr_debug("failed to read counter %s\n", counter->core.name);
 		if (counter->err == 0 && perf_stat_process_counter(&stat_config, counter))
-			pr_warning("failed to process counter %s\n", counter->name);
+			pr_warning("failed to process counter %s\n", counter->core.name);
 		counter->err = 0;
 	}
 }
@@ -2205,7 +2205,7 @@ static void setup_system_wide(int forks)
 
 		evlist__for_each_entry(evsel_list, counter) {
 			if (!counter->core.system_wide &&
-			    strcmp(counter->name, "duration_time")) {
+			    strcmp(counter->core.name, "duration_time")) {
 				return;
 			}
 		}
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 2f1d20553a0a..5c8df351083f 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -2647,7 +2647,7 @@ static int trace__sched_stat_runtime(struct trace *trace, struct evsel *evsel,
 
 out_dump:
 	fprintf(trace->output, "%s: comm=%s,pid=%u,runtime=%" PRIu64 ",vruntime=%" PRIu64 ")\n",
-	       evsel->name,
+	       evsel->core.name,
 	       evsel__strval(evsel, sample, "comm"),
 	       (pid_t)evsel__intval(evsel, sample, "pid"),
 	       runtime,
@@ -2814,7 +2814,7 @@ static int trace__event_handler(struct trace *trace, struct evsel *evsel,
 		 */
 	}
 
-	fprintf(trace->output, "%s(", evsel->name);
+	fprintf(trace->output, "%s(", evsel->core.name);
 
 	if (evsel__is_bpf_output(evsel)) {
 		bpf_output__fprintf(trace, sample);
@@ -3842,7 +3842,7 @@ static int trace__expand_filter(struct trace *trace __maybe_unused, struct evsel
 			fmt = evsel__find_syscall_arg_fmt_by_name(evsel, arg);
 			if (fmt == NULL) {
 				pr_err("\"%s\" not found in \"%s\", can't set filter \"%s\"\n",
-				       arg, evsel->name, evsel->filter);
+				       arg, evsel->core.name, evsel->filter);
 				return -1;
 			}
 
@@ -3873,12 +3873,12 @@ static int trace__expand_filter(struct trace *trace __maybe_unused, struct evsel
 					new_filter = n;
 				} else {
 					pr_err("\"%.*s\" not found for \"%s\" in \"%s\", can't set filter \"%s\"\n",
-					       right_size, right, arg, evsel->name, evsel->filter);
+					       right_size, right, arg, evsel->core.name, evsel->filter);
 					return -1;
 				}
 			} else {
 				pr_err("No resolver (strtoul) for \"%s\" in \"%s\", can't set filter \"%s\"\n",
-				       arg, evsel->name, evsel->filter);
+				       arg, evsel->core.name, evsel->filter);
 				return -1;
 			}
 
@@ -3889,7 +3889,7 @@ static int trace__expand_filter(struct trace *trace __maybe_unused, struct evsel
 	}
 
 	if (new_filter != evsel->filter) {
-		pr_debug("New filter for %s: %s\n", evsel->name, new_filter);
+		pr_debug("New filter for %s: %s\n", evsel->core.name, new_filter);
 		evsel__set_filter(evsel, new_filter);
 		free(new_filter);
 	}
diff --git a/tools/perf/tests/evsel-tp-sched.c b/tools/perf/tests/evsel-tp-sched.c
index f9e34bd26cf3..2ded86bee563 100644
--- a/tools/perf/tests/evsel-tp-sched.c
+++ b/tools/perf/tests/evsel-tp-sched.c
@@ -12,20 +12,20 @@ static int evsel__test_field(struct evsel *evsel, const char *name, int size, bo
 	int ret = 0;
 
 	if (field == NULL) {
-		pr_debug("%s: \"%s\" field not found!\n", evsel->name, name);
+		pr_debug("%s: \"%s\" field not found!\n", evsel->core.name, name);
 		return -1;
 	}
 
 	is_signed = !!(field->flags & TEP_FIELD_IS_SIGNED);
 	if (should_be_signed && !is_signed) {
 		pr_debug("%s: \"%s\" signedness(%d) is wrong, should be %d\n",
-			 evsel->name, name, is_signed, should_be_signed);
+			 evsel->core.name, name, is_signed, should_be_signed);
 		ret = -1;
 	}
 
 	if (field->size != size) {
 		pr_debug("%s: \"%s\" size (%d) should be %d!\n",
-			 evsel->name, name, field->size, size);
+			 evsel->core.name, name, field->size, size);
 		ret = -1;
 	}
 
diff --git a/tools/perf/tests/expand-cgroup.c b/tools/perf/tests/expand-cgroup.c
index 61dec9783a1e..cb57365e6288 100644
--- a/tools/perf/tests/expand-cgroup.c
+++ b/tools/perf/tests/expand-cgroup.c
@@ -36,7 +36,7 @@ static int test_expand_events(struct evlist *evlist,
 	}
 	i = 0;
 	evlist__for_each_entry(evlist, evsel) {
-		ev_name[i] = strdup(evsel->name);
+		ev_name[i] = strdup(evsel->core.name);
 		if (ev_name[i] == NULL) {
 			pr_debug("memory allocation failure\n");
 			goto out;
@@ -61,10 +61,10 @@ static int test_expand_events(struct evlist *evlist,
 
 	i = 0;
 	evlist__for_each_entry(evlist, evsel) {
-		if (strcmp(evsel->name, ev_name[i % nr_events])) {
+		if (strcmp(evsel->core.name, ev_name[i % nr_events])) {
 			pr_debug("event name doesn't match:\n");
 			pr_debug("  evsel[%d]: %s\n  expected: %s\n",
-				 i, evsel->name, ev_name[i % nr_events]);
+				 i, evsel->core.name, ev_name[i % nr_events]);
 			goto out;
 		}
 		if (strcmp(evsel->cgrp->name, cgrp_name[i / nr_events])) {
diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
index d39aaeeaad0f..c06cc2c155fd 100644
--- a/tools/perf/tests/parse-events.c
+++ b/tools/perf/tests/parse-events.c
@@ -1380,7 +1380,7 @@ static int test__checkevent_config_symbol(struct evlist *evlist)
 {
 	struct evsel *evsel = evlist__first(evlist);
 
-	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "insn") == 0);
+	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->core.name, "insn") == 0);
 	return 0;
 }
 
@@ -1388,7 +1388,7 @@ static int test__checkevent_config_raw(struct evlist *evlist)
 {
 	struct evsel *evsel = evlist__first(evlist);
 
-	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "rawpmu") == 0);
+	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->core.name, "rawpmu") == 0);
 	return 0;
 }
 
@@ -1396,7 +1396,7 @@ static int test__checkevent_config_num(struct evlist *evlist)
 {
 	struct evsel *evsel = evlist__first(evlist);
 
-	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "numpmu") == 0);
+	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->core.name, "numpmu") == 0);
 	return 0;
 }
 
@@ -1404,7 +1404,7 @@ static int test__checkevent_config_cache(struct evlist *evlist)
 {
 	struct evsel *evsel = evlist__first(evlist);
 
-	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "cachepmu") == 0);
+	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->core.name, "cachepmu") == 0);
 	return 0;
 }
 
@@ -1417,7 +1417,7 @@ static int test__intel_pt(struct evlist *evlist)
 {
 	struct evsel *evsel = evlist__first(evlist);
 
-	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "intel_pt//u") == 0);
+	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->core.name, "intel_pt//u") == 0);
 	return 0;
 }
 
@@ -1425,7 +1425,7 @@ static int test__checkevent_complex_name(struct evlist *evlist)
 {
 	struct evsel *evsel = evlist__first(evlist);
 
-	TEST_ASSERT_VAL("wrong complex name parsing", strcmp(evsel->name, "COMPLEX_CYCLES_NAME:orig=cycles,desc=chip-clock-ticks") == 0);
+	TEST_ASSERT_VAL("wrong complex name parsing", strcmp(evsel->core.name, "COMPLEX_CYCLES_NAME:orig=cycles,desc=chip-clock-ticks") == 0);
 	return 0;
 }
 
diff --git a/tools/perf/tests/parse-metric.c b/tools/perf/tests/parse-metric.c
index 23ed50c26368..83f769ce1517 100644
--- a/tools/perf/tests/parse-metric.c
+++ b/tools/perf/tests/parse-metric.c
@@ -110,9 +110,9 @@ static void load_runtime_stat(struct runtime_stat *st, struct evlist *evlist,
 	u64 count;
 
 	evlist__for_each_entry(evlist, evsel) {
-		count = find_value(evsel->name, vals);
+		count = find_value(evsel->core.name, vals);
 		perf_stat__update_shadow_stats(evsel, count, 0, st);
-		if (!strcmp(evsel->name, "duration_time"))
+		if (!strcmp(evsel->core.name, "duration_time"))
 			update_stats(&walltime_nsecs_stats, count);
 	}
 }
diff --git a/tools/perf/util/arm-spe.c b/tools/perf/util/arm-spe.c
index 58b7069c5a5f..d57b8c0372c4 100644
--- a/tools/perf/util/arm-spe.c
+++ b/tools/perf/util/arm-spe.c
@@ -879,9 +879,9 @@ static void arm_spe_set_event_name(struct evlist *evlist, u64 id,
 
 	evlist__for_each_entry(evlist, evsel) {
 		if (evsel->core.id && evsel->core.id[0] == id) {
-			if (evsel->name)
-				zfree(&evsel->name);
-			evsel->name = strdup(name);
+			if (evsel->core.name)
+				zfree(&evsel->core.name);
+			evsel->core.name = strdup(name);
 			break;
 		}
 	}
diff --git a/tools/perf/util/evlist-hybrid.c b/tools/perf/util/evlist-hybrid.c
index 67c53acfaa29..8dc0776b89f7 100644
--- a/tools/perf/util/evlist-hybrid.c
+++ b/tools/perf/util/evlist-hybrid.c
@@ -136,7 +136,7 @@ int evlist__fix_hybrid_cpus(struct evlist *evlist, const char *cpu_list)
 			if (unmatched_cpus->nr > 0) {
 				cpu_map__snprint(matched_cpus, buf1, sizeof(buf1));
 				pr_warning("WARNING: use %s in '%s' for '%s', skip other cpus in list.\n",
-					   buf1, pmu->name, evsel->name);
+					   buf1, pmu->name, evsel->core.name);
 			}
 		}
 
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index 5f92319ce258..8a2da1365666 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -315,7 +315,7 @@ struct evsel *evlist__find_tracepoint_by_name(struct evlist *evlist, const char
 
 	evlist__for_each_entry(evlist, evsel) {
 		if ((evsel->core.attr.type == PERF_TYPE_TRACEPOINT) &&
-		    (strcmp(evsel->name, name) == 0))
+		    (strcmp(evsel->core.name, name) == 0))
 			return evsel;
 	}
 
@@ -380,7 +380,7 @@ static int evsel__strcmp(struct evsel *pos, char *evsel_name)
 		return 0;
 	if (evsel__is_dummy_event(pos))
 		return 1;
-	return strcmp(pos->name, evsel_name);
+	return strcmp(pos->core.name, evsel_name);
 }
 
 static int evlist__is_enabled(struct evlist *evlist)
@@ -1647,9 +1647,9 @@ struct evsel *evlist__find_evsel_by_str(struct evlist *evlist, const char *str)
 	struct evsel *evsel;
 
 	evlist__for_each_entry(evlist, evsel) {
-		if (!evsel->name)
+		if (!evsel->core.name)
 			continue;
-		if (strcmp(str, evsel->name) == 0)
+		if (strcmp(str, evsel->core.name) == 0)
 			return evsel;
 	}
 
@@ -1748,7 +1748,7 @@ struct evsel *evlist__reset_weak_group(struct evlist *evsel_list, struct evsel *
 	leader = evsel__leader(evsel);
 
 	pr_debug("Weak group for %s/%d failed\n",
-			leader->name, leader->core.nr_members);
+			leader->core.name, leader->core.nr_members);
 
 	/*
 	 * for_each_group_member doesn't work here because it doesn't
@@ -2016,7 +2016,7 @@ static int evlist__ctlfd_enable(struct evlist *evlist, char *cmd_data, bool enab
 				evlist__enable_evsel(evlist, name);
 			else
 				evlist__disable_evsel(evlist, name);
-			pr_info("Event %s %s\n", evsel->name,
+			pr_info("Event %s %s\n", evsel->core.name,
 				enable ? "enabled" : "disabled");
 		} else {
 			pr_info("failed: can't find '%s' event\n", name);
@@ -2161,7 +2161,7 @@ void evlist__check_mem_load_aux(struct evlist *evlist)
 		if (leader == evsel)
 			continue;
 
-		if (leader->name && strstr(leader->name, "mem-loads-aux")) {
+		if (leader->core.name && strstr(leader->core.name, "mem-loads-aux")) {
 			for_each_group_evsel(pos, leader) {
 				evsel__set_leader(pos, pos);
 				pos->core.nr_members = 0;
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index d1e580c88be7..b737f1c60721 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -230,8 +230,8 @@ bool evsel__is_function_event(struct evsel *evsel)
 {
 #define FUNCTION_EVENT "ftrace:function"
 
-	return evsel->name &&
-	       !strncmp(FUNCTION_EVENT, evsel->name, sizeof(FUNCTION_EVENT));
+	return evsel->core.name &&
+	       !strncmp(FUNCTION_EVENT, evsel->core.name, sizeof(FUNCTION_EVENT));
 
 #undef FUNCTION_EVENT
 }
@@ -320,7 +320,7 @@ struct evsel *evsel__new_cycles(bool precise, __u32 type, __u64 config)
 	evsel->precise_max = true;
 
 	/* use asprintf() because free(evsel) assumes name is allocated */
-	if (asprintf(&evsel->name, "cycles%s%s%.*s",
+	if (asprintf(&evsel->core.name, "cycles%s%s%.*s",
 		     (attr.precise_ip || attr.exclude_kernel) ? ":" : "",
 		     attr.exclude_kernel ? "u" : "",
 		     attr.precise_ip ? attr.precise_ip + 1 : 0, "ppp") < 0)
@@ -390,9 +390,9 @@ struct evsel *evsel__clone(struct evsel *orig)
 	evsel->core.nr_members = orig->core.nr_members;
 	evsel->core.system_wide = orig->core.system_wide;
 
-	if (orig->name) {
-		evsel->name = strdup(orig->name);
-		if (evsel->name == NULL)
+	if (orig->core.name) {
+		evsel->core.name = strdup(orig->core.name);
+		if (evsel->core.name == NULL)
 			goto out_err;
 	}
 	if (orig->group_name) {
@@ -465,7 +465,7 @@ struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
 					  PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD),
 		};
 
-		if (asprintf(&evsel->name, "%s:%s", sys, name) < 0)
+		if (asprintf(&evsel->core.name, "%s:%s", sys, name) < 0)
 			goto out_free;
 
 		evsel->tp_format = trace_event__tp_format(sys, name);
@@ -483,7 +483,7 @@ struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
 	return evsel;
 
 out_free:
-	zfree(&evsel->name);
+	zfree(&evsel->core.name);
 	free(evsel);
 out_err:
 	return ERR_PTR(err);
@@ -739,8 +739,8 @@ const char *evsel__name(struct evsel *evsel)
 	if (!evsel)
 		goto out_unknown;
 
-	if (evsel->name)
-		return evsel->name;
+	if (evsel->core.name)
+		return evsel->core.name;
 
 	switch (evsel->core.attr.type) {
 	case PERF_TYPE_RAW:
@@ -776,10 +776,10 @@ const char *evsel__name(struct evsel *evsel)
 		break;
 	}
 
-	evsel->name = strdup(bf);
+	evsel->core.name = strdup(bf);
 
-	if (evsel->name)
-		return evsel->name;
+	if (evsel->core.name)
+		return evsel->core.name;
 out_unknown:
 	return "unknown";
 }
@@ -1018,7 +1018,7 @@ static void evsel__apply_config_terms(struct evsel *evsel,
 				if (parse_callchain_record(callgraph_buf, &param)) {
 					pr_err("per-event callgraph setting for %s failed. "
 					       "Apply callgraph global setting for it\n",
-					       evsel->name);
+					       evsel->core.name);
 					return;
 				}
 				if (param.record_mode == CALLCHAIN_DWARF)
@@ -1437,7 +1437,7 @@ void evsel__exit(struct evsel *evsel)
 	perf_cpu_map__put(evsel->core.own_cpus);
 	perf_thread_map__put(evsel->core.threads);
 	zfree(&evsel->group_name);
-	zfree(&evsel->name);
+	zfree(&evsel->core.name);
 	zfree(&evsel->pmu_name);
 	zfree(&evsel->metric_id);
 	evsel__zero_per_pkg(evsel);
@@ -2762,7 +2762,7 @@ bool evsel__fallback(struct evsel *evsel, int err, char *msg, size_t msgsize)
 		evsel->core.attr.type   = PERF_TYPE_SOFTWARE;
 		evsel->core.attr.config = PERF_COUNT_SW_CPU_CLOCK;
 
-		zfree(&evsel->name);
+		zfree(&evsel->core.name);
 		return true;
 	} else if (err == EACCES && !evsel->core.attr.exclude_kernel &&
 		   (paranoid = perf_event_paranoid()) > 1) {
@@ -2782,9 +2782,9 @@ bool evsel__fallback(struct evsel *evsel, int err, char *msg, size_t msgsize)
 		if (asprintf(&new_name, "%s%su", name, sep) < 0)
 			return false;
 
-		if (evsel->name)
-			free(evsel->name);
-		evsel->name = new_name;
+		if (evsel->core.name)
+			free(evsel->core.name);
+		evsel->core.name = new_name;
 		scnprintf(msg, msgsize, "kernel.perf_event_paranoid=%d, trying "
 			  "to fall back to excluding kernel and hypervisor "
 			  " samples", paranoid);
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index 846c827934de..de6ed7b258ca 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -59,7 +59,6 @@ struct evsel {
 	 * they can be released properly.
 	 */
 	struct {
-		char			*name;
 		char			*group_name;
 		const char		*pmu_name;
 		struct tep_event	*tp_format;
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 971ae4744895..949d24da7000 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -1773,7 +1773,7 @@ static void free_event_desc(struct evsel *events)
 		return;
 
 	for (evsel = events; evsel->core.attr.size; evsel++) {
-		zfree(&evsel->name);
+		zfree(&evsel->core.name);
 		zfree(&evsel->core.id);
 	}
 
@@ -1867,8 +1867,8 @@ static struct evsel *read_event_desc(struct feat_fd *ff)
 		if (ff->ph->needs_swap)
 			evsel->needs_swap = true;
 
-		evsel->name = do_read_string(ff);
-		if (!evsel->name)
+		evsel->core.name = do_read_string(ff);
+		if (!evsel->core.name)
 			goto error;
 
 		if (!nr)
@@ -1918,7 +1918,7 @@ static void print_event_desc(struct feat_fd *ff, FILE *fp)
 	}
 
 	for (evsel = events; evsel->core.attr.size; evsel++) {
-		fprintf(fp, "# event : name = %s, ", evsel->name);
+		fprintf(fp, "# event : name = %s, ", evsel->core.name);
 
 		if (evsel->core.ids) {
 			fprintf(fp, ", id = {");
@@ -2390,17 +2390,17 @@ static void evlist__set_event_name(struct evlist *evlist, struct evsel *event)
 {
 	struct evsel *evsel;
 
-	if (!event->name)
+	if (!event->core.name)
 		return;
 
 	evsel = evlist__find_by_index(evlist, event->core.idx);
 	if (!evsel)
 		return;
 
-	if (evsel->name)
+	if (evsel->core.name)
 		return;
 
-	evsel->name = strdup(event->name);
+	evsel->core.name = strdup(event->core.name);
 }
 
 static int
@@ -3971,10 +3971,10 @@ static int evsel__prepare_tracepoint_event(struct evsel *evsel, struct tep_handl
 		return -1;
 	}
 
-	if (!evsel->name) {
+	if (!evsel->core.name) {
 		snprintf(bf, sizeof(bf), "%s:%s", event->system, event->name);
-		evsel->name = strdup(bf);
-		if (evsel->name == NULL)
+		evsel->core.name = strdup(bf);
+		if (evsel->core.name == NULL)
 			return -1;
 	}
 
@@ -4259,7 +4259,7 @@ int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
 		evsel->unit = strdup(ev->data);
 		break;
 	case PERF_EVENT_UPDATE__NAME:
-		evsel->name = strdup(ev->data);
+		evsel->core.name = strdup(ev->data);
 		break;
 	case PERF_EVENT_UPDATE__SCALE:
 		ev_scale = (struct perf_record_event_update_scale *)ev->data;
diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c
index 556a893508da..80bf68ddb8a9 100644
--- a/tools/perf/util/intel-pt.c
+++ b/tools/perf/util/intel-pt.c
@@ -3276,9 +3276,9 @@ static void intel_pt_set_event_name(struct evlist *evlist, u64 id,
 
 	evlist__for_each_entry(evlist, evsel) {
 		if (evsel->core.id && evsel->core.id[0] == id) {
-			if (evsel->name)
-				zfree(&evsel->name);
-			evsel->name = strdup(name);
+			if (evsel->core.name)
+				zfree(&evsel->core.name);
+			evsel->core.name = strdup(name);
 			break;
 		}
 	}
diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
index 4a533740c939..b54856cb14d0 100644
--- a/tools/perf/util/metricgroup.c
+++ b/tools/perf/util/metricgroup.c
@@ -690,10 +690,10 @@ static int decode_all_metric_ids(struct evlist *perf_evlist, const char *modifie
 		 * If the name is just the parsed event, use the metric-id to
 		 * give a more friendly display version.
 		 */
-		if (strstr(ev->name, "metric-id=")) {
+		if (strstr(ev->core.name, "metric-id=")) {
 			bool has_slash = false;
 
-			free(ev->name);
+			free(ev->core.name);
 			for (cur = strchr(sb.buf, '@') ; cur; cur = strchr(++cur, '@')) {
 				*cur = '/';
 				has_slash = true;
@@ -709,8 +709,8 @@ static int decode_all_metric_ids(struct evlist *perf_evlist, const char *modifie
 				if (ret)
 					break;
 			}
-			ev->name = strdup(sb.buf);
-			if (!ev->name) {
+			ev->core.name = strdup(sb.buf);
+			if (!ev->core.name) {
 				ret = -ENOMEM;
 				break;
 			}
@@ -1565,7 +1565,7 @@ int metricgroup__copy_metric_events(struct evlist *evlist, struct cgroup *cgrp,
 			return -ENOMEM;
 
 		pr_debug("copying metric event for cgroup '%s': %s (idx=%d)\n",
-			 cgrp ? cgrp->name : "root", evsel->name, evsel->core.idx);
+			 cgrp ? cgrp->name : "root", evsel->core.name, evsel->core.idx);
 
 		list_for_each_entry(old_expr, &old_me->head, nd) {
 			new_expr = malloc(sizeof(*new_expr));
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 84c4ef32034b..072ff971e32f 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -387,7 +387,7 @@ __add_event(struct list_head *list, int *idx,
 	evsel->auto_merge_stats = auto_merge_stats;
 
 	if (name)
-		evsel->name = strdup(name);
+		evsel->core.name = strdup(name);
 
 	if (metric_id)
 		evsel->metric_id = strdup(metric_id);
@@ -1653,7 +1653,7 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
 	if (!evsel)
 		return -ENOMEM;
 
-	if (evsel->name)
+	if (evsel->core.name)
 		evsel->use_config_name = true;
 
 	evsel->pmu_name = name ? strdup(name) : NULL;
@@ -2069,8 +2069,8 @@ int parse_events_name(struct list_head *list, const char *name)
 	struct evsel *evsel;
 
 	__evlist__for_each_entry(list, evsel) {
-		if (!evsel->name)
-			evsel->name = strdup(name);
+		if (!evsel->core.name)
+			evsel->core.name = strdup(name);
 	}
 
 	return 0;
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 568a88c001c6..9ef8b6733acb 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -2543,13 +2543,13 @@ static struct evsel *find_evsel(struct evlist *evlist, char *event_name)
 	full_name = !!strchr(event_name, ':');
 	evlist__for_each_entry(evlist, pos) {
 		/* case 2 */
-		if (full_name && !strcmp(pos->name, event_name))
+		if (full_name && !strcmp(pos->core.name, event_name))
 			return pos;
 		/* case 3 */
-		if (!full_name && strstr(pos->name, event_name)) {
+		if (!full_name && strstr(pos->core.name, event_name)) {
 			if (evsel) {
 				pr_debug("'%s' event is ambiguous: it can be %s or %s\n",
-					 event_name, evsel->name, pos->name);
+					 event_name, evsel->core.name, pos->core.name);
 				return NULL;
 			}
 			evsel = pos;
diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c
index e3ffc084cb09..9a685b347041 100644
--- a/tools/perf/util/stat-display.c
+++ b/tools/perf/util/stat-display.c
@@ -546,29 +546,29 @@ static void uniquify_event_name(struct evsel *counter)
 	int ret = 0;
 
 	if (counter->uniquified_name || counter->use_config_name ||
-	    !counter->pmu_name || !strncmp(counter->name, counter->pmu_name,
+	    !counter->pmu_name || !strncmp(counter->core.name, counter->pmu_name,
 					   strlen(counter->pmu_name)))
 		return;
 
-	config = strchr(counter->name, '/');
+	config = strchr(counter->core.name, '/');
 	if (config) {
 		if (asprintf(&new_name,
 			     "%s%s", counter->pmu_name, config) > 0) {
-			free(counter->name);
-			counter->name = new_name;
+			free(counter->core.name);
+			counter->core.name = new_name;
 		}
 	} else {
 		if (perf_pmu__has_hybrid()) {
 			ret = asprintf(&new_name, "%s/%s/",
-				       counter->pmu_name, counter->name);
+				       counter->pmu_name, counter->core.name);
 		} else {
 			ret = asprintf(&new_name, "%s [%s]",
-				       counter->name, counter->pmu_name);
+				       counter->core.name, counter->pmu_name);
 		}
 
 		if (ret) {
-			free(counter->name);
-			counter->name = new_name;
+			free(counter->core.name);
+			counter->core.name = new_name;
 		}
 	}
 
diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c
index 69f3cf3b4a44..cd8898d4b363 100644
--- a/tools/perf/util/stat-shadow.c
+++ b/tools/perf/util/stat-shadow.c
@@ -361,7 +361,7 @@ static struct evsel *perf_stat__find_event(struct evlist *evsel_list,
 	struct evsel *c2;
 
 	evlist__for_each_entry (evsel_list, c2) {
-		if (!strcasecmp(c2->name, name) && !c2->collect_stat)
+		if (!strcasecmp(c2->core.name, name) && !c2->collect_stat)
 			return c2;
 	}
 	return NULL;
@@ -393,7 +393,7 @@ void perf_stat__collect_metric_expr(struct evlist *evsel_list)
 		metric_events = counter->metric_events;
 		if (!metric_events) {
 			if (expr__find_ids(counter->metric_expr,
-					   counter->name,
+					   counter->core.name,
 					   ctx) < 0)
 				continue;
 
@@ -414,7 +414,7 @@ void perf_stat__collect_metric_expr(struct evlist *evsel_list)
 			if (leader) {
 				/* Search in group */
 				for_each_group_member (oc, leader) {
-					if (!strcasecmp(oc->name,
+					if (!strcasecmp(oc->core.name,
 							metric_name) &&
 						!oc->collect_stat) {
 						found = true;
@@ -443,7 +443,7 @@ void perf_stat__collect_metric_expr(struct evlist *evsel_list)
 					fprintf(stderr,
 						"Add %s event to groups to get metric expression for %s\n",
 						metric_name,
-						counter->name);
+						counter->core.name);
 					printed = strdup(metric_name);
 				}
 				invalid = true;
@@ -829,7 +829,7 @@ static int prepare_metric(struct evsel **metric_events,
 		struct stats *stats;
 		u64 metric_total = 0;
 
-		if (!strcmp(metric_events[i]->name, "duration_time")) {
+		if (!strcmp(metric_events[i]->core.name, "duration_time")) {
 			stats = &walltime_nsecs_stats;
 			scale = 1e-9;
 		} else {
@@ -1275,7 +1275,7 @@ void perf_stat__print_shadow_stats(struct perf_stat_config *config,
 				core_bound * 100.);
 	} else if (evsel->metric_expr) {
 		generic_metric(config, evsel->metric_expr, evsel->metric_events, NULL,
-				evsel->name, evsel->metric_name, NULL, 1, cpu, out, st);
+				evsel->core.name, evsel->metric_name, NULL, 1, cpu, out, st);
 	} else if (runtime_stat_n(st, STAT_NSECS, cpu, &rsd) != 0) {
 		char unit = ' ';
 		char unit_buf[10] = "/sec";
@@ -1300,7 +1300,7 @@ void perf_stat__print_shadow_stats(struct perf_stat_config *config,
 			if (num++ > 0)
 				out->new_line(config, ctxp);
 			generic_metric(config, mexp->metric_expr, mexp->metric_events,
-					mexp->metric_refs, evsel->name, mexp->metric_name,
+					mexp->metric_refs, evsel->core.name, mexp->metric_name,
 					mexp->metric_unit, mexp->runtime, cpu, out, st);
 		}
 	}
diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic-events.c
index 198982109f0f..2528c22792be 100644
--- a/tools/perf/util/synthetic-events.c
+++ b/tools/perf/util/synthetic-events.c
@@ -1860,14 +1860,14 @@ int perf_event__synthesize_event_update_name(struct perf_tool *tool, struct evse
 					     perf_event__handler_t process)
 {
 	struct perf_record_event_update *ev;
-	size_t len = strlen(evsel->name);
+	size_t len = strlen(evsel->core.name);
 	int err;
 
 	ev = event_update_event__new(len + 1, PERF_EVENT_UPDATE__NAME, evsel->core.id[0]);
 	if (ev == NULL)
 		return -ENOMEM;
 
-	strlcpy(ev->data, evsel->name, len + 1);
+	strlcpy(ev->data, evsel->core.name, len + 1);
 	err = process(tool, (union perf_event *)ev, NULL, NULL);
 	free(ev);
 	return err;
diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c
index a65f65d0857e..b00d83b4163d 100644
--- a/tools/perf/util/trace-event-info.c
+++ b/tools/perf/util/trace-event-info.c
@@ -412,12 +412,12 @@ get_tracepoints_path(struct list_head *pattrs)
 			continue;
 		++nr_tracepoints;
 
-		if (pos->name) {
-			ppath->next = tracepoint_name_to_path(pos->name);
+		if (pos->core.name) {
+			ppath->next = tracepoint_name_to_path(pos->core.name);
 			if (ppath->next)
 				goto next;
 
-			if (strchr(pos->name, ':') == NULL)
+			if (strchr(pos->core.name, ':') == NULL)
 				goto try_id;
 
 			goto error;
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 08/59] libperf: Move auto_merge_stats to perf_evsel
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (5 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 07/59] libperf: Move name to perf_evsel Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 09/59] libperf: Move config_terms " Jiri Olsa
                   ` (51 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving auto_merge_stats to perf_evsel struct.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/evsel.h | 1 +
 tools/perf/util/evsel.c                 | 2 +-
 tools/perf/util/evsel.h                 | 1 -
 tools/perf/util/parse-events.c          | 2 +-
 tools/perf/util/stat-display.c          | 2 +-
 5 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
index 808720b4cf77..be30dc1ed9a7 100644
--- a/tools/lib/perf/include/internal/evsel.h
+++ b/tools/lib/perf/include/internal/evsel.h
@@ -59,6 +59,7 @@ struct perf_evsel {
 	 */
         struct {
                 char			*name;
+		bool			auto_merge_stats;
 	};
 };
 
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index b737f1c60721..10ba2f91d5a2 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -433,7 +433,7 @@ struct evsel *evsel__clone(struct evsel *orig)
 
 	evsel->exclude_GH = orig->exclude_GH;
 	evsel->sample_read = orig->sample_read;
-	evsel->auto_merge_stats = orig->auto_merge_stats;
+	evsel->core.auto_merge_stats = orig->core.auto_merge_stats;
 	evsel->collect_stat = orig->collect_stat;
 	evsel->weak_group = orig->weak_group;
 	evsel->use_config_name = orig->use_config_name;
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index de6ed7b258ca..ead2c3f3ea05 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -78,7 +78,6 @@ struct evsel {
 		bool			precise_max;
 		bool			use_uncore_alias;
 		bool			is_libpfm_event;
-		bool			auto_merge_stats;
 		bool			collect_stat;
 		bool			weak_group;
 		bool			bpf_counter;
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 072ff971e32f..09fbb128df63 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -384,7 +384,7 @@ __add_event(struct list_head *list, int *idx,
 	evsel->core.cpus = cpus;
 	evsel->core.own_cpus = perf_cpu_map__get(cpus);
 	evsel->core.system_wide = pmu ? pmu->is_uncore : false;
-	evsel->auto_merge_stats = auto_merge_stats;
+	evsel->core.auto_merge_stats = auto_merge_stats;
 
 	if (name)
 		evsel->core.name = strdup(name);
diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c
index 9a685b347041..b00097e86c85 100644
--- a/tools/perf/util/stat-display.c
+++ b/tools/perf/util/stat-display.c
@@ -619,7 +619,7 @@ static bool collect_data(struct perf_stat_config *config, struct evsel *counter,
 	cb(config, counter, data, true);
 	if (config->no_merge || hybrid_uniquify(counter))
 		uniquify_event_name(counter);
-	else if (counter->auto_merge_stats)
+	else if (counter->core.auto_merge_stats)
 		collect_all_aliases(config, counter, cb, data);
 	return true;
 }
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 09/59] libperf: Move config_terms to perf_evsel
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (6 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 08/59] libperf: Move auto_merge_stats " Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 10/59] libperf: Move metric_id " Jiri Olsa
                   ` (50 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving config_terms to perf_evsel struct.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/evsel.h |  1 +
 tools/perf/builtin-top.c                |  2 +-
 tools/perf/util/evsel.c                 | 10 +++++-----
 tools/perf/util/evsel.h                 |  1 -
 tools/perf/util/parse-events.c          |  6 +++---
 tools/perf/util/record.c                |  2 +-
 6 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
index be30dc1ed9a7..ef5a85de7ba9 100644
--- a/tools/lib/perf/include/internal/evsel.h
+++ b/tools/lib/perf/include/internal/evsel.h
@@ -60,6 +60,7 @@ struct perf_evsel {
         struct {
                 char			*name;
 		bool			auto_merge_stats;
+		struct list_head	config_terms;
 	};
 };
 
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 020c4f110c10..c307d3015cfa 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -951,7 +951,7 @@ static int perf_top__overwrite_check(struct perf_top *top)
 
 	evlist__for_each_entry(evlist, evsel) {
 		set = -1;
-		config_terms = &evsel->config_terms;
+		config_terms = &evsel->core.config_terms;
 		list_for_each_entry(term, config_terms, list) {
 			if (term->type == EVSEL__CONFIG_TERM_OVERWRITE)
 				set = term->val.overwrite ? 1 : 0;
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 10ba2f91d5a2..bc5a213b3955 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -247,7 +247,7 @@ void evsel__init(struct evsel *evsel,
 	evsel->evlist	   = NULL;
 	evsel->bpf_obj	   = NULL;
 	evsel->bpf_fd	   = -1;
-	INIT_LIST_HEAD(&evsel->config_terms);
+	INIT_LIST_HEAD(&evsel->core.config_terms);
 	INIT_LIST_HEAD(&evsel->bpf_counter_list);
 	perf_evsel__object.init(evsel);
 	evsel->sample_size = __evsel__sample_size(attr->sample_type);
@@ -357,7 +357,7 @@ int copy_config_terms(struct list_head *dst, struct list_head *src)
 
 static int evsel__copy_config_terms(struct evsel *dst, struct evsel *src)
 {
-	return copy_config_terms(&dst->config_terms, &src->config_terms);
+	return copy_config_terms(&dst->core.config_terms, &src->core.config_terms);
 }
 
 /**
@@ -917,7 +917,7 @@ static void evsel__apply_config_terms(struct evsel *evsel,
 				      struct record_opts *opts, bool track)
 {
 	struct evsel_config_term *term;
-	struct list_head *config_terms = &evsel->config_terms;
+	struct list_head *config_terms = &evsel->core.config_terms;
 	struct perf_event_attr *attr = &evsel->core.attr;
 	/* callgraph default */
 	struct callchain_param param = {
@@ -1050,7 +1050,7 @@ struct evsel_config_term *__evsel__get_config_term(struct evsel *evsel, enum evs
 {
 	struct evsel_config_term *term, *found_term = NULL;
 
-	list_for_each_entry(term, &evsel->config_terms, list) {
+	list_for_each_entry(term, &evsel->core.config_terms, list) {
 		if (term->type == type)
 			found_term = term;
 	}
@@ -1420,7 +1420,7 @@ void free_config_terms(struct list_head *config_terms)
 
 static void evsel__free_config_terms(struct evsel *evsel)
 {
-	free_config_terms(&evsel->config_terms);
+	free_config_terms(&evsel->core.config_terms);
 }
 
 void evsel__exit(struct evsel *evsel)
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index ead2c3f3ea05..b703e78ace23 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -84,7 +84,6 @@ struct evsel {
 		bool			use_config_name;
 		int			bpf_fd;
 		struct bpf_object	*bpf_obj;
-		struct list_head	config_terms;
 	};
 
 	/*
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 09fbb128df63..c08b7fa8dae4 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -393,7 +393,7 @@ __add_event(struct list_head *list, int *idx,
 		evsel->metric_id = strdup(metric_id);
 
 	if (config_terms)
-		list_splice_init(config_terms, &evsel->config_terms);
+		list_splice_init(config_terms, &evsel->core.config_terms);
 
 	if (list)
 		list_add_tail(&evsel->core.node, list);
@@ -607,7 +607,7 @@ static int add_tracepoint(struct list_head *list, int *idx,
 
 		if (get_config_terms(head_config, &config_terms))
 			return -ENOMEM;
-		list_splice(&config_terms, &evsel->config_terms);
+		list_splice(&config_terms, &evsel->core.config_terms);
 	}
 
 	list_add_tail(&evsel->core.node, list);
@@ -1658,7 +1658,7 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
 
 	evsel->pmu_name = name ? strdup(name) : NULL;
 	evsel->use_uncore_alias = use_uncore_alias;
-	evsel->percore = config_term_percore(&evsel->config_terms);
+	evsel->percore = config_term_percore(&evsel->core.config_terms);
 
 	if (parse_state->fake_pmu)
 		return 0;
diff --git a/tools/perf/util/record.c b/tools/perf/util/record.c
index bff669b615ee..83e3a8cce9ba 100644
--- a/tools/perf/util/record.c
+++ b/tools/perf/util/record.c
@@ -41,7 +41,7 @@ static struct evsel *evsel__read_sampler(struct evsel *evsel, struct evlist *evl
 static u64 evsel__config_term_mask(struct evsel *evsel)
 {
 	struct evsel_config_term *term;
-	struct list_head *config_terms = &evsel->config_terms;
+	struct list_head *config_terms = &evsel->core.config_terms;
 	u64 term_types = 0;
 
 	list_for_each_entry(term, config_terms, list) {
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 10/59] libperf: Move metric_id to perf_evsel
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (7 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 09/59] libperf: Move config_terms " Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 11/59] libperf: Move tool_event " Jiri Olsa
                   ` (49 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving metric_id to perf_evsel struct.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/evsel.h |  1 +
 tools/perf/util/evsel.c                 | 12 ++++++------
 tools/perf/util/evsel.h                 |  1 -
 tools/perf/util/metricgroup.c           | 10 +++++-----
 tools/perf/util/parse-events.c          |  2 +-
 5 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
index ef5a85de7ba9..dafa1d6be731 100644
--- a/tools/lib/perf/include/internal/evsel.h
+++ b/tools/lib/perf/include/internal/evsel.h
@@ -61,6 +61,7 @@ struct perf_evsel {
                 char			*name;
 		bool			auto_merge_stats;
 		struct list_head	config_terms;
+		const char		*metric_id;
 	};
 };
 
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index bc5a213b3955..52781210a874 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -410,9 +410,9 @@ struct evsel *evsel__clone(struct evsel *orig)
 		if (evsel->filter == NULL)
 			goto out_err;
 	}
-	if (orig->metric_id) {
-		evsel->metric_id = strdup(orig->metric_id);
-		if (evsel->metric_id == NULL)
+	if (orig->core.metric_id) {
+		evsel->core.metric_id = strdup(orig->core.metric_id);
+		if (evsel->core.metric_id == NULL)
 			goto out_err;
 	}
 	evsel->cgrp = cgroup__get(orig->cgrp);
@@ -786,8 +786,8 @@ const char *evsel__name(struct evsel *evsel)
 
 const char *evsel__metric_id(const struct evsel *evsel)
 {
-	if (evsel->metric_id)
-		return evsel->metric_id;
+	if (evsel->core.metric_id)
+		return evsel->core.metric_id;
 
 	if (evsel->core.attr.type == PERF_TYPE_SOFTWARE && evsel->tool_event)
 		return "duration_time";
@@ -1439,7 +1439,7 @@ void evsel__exit(struct evsel *evsel)
 	zfree(&evsel->group_name);
 	zfree(&evsel->core.name);
 	zfree(&evsel->pmu_name);
-	zfree(&evsel->metric_id);
+	zfree(&evsel->core.metric_id);
 	evsel__zero_per_pkg(evsel);
 	hashmap__free(evsel->per_pkg_mask);
 	evsel->per_pkg_mask = NULL;
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index b703e78ace23..b55173bf8f70 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -67,7 +67,6 @@ struct evsel {
 		double			scale;
 		const char		*unit;
 		struct cgroup		*cgrp;
-		const char		*metric_id;
 		enum perf_tool_event	tool_event;
 		/* parse modifier helper */
 		int			exclude_GH;
diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
index b54856cb14d0..3c8afef83ebd 100644
--- a/tools/perf/util/metricgroup.c
+++ b/tools/perf/util/metricgroup.c
@@ -669,20 +669,20 @@ static int decode_all_metric_ids(struct evlist *perf_evlist, const char *modifie
 	int ret = 0;
 
 	evlist__for_each_entry(perf_evlist, ev) {
-		if (!ev->metric_id)
+		if (!ev->core.metric_id)
 			continue;
 
 		ret = strbuf_setlen(&sb, 0);
 		if (ret)
 			break;
 
-		ret = decode_metric_id(&sb, ev->metric_id);
+		ret = decode_metric_id(&sb, ev->core.metric_id);
 		if (ret)
 			break;
 
-		free((char *)ev->metric_id);
-		ev->metric_id = strdup(sb.buf);
-		if (!ev->metric_id) {
+		free((char *)ev->core.metric_id);
+		ev->core.metric_id = strdup(sb.buf);
+		if (!ev->core.metric_id) {
 			ret = -ENOMEM;
 			break;
 		}
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index c08b7fa8dae4..ee04fec441e7 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -390,7 +390,7 @@ __add_event(struct list_head *list, int *idx,
 		evsel->core.name = strdup(name);
 
 	if (metric_id)
-		evsel->metric_id = strdup(metric_id);
+		evsel->core.metric_id = strdup(metric_id);
 
 	if (config_terms)
 		list_splice_init(config_terms, &evsel->core.config_terms);
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 11/59] libperf: Move tool_event to perf_evsel
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (8 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 10/59] libperf: Move metric_id " Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 12/59] libperf: Move unit " Jiri Olsa
                   ` (48 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving tool_event to perf_evsel struct.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/evsel.h | 6 ++++++
 tools/perf/builtin-stat.c               | 2 +-
 tools/perf/util/evsel.c                 | 6 +++---
 tools/perf/util/evsel.h                 | 6 ------
 tools/perf/util/parse-events.c          | 2 +-
 5 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
index dafa1d6be731..105ff0626482 100644
--- a/tools/lib/perf/include/internal/evsel.h
+++ b/tools/lib/perf/include/internal/evsel.h
@@ -11,6 +11,11 @@ struct perf_cpu_map;
 struct perf_thread_map;
 struct xyarray;
 
+enum perf_tool_event {
+	PERF_TOOL_NONE		= 0,
+	PERF_TOOL_DURATION_TIME	= 1,
+};
+
 /*
  * Per fd, to map back from PERF_SAMPLE_ID to evsel, only used when there are
  * more than one entry in the evlist.
@@ -62,6 +67,7 @@ struct perf_evsel {
 		bool			auto_merge_stats;
 		struct list_head	config_terms;
 		const char		*metric_id;
+		enum perf_tool_event	tool_event;
 	};
 };
 
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index f7fda777f122..f697af989d60 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -339,7 +339,7 @@ static int evsel__write_stat_event(struct evsel *counter, u32 cpu, u32 thread,
 static int read_single_counter(struct evsel *counter, int cpu,
 			       int thread, struct timespec *rs)
 {
-	if (counter->tool_event == PERF_TOOL_DURATION_TIME) {
+	if (counter->core.tool_event == PERF_TOOL_DURATION_TIME) {
 		u64 val = rs->tv_nsec + rs->tv_sec*1000000000ULL;
 		struct perf_counts_values *count =
 			perf_counts(counter->counts, cpu, thread);
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 52781210a874..3985e69123d2 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -421,7 +421,7 @@ struct evsel *evsel__clone(struct evsel *orig)
 	evsel->core.leader = orig->core.leader;
 
 	evsel->max_events = orig->max_events;
-	evsel->tool_event = orig->tool_event;
+	evsel->core.tool_event = orig->core.tool_event;
 	evsel->unit = orig->unit;
 	evsel->scale = orig->scale;
 	evsel->snapshot = orig->snapshot;
@@ -756,7 +756,7 @@ const char *evsel__name(struct evsel *evsel)
 		break;
 
 	case PERF_TYPE_SOFTWARE:
-		if (evsel->tool_event)
+		if (evsel->core.tool_event)
 			evsel__tool_name(bf, sizeof(bf));
 		else
 			evsel__sw_name(evsel, bf, sizeof(bf));
@@ -789,7 +789,7 @@ const char *evsel__metric_id(const struct evsel *evsel)
 	if (evsel->core.metric_id)
 		return evsel->core.metric_id;
 
-	if (evsel->core.attr.type == PERF_TYPE_SOFTWARE && evsel->tool_event)
+	if (evsel->core.attr.type == PERF_TYPE_SOFTWARE && evsel->core.tool_event)
 		return "duration_time";
 
 	return "unknown";
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index b55173bf8f70..548d3042fa8b 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -25,11 +25,6 @@ struct bperf_follower_bpf;
 
 typedef int (evsel__sb_cb_t)(union perf_event *event, void *data);
 
-enum perf_tool_event {
-	PERF_TOOL_NONE		= 0,
-	PERF_TOOL_DURATION_TIME = 1,
-};
-
 /** struct evsel - event selector
  *
  * @evlist - evlist this evsel is in, if it is in one.
@@ -67,7 +62,6 @@ struct evsel {
 		double			scale;
 		const char		*unit;
 		struct cgroup		*cgrp;
-		enum perf_tool_event	tool_event;
 		/* parse modifier helper */
 		int			exclude_GH;
 		int			sample_read;
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index ee04fec441e7..15d5880df4c2 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -434,7 +434,7 @@ static int add_event_tool(struct list_head *list, int *idx,
 			    /*cpu_list=*/"0");
 	if (!evsel)
 		return -ENOMEM;
-	evsel->tool_event = tool_event;
+	evsel->core.tool_event = tool_event;
 	if (tool_event == PERF_TOOL_DURATION_TIME)
 		evsel->unit = "ns";
 	return 0;
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 12/59] libperf: Move unit to perf_evsel
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (9 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 11/59] libperf: Move tool_event " Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 13/59] libperf: Move exclude_GH " Jiri Olsa
                   ` (47 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving unit to perf_evsel struct.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/evsel.h | 1 +
 tools/perf/builtin-stat.c               | 2 +-
 tools/perf/tests/event_update.c         | 2 +-
 tools/perf/util/evsel.c                 | 8 ++++----
 tools/perf/util/evsel.h                 | 1 -
 tools/perf/util/header.c                | 2 +-
 tools/perf/util/parse-events.c          | 4 ++--
 tools/perf/util/stat-display.c          | 8 ++++----
 tools/perf/util/synthetic-events.c      | 6 +++---
 9 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
index 105ff0626482..b96c9f4808ca 100644
--- a/tools/lib/perf/include/internal/evsel.h
+++ b/tools/lib/perf/include/internal/evsel.h
@@ -68,6 +68,7 @@ struct perf_evsel {
 		struct list_head	config_terms;
 		const char		*metric_id;
 		enum perf_tool_event	tool_event;
+		const char		*unit;
 	};
 };
 
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index f697af989d60..f57a366b7a1a 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -917,7 +917,7 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)
 			continue;
 		}
 
-		l = strlen(counter->unit);
+		l = strlen(counter->core.unit);
 		if (l > stat_config.unit_width)
 			stat_config.unit_width = l;
 
diff --git a/tools/perf/tests/event_update.c b/tools/perf/tests/event_update.c
index 44a50527f9d9..556eb8e6b228 100644
--- a/tools/perf/tests/event_update.c
+++ b/tools/perf/tests/event_update.c
@@ -99,7 +99,7 @@ int test__event_update(struct test *test __maybe_unused, int subtest __maybe_unu
 
 	perf_evlist__id_add(&evlist->core, &evsel->core, 0, 0, 123);
 
-	evsel->unit = unit;
+	evsel->core.unit = unit;
 
 	TEST_ASSERT_VAL("failed to synthesize attr update unit",
 			!perf_event__synthesize_event_update_unit(NULL, evsel, process_event_unit));
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 3985e69123d2..133b571e1190 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -241,7 +241,7 @@ void evsel__init(struct evsel *evsel,
 {
 	perf_evsel__init(&evsel->core, attr, idx);
 	evsel->tracking	   = !idx;
-	evsel->unit	   = "";
+	evsel->core.unit   = "";
 	evsel->scale	   = 1.0;
 	evsel->max_events  = ULONG_MAX;
 	evsel->evlist	   = NULL;
@@ -282,7 +282,7 @@ struct evsel *evsel__new_idx(struct perf_event_attr *attr, int idx)
 		 */
 		static const char *unit = "msec";
 
-		evsel->unit = unit;
+		evsel->core.unit = unit;
 		evsel->scale = 1e-6;
 	}
 
@@ -422,7 +422,7 @@ struct evsel *evsel__clone(struct evsel *orig)
 
 	evsel->max_events = orig->max_events;
 	evsel->core.tool_event = orig->core.tool_event;
-	evsel->unit = orig->unit;
+	evsel->core.unit = orig->core.unit;
 	evsel->scale = orig->scale;
 	evsel->snapshot = orig->snapshot;
 	evsel->per_pkg = orig->per_pkg;
@@ -1300,7 +1300,7 @@ void evsel__config(struct evsel *evsel, struct record_opts *opts,
 		attr->exclude_user   = 1;
 	}
 
-	if (evsel->core.own_cpus || evsel->unit)
+	if (evsel->core.own_cpus || evsel->core.unit)
 		evsel->core.attr.read_format |= PERF_FORMAT_ID;
 
 	/*
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index 548d3042fa8b..f6cc1e78903f 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -60,7 +60,6 @@ struct evsel {
 		char			*filter;
 		unsigned long		max_events;
 		double			scale;
-		const char		*unit;
 		struct cgroup		*cgrp;
 		/* parse modifier helper */
 		int			exclude_GH;
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 949d24da7000..4610b23fed28 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -4256,7 +4256,7 @@ int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
 
 	switch (ev->type) {
 	case PERF_EVENT_UPDATE__UNIT:
-		evsel->unit = strdup(ev->data);
+		evsel->core.unit = strdup(ev->data);
 		break;
 	case PERF_EVENT_UPDATE__NAME:
 		evsel->core.name = strdup(ev->data);
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 15d5880df4c2..1878ea1310d3 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -436,7 +436,7 @@ static int add_event_tool(struct list_head *list, int *idx,
 		return -ENOMEM;
 	evsel->core.tool_event = tool_event;
 	if (tool_event == PERF_TOOL_DURATION_TIME)
-		evsel->unit = "ns";
+		evsel->core.unit = "ns";
 	return 0;
 }
 
@@ -1663,7 +1663,7 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
 	if (parse_state->fake_pmu)
 		return 0;
 
-	evsel->unit = info.unit;
+	evsel->core.unit = info.unit;
 	evsel->scale = info.scale;
 	evsel->per_pkg = info.per_pkg;
 	evsel->snapshot = info.snapshot;
diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c
index b00097e86c85..5f5467c55323 100644
--- a/tools/perf/util/stat-display.c
+++ b/tools/perf/util/stat-display.c
@@ -372,10 +372,10 @@ static void abs_printout(struct perf_stat_config *config,
 
 	fprintf(output, fmt, avg, config->csv_sep);
 
-	if (evsel->unit)
+	if (evsel->core.unit)
 		fprintf(output, "%-*s%s",
 			config->csv_output ? 0 : config->unit_width,
-			evsel->unit, config->csv_sep);
+			evsel->core.unit, config->csv_sep);
 
 	fprintf(output, "%-*s", config->csv_output ? 0 : 25, evsel__name(evsel));
 
@@ -476,7 +476,7 @@ static void printout(struct perf_stat_config *config, struct aggr_cpu_id id, int
 
 		fprintf(config->output, "%-*s%s",
 			config->csv_output ? 0 : config->unit_width,
-			counter->unit, config->csv_sep);
+			counter->core.unit, config->csv_sep);
 
 		fprintf(config->output, "%*s",
 			config->csv_output ? 0 : -25, evsel__name(counter));
@@ -588,7 +588,7 @@ static void collect_all_aliases(struct perf_stat_config *config, struct evsel *c
 		if (strcmp(evsel__name(alias), evsel__name(counter)) ||
 		    alias->scale != counter->scale ||
 		    alias->cgrp != counter->cgrp ||
-		    strcmp(alias->unit, counter->unit) ||
+		    strcmp(alias->core.unit, counter->core.unit) ||
 		    evsel__is_clock(alias) != evsel__is_clock(counter) ||
 		    !strcmp(alias->pmu_name, counter->pmu_name))
 			break;
diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic-events.c
index 2528c22792be..27c97f22d855 100644
--- a/tools/perf/util/synthetic-events.c
+++ b/tools/perf/util/synthetic-events.c
@@ -1824,7 +1824,7 @@ static struct perf_record_event_update *event_update_event__new(size_t size, u64
 int perf_event__synthesize_event_update_unit(struct perf_tool *tool, struct evsel *evsel,
 					     perf_event__handler_t process)
 {
-	size_t size = strlen(evsel->unit);
+	size_t size = strlen(evsel->core.unit);
 	struct perf_record_event_update *ev;
 	int err;
 
@@ -1832,7 +1832,7 @@ int perf_event__synthesize_event_update_unit(struct perf_tool *tool, struct evse
 	if (ev == NULL)
 		return -ENOMEM;
 
-	strlcpy(ev->data, evsel->unit, size + 1);
+	strlcpy(ev->data, evsel->core.unit, size + 1);
 	err = process(tool, (union perf_event *)ev, NULL, NULL);
 	free(ev);
 	return err;
@@ -1921,7 +1921,7 @@ int perf_event__synthesize_attrs(struct perf_tool *tool, struct evlist *evlist,
 
 static bool has_unit(struct evsel *evsel)
 {
-	return evsel->unit && *evsel->unit;
+	return evsel->core.unit && *evsel->core.unit;
 }
 
 static bool has_scale(struct evsel *evsel)
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 13/59] libperf: Move exclude_GH to perf_evsel
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (10 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 12/59] libperf: Move unit " Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 17:53   ` Ian Rogers
  2021-11-08 13:36 ` [PATCH 14/59] libperf: Move sample_read " Jiri Olsa
                   ` (46 subsequent siblings)
  58 siblings, 1 reply; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving exclude_GH to perf_evsel struct.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/evsel.h | 1 +
 tools/perf/util/evsel.c                 | 2 +-
 tools/perf/util/evsel.h                 | 1 -
 tools/perf/util/parse-events.c          | 4 ++--
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
index b96c9f4808ca..7f3ee73c5aa5 100644
--- a/tools/lib/perf/include/internal/evsel.h
+++ b/tools/lib/perf/include/internal/evsel.h
@@ -69,6 +69,7 @@ struct perf_evsel {
 		const char		*metric_id;
 		enum perf_tool_event	tool_event;
 		const char		*unit;
+		int			exclude_GH;
 	};
 };
 
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 133b571e1190..802c7de9e8e3 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -431,7 +431,7 @@ struct evsel *evsel__clone(struct evsel *orig)
 	evsel->use_uncore_alias = orig->use_uncore_alias;
 	evsel->is_libpfm_event = orig->is_libpfm_event;
 
-	evsel->exclude_GH = orig->exclude_GH;
+	evsel->core.exclude_GH = orig->core.exclude_GH;
 	evsel->sample_read = orig->sample_read;
 	evsel->core.auto_merge_stats = orig->core.auto_merge_stats;
 	evsel->collect_stat = orig->collect_stat;
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index f6cc1e78903f..6c3634ed169a 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -62,7 +62,6 @@ struct evsel {
 		double			scale;
 		struct cgroup		*cgrp;
 		/* parse modifier helper */
-		int			exclude_GH;
 		int			sample_read;
 		bool			snapshot;
 		bool			per_pkg;
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 1878ea1310d3..89787ebc23ef 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1918,7 +1918,7 @@ static int get_event_modifier(struct event_modifier *mod, char *str,
 	int exclusive = evsel ? evsel->core.attr.exclusive : 0;
 
 	int exclude = eu | ek | eh;
-	int exclude_GH = evsel ? evsel->exclude_GH : 0;
+	int exclude_GH = evsel ? evsel->core.exclude_GH : 0;
 	int weak = 0;
 	int bpf_counter = 0;
 
@@ -2049,7 +2049,7 @@ int parse_events__modifier_event(struct list_head *list, char *str, bool add)
 		evsel->core.attr.exclude_host   = mod.eH;
 		evsel->core.attr.exclude_guest  = mod.eG;
 		evsel->core.attr.exclude_idle   = mod.eI;
-		evsel->exclude_GH          = mod.exclude_GH;
+		evsel->core.exclude_GH          = mod.exclude_GH;
 		evsel->sample_read         = mod.sample_read;
 		evsel->precise_max         = mod.precise_max;
 		evsel->weak_group	   = mod.weak;
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 14/59] libperf: Move sample_read to perf_evsel
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (11 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 13/59] libperf: Move exclude_GH " Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 15/59] libperf: Move precise_max " Jiri Olsa
                   ` (45 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving sample_read to perf_evsel struct.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/evsel.h |  1 +
 tools/perf/tests/parse-events.c         | 40 ++++++++++++-------------
 tools/perf/util/evsel.c                 |  4 +--
 tools/perf/util/evsel.h                 |  1 -
 tools/perf/util/parse-events.c          |  2 +-
 tools/perf/util/record.c                |  2 +-
 6 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
index 7f3ee73c5aa5..6f820742615c 100644
--- a/tools/lib/perf/include/internal/evsel.h
+++ b/tools/lib/perf/include/internal/evsel.h
@@ -70,6 +70,7 @@ struct perf_evsel {
 		enum perf_tool_event	tool_event;
 		const char		*unit;
 		int			exclude_GH;
+		int			sample_read;
 	};
 };
 
diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
index c06cc2c155fd..15d6d3d907b7 100644
--- a/tools/perf/tests/parse-events.c
+++ b/tools/perf/tests/parse-events.c
@@ -685,7 +685,7 @@ static int test__group1(struct evlist *evlist)
 	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
 	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
 
 	/* cycles:upp */
 	evsel = evsel__next(evsel);
@@ -701,7 +701,7 @@ static int test__group1(struct evlist *evlist)
 	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 2);
 	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
 
 	return 0;
 }
@@ -727,7 +727,7 @@ static int test__group2(struct evlist *evlist)
 	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
 	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
 
 	/* cache-references + :u modifier */
 	evsel = evsel__next(evsel);
@@ -742,7 +742,7 @@ static int test__group2(struct evlist *evlist)
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
 	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
 
 	/* cycles:k */
 	evsel = evsel__next(evsel);
@@ -756,7 +756,7 @@ static int test__group2(struct evlist *evlist)
 	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
 	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
 
 	return 0;
 }
@@ -785,7 +785,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
 		!strcmp(leader->group_name, "group1"));
 	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
 
 	/* group1 cycles:kppp */
 	evsel = evsel__next(evsel);
@@ -802,7 +802,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
 	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
 	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
 
 	/* group2 cycles + G modifier */
 	evsel = leader = evsel__next(evsel);
@@ -820,7 +820,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
 		!strcmp(leader->group_name, "group2"));
 	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
 
 	/* group2 1:3 + G modifier */
 	evsel = evsel__next(evsel);
@@ -834,7 +834,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
 	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
 
 	/* instructions:u */
 	evsel = evsel__next(evsel);
@@ -848,7 +848,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
 	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
 	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
 
 	return 0;
 }
@@ -876,7 +876,7 @@ static int test__group4(struct evlist *evlist __maybe_unused)
 	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
 	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
 
 	/* instructions:kp + p */
 	evsel = evsel__next(evsel);
@@ -892,7 +892,7 @@ static int test__group4(struct evlist *evlist __maybe_unused)
 	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 2);
 	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
 
 	return 0;
 }
@@ -919,7 +919,7 @@ static int test__group5(struct evlist *evlist __maybe_unused)
 	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
 	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
 
 	/* instructions + G */
 	evsel = evsel__next(evsel);
@@ -934,7 +934,7 @@ static int test__group5(struct evlist *evlist __maybe_unused)
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
 	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
 
 	/* cycles:G */
 	evsel = leader = evsel__next(evsel);
@@ -951,7 +951,7 @@ static int test__group5(struct evlist *evlist __maybe_unused)
 	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
 	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
 
 	/* instructions:G */
 	evsel = evsel__next(evsel);
@@ -1162,7 +1162,7 @@ static int test__leader_sample1(struct evlist *evlist)
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
 	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
 	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
-	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
 
 	/* cache-misses - not sampling */
 	evsel = evsel__next(evsel);
@@ -1176,7 +1176,7 @@ static int test__leader_sample1(struct evlist *evlist)
 	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
 	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
-	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
 
 	/* branch-misses - not sampling */
 	evsel = evsel__next(evsel);
@@ -1191,7 +1191,7 @@ static int test__leader_sample1(struct evlist *evlist)
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
 	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
 	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
-	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
 
 	return 0;
 }
@@ -1215,7 +1215,7 @@ static int test__leader_sample2(struct evlist *evlist __maybe_unused)
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
 	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
 	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
-	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
 
 	/* branch-misses - not sampling */
 	evsel = evsel__next(evsel);
@@ -1230,7 +1230,7 @@ static int test__leader_sample2(struct evlist *evlist __maybe_unused)
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
 	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
 	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
-	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
+	TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
 
 	return 0;
 }
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 802c7de9e8e3..e0fde07ae9b6 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -432,7 +432,7 @@ struct evsel *evsel__clone(struct evsel *orig)
 	evsel->is_libpfm_event = orig->is_libpfm_event;
 
 	evsel->core.exclude_GH = orig->core.exclude_GH;
-	evsel->sample_read = orig->sample_read;
+	evsel->core.sample_read = orig->core.sample_read;
 	evsel->core.auto_merge_stats = orig->core.auto_merge_stats;
 	evsel->collect_stat = orig->collect_stat;
 	evsel->weak_group = orig->weak_group;
@@ -1106,7 +1106,7 @@ void evsel__config(struct evsel *evsel, struct record_opts *opts,
 	evsel__set_sample_bit(evsel, IP);
 	evsel__set_sample_bit(evsel, TID);
 
-	if (evsel->sample_read) {
+	if (evsel->core.sample_read) {
 		evsel__set_sample_bit(evsel, READ);
 
 		/*
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index 6c3634ed169a..83722fce3d04 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -62,7 +62,6 @@ struct evsel {
 		double			scale;
 		struct cgroup		*cgrp;
 		/* parse modifier helper */
-		int			sample_read;
 		bool			snapshot;
 		bool			per_pkg;
 		bool			percore;
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 89787ebc23ef..da171f549e54 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -2050,7 +2050,7 @@ int parse_events__modifier_event(struct list_head *list, char *str, bool add)
 		evsel->core.attr.exclude_guest  = mod.eG;
 		evsel->core.attr.exclude_idle   = mod.eI;
 		evsel->core.exclude_GH          = mod.exclude_GH;
-		evsel->sample_read         = mod.sample_read;
+		evsel->core.sample_read         = mod.sample_read;
 		evsel->precise_max         = mod.precise_max;
 		evsel->weak_group	   = mod.weak;
 		evsel->bpf_counter	   = mod.bpf_counter;
diff --git a/tools/perf/util/record.c b/tools/perf/util/record.c
index 83e3a8cce9ba..97dd3314047c 100644
--- a/tools/perf/util/record.c
+++ b/tools/perf/util/record.c
@@ -57,7 +57,7 @@ static void evsel__config_leader_sampling(struct evsel *evsel, struct evlist *ev
 	struct evsel *read_sampler;
 	u64 term_types, freq_mask;
 
-	if (!leader->sample_read)
+	if (!leader->core.sample_read)
 		return;
 
 	read_sampler = evsel__read_sampler(evsel, evlist);
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 15/59] libperf: Move precise_max to perf_evsel
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (12 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 14/59] libperf: Move sample_read " Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 16/59] libperf: Move weak_group " Jiri Olsa
                   ` (44 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving precise_max to perf_evsel struct.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/evsel.h | 1 +
 tools/perf/util/evsel.c                 | 8 ++++----
 tools/perf/util/evsel.h                 | 1 -
 tools/perf/util/parse-events.c          | 2 +-
 4 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
index 6f820742615c..0d14cbebae3a 100644
--- a/tools/lib/perf/include/internal/evsel.h
+++ b/tools/lib/perf/include/internal/evsel.h
@@ -71,6 +71,7 @@ struct perf_evsel {
 		const char		*unit;
 		int			exclude_GH;
 		int			sample_read;
+		bool			precise_max;
 	};
 };
 
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index e0fde07ae9b6..d1bb784a4310 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -317,7 +317,7 @@ struct evsel *evsel__new_cycles(bool precise, __u32 type, __u64 config)
 	if (evsel == NULL)
 		goto out;
 
-	evsel->precise_max = true;
+	evsel->core.precise_max = true;
 
 	/* use asprintf() because free(evsel) assumes name is allocated */
 	if (asprintf(&evsel->core.name, "cycles%s%s%.*s",
@@ -427,7 +427,7 @@ struct evsel *evsel__clone(struct evsel *orig)
 	evsel->snapshot = orig->snapshot;
 	evsel->per_pkg = orig->per_pkg;
 	evsel->percore = orig->percore;
-	evsel->precise_max = orig->precise_max;
+	evsel->core.precise_max = orig->core.precise_max;
 	evsel->use_uncore_alias = orig->use_uncore_alias;
 	evsel->is_libpfm_event = orig->is_libpfm_event;
 
@@ -1287,7 +1287,7 @@ void evsel__config(struct evsel *evsel, struct record_opts *opts,
 		attr->clockid = opts->clockid;
 	}
 
-	if (evsel->precise_max)
+	if (evsel->core.precise_max)
 		attr->precise_ip = 3;
 
 	if (opts->all_user) {
@@ -1739,7 +1739,7 @@ static void display_attr(struct perf_event_attr *attr)
 bool evsel__precise_ip_fallback(struct evsel *evsel)
 {
 	/* Do not try less precise if not requested. */
-	if (!evsel->precise_max)
+	if (!evsel->core.precise_max)
 		return false;
 
 	/*
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index 83722fce3d04..79dd9ea5bf85 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -65,7 +65,6 @@ struct evsel {
 		bool			snapshot;
 		bool			per_pkg;
 		bool			percore;
-		bool			precise_max;
 		bool			use_uncore_alias;
 		bool			is_libpfm_event;
 		bool			collect_stat;
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index da171f549e54..dc70ff74b357 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -2051,7 +2051,7 @@ int parse_events__modifier_event(struct list_head *list, char *str, bool add)
 		evsel->core.attr.exclude_idle   = mod.eI;
 		evsel->core.exclude_GH          = mod.exclude_GH;
 		evsel->core.sample_read         = mod.sample_read;
-		evsel->precise_max         = mod.precise_max;
+		evsel->core.precise_max         = mod.precise_max;
 		evsel->weak_group	   = mod.weak;
 		evsel->bpf_counter	   = mod.bpf_counter;
 
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 16/59] libperf: Move weak_group to perf_evsel
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (13 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 15/59] libperf: Move precise_max " Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 17/59] libperf: Move bpf_counter " Jiri Olsa
                   ` (43 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving weak_group to perf_evsel struct.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/evsel.h | 1 +
 tools/perf/builtin-record.c             | 2 +-
 tools/perf/builtin-stat.c               | 2 +-
 tools/perf/util/evsel.c                 | 2 +-
 tools/perf/util/evsel.h                 | 1 -
 tools/perf/util/parse-events.c          | 2 +-
 6 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
index 0d14cbebae3a..8374dc8365cb 100644
--- a/tools/lib/perf/include/internal/evsel.h
+++ b/tools/lib/perf/include/internal/evsel.h
@@ -72,6 +72,7 @@ struct perf_evsel {
 		int			exclude_GH;
 		int			sample_read;
 		bool			precise_max;
+		bool			weak_group;
 	};
 };
 
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index d5b899b235be..d232de3e72ac 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -929,7 +929,7 @@ static int record__open(struct record *rec)
 			}
 			if ((errno == EINVAL || errno == EBADF) &&
 			    pos->core.leader != &pos->core &&
-			    pos->weak_group) {
+			    pos->core.weak_group) {
 			        pos = evlist__reset_weak_group(evlist, pos, true);
 				goto try_again;
 			}
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index f57a366b7a1a..8b39f3f3b3b8 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -842,7 +842,7 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)
 				 */
 				if ((errno == EINVAL || errno == EBADF) &&
 				    evsel__leader(counter) != counter &&
-				    counter->weak_group) {
+				    counter->core.weak_group) {
 					evlist__reset_weak_group(evsel_list, counter, false);
 					assert(counter->reset_group);
 					second_pass = true;
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index d1bb784a4310..aafd91805870 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -435,7 +435,7 @@ struct evsel *evsel__clone(struct evsel *orig)
 	evsel->core.sample_read = orig->core.sample_read;
 	evsel->core.auto_merge_stats = orig->core.auto_merge_stats;
 	evsel->collect_stat = orig->collect_stat;
-	evsel->weak_group = orig->weak_group;
+	evsel->core.weak_group = orig->core.weak_group;
 	evsel->use_config_name = orig->use_config_name;
 
 	if (evsel__copy_config_terms(evsel, orig) < 0)
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index 79dd9ea5bf85..22f579e0e862 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -68,7 +68,6 @@ struct evsel {
 		bool			use_uncore_alias;
 		bool			is_libpfm_event;
 		bool			collect_stat;
-		bool			weak_group;
 		bool			bpf_counter;
 		bool			use_config_name;
 		int			bpf_fd;
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index dc70ff74b357..7a3a27f45644 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -2052,7 +2052,7 @@ int parse_events__modifier_event(struct list_head *list, char *str, bool add)
 		evsel->core.exclude_GH          = mod.exclude_GH;
 		evsel->core.sample_read         = mod.sample_read;
 		evsel->core.precise_max         = mod.precise_max;
-		evsel->weak_group	   = mod.weak;
+		evsel->core.weak_group          = mod.weak;
 		evsel->bpf_counter	   = mod.bpf_counter;
 
 		if (evsel__is_group_leader(evsel)) {
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 17/59] libperf: Move bpf_counter to perf_evsel
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (14 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 16/59] libperf: Move weak_group " Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 18/59] libperf: Move group_name " Jiri Olsa
                   ` (42 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving bpf_counter to perf_evsel struct.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/evsel.h | 1 +
 tools/perf/util/bpf_counter.c           | 2 +-
 tools/perf/util/evsel.h                 | 1 -
 tools/perf/util/parse-events.c          | 2 +-
 4 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
index 8374dc8365cb..81df282fa008 100644
--- a/tools/lib/perf/include/internal/evsel.h
+++ b/tools/lib/perf/include/internal/evsel.h
@@ -73,6 +73,7 @@ struct perf_evsel {
 		int			sample_read;
 		bool			precise_max;
 		bool			weak_group;
+		bool			bpf_counter;
 	};
 };
 
diff --git a/tools/perf/util/bpf_counter.c b/tools/perf/util/bpf_counter.c
index ced2dac31dcf..c0146b4a03d3 100644
--- a/tools/perf/util/bpf_counter.c
+++ b/tools/perf/util/bpf_counter.c
@@ -770,7 +770,7 @@ int bpf_counter__load(struct evsel *evsel, struct target *target)
 		evsel->bpf_counter_ops = &bpf_program_profiler_ops;
 	else if (cgrp_event_expanded && target->use_bpf)
 		evsel->bpf_counter_ops = &bperf_cgrp_ops;
-	else if (target->use_bpf || evsel->bpf_counter ||
+	else if (target->use_bpf || evsel->core.bpf_counter ||
 		 evsel__match_bpf_counter_events(evsel->name))
 		evsel->bpf_counter_ops = &bperf_ops;
 
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index 22f579e0e862..c09bbddd5da0 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -68,7 +68,6 @@ struct evsel {
 		bool			use_uncore_alias;
 		bool			is_libpfm_event;
 		bool			collect_stat;
-		bool			bpf_counter;
 		bool			use_config_name;
 		int			bpf_fd;
 		struct bpf_object	*bpf_obj;
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 7a3a27f45644..24d01b768078 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -2053,7 +2053,7 @@ int parse_events__modifier_event(struct list_head *list, char *str, bool add)
 		evsel->core.sample_read         = mod.sample_read;
 		evsel->core.precise_max         = mod.precise_max;
 		evsel->core.weak_group          = mod.weak;
-		evsel->bpf_counter	   = mod.bpf_counter;
+		evsel->core.bpf_counter	        = mod.bpf_counter;
 
 		if (evsel__is_group_leader(evsel)) {
 			evsel->core.attr.pinned = mod.pinned;
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 18/59] libperf: Move group_name to perf_evsel
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (15 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 17/59] libperf: Move bpf_counter " Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 17:58   ` Ian Rogers
  2021-11-08 13:36 ` [PATCH 19/59] perf tools: Fix parse_events_term__num call Jiri Olsa
                   ` (41 subsequent siblings)
  58 siblings, 1 reply; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving group_name to perf_evsel struct.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/evsel.h |  1 +
 tools/perf/tests/parse-events.c         | 32 ++++++++++++-------------
 tools/perf/util/auxtrace.c              |  6 ++---
 tools/perf/util/evsel.c                 | 10 ++++----
 tools/perf/util/evsel.h                 |  1 -
 tools/perf/util/evsel_fprintf.c         |  2 +-
 tools/perf/util/header.c                |  6 ++---
 tools/perf/util/parse-events.c          |  4 ++--
 8 files changed, 31 insertions(+), 31 deletions(-)

diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
index 81df282fa008..befcd180ef3d 100644
--- a/tools/lib/perf/include/internal/evsel.h
+++ b/tools/lib/perf/include/internal/evsel.h
@@ -64,6 +64,7 @@ struct perf_evsel {
 	 */
         struct {
                 char			*name;
+		const char		*group_name;
 		bool			auto_merge_stats;
 		struct list_head	config_terms;
 		const char		*metric_id;
diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
index 15d6d3d907b7..50746bb524f0 100644
--- a/tools/perf/tests/parse-events.c
+++ b/tools/perf/tests/parse-events.c
@@ -782,7 +782,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
 	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
 	TEST_ASSERT_VAL("wrong group name",
-		!strcmp(leader->group_name, "group1"));
+		!strcmp(leader->core.group_name, "group1"));
 	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
 	TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
@@ -800,7 +800,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
 	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
 	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 3);
 	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
+	TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
 	TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
 
@@ -817,7 +817,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
 	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
 	TEST_ASSERT_VAL("wrong group name",
-		!strcmp(leader->group_name, "group2"));
+		!strcmp(leader->core.group_name, "group2"));
 	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
 	TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
@@ -872,7 +872,7 @@ static int test__group4(struct evlist *evlist __maybe_unused)
 	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
 	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
 	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 1);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
+	TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
 	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
 	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
@@ -915,7 +915,7 @@ static int test__group5(struct evlist *evlist __maybe_unused)
 	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
 	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
+	TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
 	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
 	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
@@ -947,7 +947,7 @@ static int test__group5(struct evlist *evlist __maybe_unused)
 	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
 	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
+	TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
 	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
 	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
@@ -1001,7 +1001,7 @@ static int test__group_gh1(struct evlist *evlist)
 	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
 	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
+	TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
 	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
 	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
@@ -1041,7 +1041,7 @@ static int test__group_gh2(struct evlist *evlist)
 	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
 	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
+	TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
 	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
 	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
@@ -1081,7 +1081,7 @@ static int test__group_gh3(struct evlist *evlist)
 	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
 	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
+	TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
 	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
 	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
@@ -1121,7 +1121,7 @@ static int test__group_gh4(struct evlist *evlist)
 	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
 	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
+	TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
 	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
 	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
 	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
@@ -1160,7 +1160,7 @@ static int test__leader_sample1(struct evlist *evlist)
 	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
 	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
+	TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
 	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
 	TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
 
@@ -1189,7 +1189,7 @@ static int test__leader_sample1(struct evlist *evlist)
 	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
 	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
+	TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
 	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
 	TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
 
@@ -1213,7 +1213,7 @@ static int test__leader_sample2(struct evlist *evlist __maybe_unused)
 	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
 	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
+	TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
 	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
 	TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
 
@@ -1228,7 +1228,7 @@ static int test__leader_sample2(struct evlist *evlist __maybe_unused)
 	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
 	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
 	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
+	TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
 	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
 	TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
 
@@ -1259,7 +1259,7 @@ static int test__pinned_group(struct evlist *evlist)
 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
 	TEST_ASSERT_VAL("wrong config",
 			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
+	TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
 	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
 	TEST_ASSERT_VAL("wrong pinned", evsel->core.attr.pinned);
 
@@ -1303,7 +1303,7 @@ static int test__exclusive_group(struct evlist *evlist)
 	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
 	TEST_ASSERT_VAL("wrong config",
 			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
+	TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
 	TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
 	TEST_ASSERT_VAL("wrong exclusive", evsel->core.attr.exclusive);
 
diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
index c679394b898d..a882bc81e0fb 100644
--- a/tools/perf/util/auxtrace.c
+++ b/tools/perf/util/auxtrace.c
@@ -1235,9 +1235,9 @@ static void unleader_evsel(struct evlist *evlist, struct evsel *leader)
 
 	/* Update group information */
 	if (new_leader) {
-		zfree(&new_leader->group_name);
-		new_leader->group_name = leader->group_name;
-		leader->group_name = NULL;
+		zfree(&new_leader->core.group_name);
+		new_leader->core.group_name = leader->core.group_name;
+		leader->core.group_name = NULL;
 
 		new_leader->core.nr_members = leader->core.nr_members - 1;
 		leader->core.nr_members = 1;
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index aafd91805870..7621eddc8e58 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -395,9 +395,9 @@ struct evsel *evsel__clone(struct evsel *orig)
 		if (evsel->core.name == NULL)
 			goto out_err;
 	}
-	if (orig->group_name) {
-		evsel->group_name = strdup(orig->group_name);
-		if (evsel->group_name == NULL)
+	if (orig->core.group_name) {
+		evsel->core.group_name = strdup(orig->core.group_name);
+		if (evsel->core.group_name == NULL)
 			goto out_err;
 	}
 	if (orig->pmu_name) {
@@ -797,7 +797,7 @@ const char *evsel__metric_id(const struct evsel *evsel)
 
 const char *evsel__group_name(struct evsel *evsel)
 {
-	return evsel->group_name ?: "anon group";
+	return evsel->core.group_name ?: "anon group";
 }
 
 /*
@@ -1436,7 +1436,7 @@ void evsel__exit(struct evsel *evsel)
 	perf_cpu_map__put(evsel->core.cpus);
 	perf_cpu_map__put(evsel->core.own_cpus);
 	perf_thread_map__put(evsel->core.threads);
-	zfree(&evsel->group_name);
+	zfree(&evsel->core.group_name);
 	zfree(&evsel->core.name);
 	zfree(&evsel->pmu_name);
 	zfree(&evsel->core.metric_id);
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index c09bbddd5da0..e06d171baba3 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -54,7 +54,6 @@ struct evsel {
 	 * they can be released properly.
 	 */
 	struct {
-		char			*group_name;
 		const char		*pmu_name;
 		struct tep_event	*tp_format;
 		char			*filter;
diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprintf.c
index 8c2ea8001329..4670d1e745b2 100644
--- a/tools/perf/util/evsel_fprintf.c
+++ b/tools/perf/util/evsel_fprintf.c
@@ -48,7 +48,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
 			return 0;
 
 		if (evsel->core.nr_members > 1)
-			printed += fprintf(fp, "%s{", evsel->group_name ?: "");
+			printed += fprintf(fp, "%s{", evsel->core.group_name ?: "");
 
 		printed += fprintf(fp, "%s", evsel__name(evsel));
 		for_each_group_member(pos, evsel)
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 4610b23fed28..a14b690a6025 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -788,7 +788,7 @@ static int write_group_desc(struct feat_fd *ff,
 
 	evlist__for_each_entry(evlist, evsel) {
 		if (evsel__is_group_leader(evsel) && evsel->core.nr_members > 1) {
-			const char *name = evsel->group_name ?: "{anon_group}";
+			const char *name = evsel->core.group_name ?: "{anon_group}";
 			u32 leader_idx = evsel->core.idx;
 			u32 nr_members = evsel->core.nr_members;
 
@@ -2094,7 +2094,7 @@ static void print_group_desc(struct feat_fd *ff, FILE *fp)
 
 	evlist__for_each_entry(session->evlist, evsel) {
 		if (evsel__is_group_leader(evsel) && evsel->core.nr_members > 1) {
-			fprintf(fp, "# group: %s{%s", evsel->group_name ?: "", evsel__name(evsel));
+			fprintf(fp, "# group: %s{%s", evsel->core.group_name ?: "", evsel__name(evsel));
 
 			nr = evsel->core.nr_members - 1;
 		} else if (nr) {
@@ -2743,7 +2743,7 @@ static int process_group_desc(struct feat_fd *ff, void *data __maybe_unused)
 			evsel__set_leader(evsel, evsel);
 			/* {anon_group} is a dummy name */
 			if (strcmp(desc[i].name, "{anon_group}")) {
-				evsel->group_name = desc[i].name;
+				evsel->core.group_name = desc[i].name;
 				desc[i].name = NULL;
 			}
 			evsel->core.nr_members = desc[i].nr_members;
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 24d01b768078..05a96b0f7b41 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1841,7 +1841,7 @@ parse_events__set_leader_for_uncore_aliase(char *name, struct list_head *list,
 	for (i = 0; i < nr_pmu; i++) {
 		evsel = (struct evsel *) leaders[i];
 		evsel->core.nr_members = total_members / nr_pmu;
-		evsel->group_name = name ? strdup(name) : NULL;
+		evsel->core.group_name = name ? strdup(name) : NULL;
 	}
 
 	/* Take the new small groups into account */
@@ -1869,7 +1869,7 @@ void parse_events__set_leader(char *name, struct list_head *list,
 
 	__perf_evlist__set_leader(list);
 	leader = list_entry(list->next, struct evsel, core.node);
-	leader->group_name = name ? strdup(name) : NULL;
+	leader->core.group_name = name ? strdup(name) : NULL;
 }
 
 /* list_event is assumed to point to malloc'ed memory */
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 19/59] perf tools: Fix parse_events_term__num call
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (16 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 18/59] libperf: Move group_name " Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 18:15   ` Ian Rogers
  2021-11-08 13:36 ` [PATCH 20/59] perf tools: Pass parse_state all the way down to __add_event Jiri Olsa
                   ` (40 subsequent siblings)
  58 siblings, 1 reply; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

We are wrongly passing &config to parse_events_term__num
as loc_term_ argument.

Fixes: fb0811535e92 ("perf parse-events: Allow config on kernel PMU events")
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/parse-events.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 05a96b0f7b41..2bacbab86b09 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1697,8 +1697,7 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
 
 	if (parse_events_term__num(&term,
 				   PARSE_EVENTS__TERM_TYPE_USER,
-				   config, 1, false, &config,
-					NULL) < 0) {
+				   config, 1, false, NULL, NULL) < 0) {
 		free(config);
 		goto out_err;
 	}
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 20/59] perf tools: Pass parse_state all the way down to __add_event
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (17 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 19/59] perf tools: Fix parse_events_term__num call Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 21/59] perf tools: Pass parse_state all the way down to add_tracepoint Jiri Olsa
                   ` (39 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

So we can provide event allocation callbacks.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/parse-events-hybrid.c | 24 +++++++------
 tools/perf/util/parse-events-hybrid.h |  6 ++--
 tools/perf/util/parse-events.c        | 49 +++++++++++++++------------
 tools/perf/util/parse-events.h        | 15 ++++----
 tools/perf/util/parse-events.y        | 21 ++++--------
 5 files changed, 60 insertions(+), 55 deletions(-)

diff --git a/tools/perf/util/parse-events-hybrid.c b/tools/perf/util/parse-events-hybrid.c
index de901e74ce3d..49e9047d20d9 100644
--- a/tools/perf/util/parse-events-hybrid.c
+++ b/tools/perf/util/parse-events-hybrid.c
@@ -36,7 +36,8 @@ static void config_hybrid_attr(struct perf_event_attr *attr,
 	attr->config = attr->config | ((__u64)pmu_type << PERF_PMU_TYPE_SHIFT);
 }
 
-static int create_event_hybrid(__u32 config_type, int *idx,
+static int create_event_hybrid(struct parse_events_state *parse_state,
+			       __u32 config_type,
 			       struct list_head *list,
 			       struct perf_event_attr *attr, const char *name,
 			       const char *metric_id,
@@ -48,7 +49,7 @@ static int create_event_hybrid(__u32 config_type, int *idx,
 	__u64 config = attr->config;
 
 	config_hybrid_attr(attr, config_type, pmu->type);
-	evsel = parse_events__add_event_hybrid(list, idx, attr, name, metric_id,
+	evsel = parse_events__add_event_hybrid(parse_state, list, attr, name, metric_id,
 					       pmu, config_terms);
 	if (evsel)
 		evsel->pmu_name = strdup(pmu->name);
@@ -84,8 +85,8 @@ static int add_hw_hybrid(struct parse_events_state *parse_state,
 			continue;
 
 		copy_config_terms(&terms, config_terms);
-		ret = create_event_hybrid(PERF_TYPE_HARDWARE,
-					  &parse_state->idx, list, attr, name,
+		ret = create_event_hybrid(parse_state, PERF_TYPE_HARDWARE,
+					  list, attr, name,
 					  metric_id, &terms, pmu);
 		free_config_terms(&terms);
 		if (ret)
@@ -95,7 +96,8 @@ static int add_hw_hybrid(struct parse_events_state *parse_state,
 	return 0;
 }
 
-static int create_raw_event_hybrid(int *idx, struct list_head *list,
+static int create_raw_event_hybrid(struct parse_events_state *parse_state,
+				   struct list_head *list,
 				   struct perf_event_attr *attr,
 				   const char *name,
 				   const char *metric_id,
@@ -105,7 +107,7 @@ static int create_raw_event_hybrid(int *idx, struct list_head *list,
 	struct evsel *evsel;
 
 	attr->type = pmu->type;
-	evsel = parse_events__add_event_hybrid(list, idx, attr, name, metric_id,
+	evsel = parse_events__add_event_hybrid(parse_state, list, attr, name, metric_id,
 					       pmu, config_terms);
 	if (evsel)
 		evsel->pmu_name = strdup(pmu->name);
@@ -130,7 +132,7 @@ static int add_raw_hybrid(struct parse_events_state *parse_state,
 			continue;
 
 		copy_config_terms(&terms, config_terms);
-		ret = create_raw_event_hybrid(&parse_state->idx, list, attr,
+		ret = create_raw_event_hybrid(parse_state, list, attr,
 					      name, metric_id, &terms, pmu);
 		free_config_terms(&terms);
 		if (ret)
@@ -164,13 +166,13 @@ int parse_events__add_numeric_hybrid(struct parse_events_state *parse_state,
 			      config_terms);
 }
 
-int parse_events__add_cache_hybrid(struct list_head *list, int *idx,
+int parse_events__add_cache_hybrid(struct parse_events_state *parse_state,
+				   struct list_head *list,
 				   struct perf_event_attr *attr,
 				   const char *name,
 				   const char *metric_id,
 				   struct list_head *config_terms,
-				   bool *hybrid,
-				   struct parse_events_state *parse_state)
+				   bool *hybrid)
 {
 	struct perf_pmu *pmu;
 	int ret;
@@ -187,7 +189,7 @@ int parse_events__add_cache_hybrid(struct list_head *list, int *idx,
 			continue;
 
 		copy_config_terms(&terms, config_terms);
-		ret = create_event_hybrid(PERF_TYPE_HW_CACHE, idx, list,
+		ret = create_event_hybrid(parse_state, PERF_TYPE_HW_CACHE, list,
 					  attr, name, metric_id, &terms, pmu);
 		free_config_terms(&terms);
 		if (ret)
diff --git a/tools/perf/util/parse-events-hybrid.h b/tools/perf/util/parse-events-hybrid.h
index cbc05fec02a2..7e4a88a87846 100644
--- a/tools/perf/util/parse-events-hybrid.h
+++ b/tools/perf/util/parse-events-hybrid.h
@@ -15,11 +15,11 @@ int parse_events__add_numeric_hybrid(struct parse_events_state *parse_state,
 				     struct list_head *config_terms,
 				     bool *hybrid);
 
-int parse_events__add_cache_hybrid(struct list_head *list, int *idx,
+int parse_events__add_cache_hybrid(struct parse_events_state *parse_state,
+				   struct list_head *list,
 				   struct perf_event_attr *attr,
 				   const char *name, const char *metric_id,
 				   struct list_head *config_terms,
-				   bool *hybrid,
-				   struct parse_events_state *parse_state);
+				   bool *hybrid);
 
 #endif /* __PERF_PARSE_EVENTS_HYBRID_H */
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 2bacbab86b09..d3ad2c89c7a2 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -357,7 +357,8 @@ static char *get_config_name(struct list_head *head_terms)
 }
 
 static struct evsel *
-__add_event(struct list_head *list, int *idx,
+__add_event(struct parse_events_state *parse_state,
+	    struct list_head *list,
 	    struct perf_event_attr *attr,
 	    bool init_attr,
 	    const char *name, const char *metric_id, struct perf_pmu *pmu,
@@ -367,6 +368,7 @@ __add_event(struct list_head *list, int *idx,
 	struct evsel *evsel;
 	struct perf_cpu_map *cpus = pmu ? perf_cpu_map__get(pmu->cpus) :
 			       cpu_list ? perf_cpu_map__new(cpu_list) : NULL;
+	int *idx = &parse_state->idx;
 
 	if (pmu && attr->type == PERF_TYPE_RAW)
 		perf_pmu__warn_invalid_config(pmu, attr->config, name);
@@ -401,25 +403,28 @@ __add_event(struct list_head *list, int *idx,
 	return evsel;
 }
 
-struct evsel *parse_events__add_event(int idx, struct perf_event_attr *attr,
+struct evsel *parse_events__add_event(struct parse_events_state *parse_state,
+				      struct perf_event_attr *attr,
 				      const char *name, const char *metric_id,
 				      struct perf_pmu *pmu)
 {
-	return __add_event(/*list=*/NULL, &idx, attr, /*init_attr=*/false, name,
+	return __add_event(parse_state, /*list=*/NULL, attr, /*init_attr=*/false, name,
 			   metric_id, pmu, /*config_terms=*/NULL,
 			   /*auto_merge_stats=*/false, /*cpu_list=*/NULL);
 }
 
-static int add_event(struct list_head *list, int *idx,
+static int add_event(struct parse_events_state *parse_state,
+		     struct list_head *list,
 		     struct perf_event_attr *attr, const char *name,
 		     const char *metric_id, struct list_head *config_terms)
 {
-	return __add_event(list, idx, attr, /*init_attr*/true, name, metric_id,
+	return __add_event(parse_state, list, attr, /*init_attr*/true, name, metric_id,
 			   /*pmu=*/NULL, config_terms,
 			   /*auto_merge_stats=*/false, /*cpu_list=*/NULL) ? 0 : -ENOMEM;
 }
 
-static int add_event_tool(struct list_head *list, int *idx,
+static int add_event_tool(struct parse_events_state *parse_state,
+			  struct list_head *list,
 			  enum perf_tool_event tool_event)
 {
 	struct evsel *evsel;
@@ -428,7 +433,7 @@ static int add_event_tool(struct list_head *list, int *idx,
 		.config = PERF_COUNT_SW_DUMMY,
 	};
 
-	evsel = __add_event(list, idx, &attr, /*init_attr=*/true, /*name=*/NULL,
+	evsel = __add_event(parse_state, list, &attr, /*init_attr=*/true, /*name=*/NULL,
 			    /*metric_id=*/NULL, /*pmu=*/NULL,
 			    /*config_terms=*/NULL, /*auto_merge_stats=*/false,
 			    /*cpu_list=*/"0");
@@ -469,11 +474,11 @@ static int config_attr(struct perf_event_attr *attr,
 		       struct parse_events_error *err,
 		       config_term_func_t config_term);
 
-int parse_events_add_cache(struct list_head *list, int *idx,
+int parse_events_add_cache(struct parse_events_state *parse_state,
+			   struct list_head *list,
 			   char *type, char *op_result1, char *op_result2,
 			   struct parse_events_error *err,
-			   struct list_head *head_config,
-			   struct parse_events_state *parse_state)
+			   struct list_head *head_config)
 {
 	struct perf_event_attr attr;
 	LIST_HEAD(config_terms);
@@ -544,15 +549,15 @@ int parse_events_add_cache(struct list_head *list, int *idx,
 	}
 
 	metric_id = get_config_metric_id(head_config);
-	ret = parse_events__add_cache_hybrid(list, idx, &attr,
+	ret = parse_events__add_cache_hybrid(parse_state, list, &attr,
 					     config_name ? : name,
 					     metric_id,
 					     &config_terms,
-					     &hybrid, parse_state);
+					     &hybrid);
 	if (hybrid)
 		goto out_free_terms;
 
-	ret = add_event(list, idx, &attr, config_name ? : name, metric_id,
+	ret = add_event(parse_state, list, &attr, config_name ? : name, metric_id,
 			&config_terms);
 out_free_terms:
 	free_config_terms(&config_terms);
@@ -1006,7 +1011,8 @@ do {					\
 	return 0;
 }
 
-int parse_events_add_breakpoint(struct list_head *list, int *idx,
+int parse_events_add_breakpoint(struct parse_events_state *parse_state,
+				struct list_head *list,
 				u64 addr, char *type, u64 len)
 {
 	struct perf_event_attr attr;
@@ -1030,7 +1036,7 @@ int parse_events_add_breakpoint(struct list_head *list, int *idx,
 	attr.type = PERF_TYPE_BREAKPOINT;
 	attr.sample_period = 1;
 
-	return add_event(list, idx, &attr, /*name=*/NULL, /*mertic_id=*/NULL,
+	return add_event(parse_state, list, &attr, /*name=*/NULL, /*mertic_id=*/NULL,
 			 /*config_terms=*/NULL);
 }
 
@@ -1487,7 +1493,7 @@ int parse_events_add_numeric(struct parse_events_state *parse_state,
 	if (hybrid)
 		goto out_free_terms;
 
-	ret = add_event(list, &parse_state->idx, &attr, name, metric_id,
+	ret = add_event(parse_state, list, &attr, name, metric_id,
 			&config_terms);
 out_free_terms:
 	free_config_terms(&config_terms);
@@ -1498,7 +1504,7 @@ int parse_events_add_tool(struct parse_events_state *parse_state,
 			  struct list_head *list,
 			  int tool_event)
 {
-	return add_event_tool(list, &parse_state->idx, tool_event);
+	return add_event_tool(parse_state, list, tool_event);
 }
 
 static bool config_term_percore(struct list_head *config_terms)
@@ -1589,7 +1595,7 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
 
 	if (!head_config) {
 		attr.type = pmu->type;
-		evsel = __add_event(list, &parse_state->idx, &attr,
+		evsel = __add_event(parse_state, list, &attr,
 				    /*init_attr=*/true, /*name=*/NULL,
 				    /*metric_id=*/NULL, pmu,
 				    /*config_terms=*/NULL, auto_merge_stats,
@@ -1646,7 +1652,7 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
 		return -EINVAL;
 	}
 
-	evsel = __add_event(list, &parse_state->idx, &attr, /*init_attr=*/true,
+	evsel = __add_event(parse_state, list, &attr, /*init_attr=*/true,
 			    get_config_name(head_config),
 			    get_config_metric_id(head_config), pmu,
 			    &config_terms, auto_merge_stats, /*cpu_list=*/NULL);
@@ -3380,14 +3386,15 @@ char *parse_events_formats_error_string(char *additional_terms)
 	return NULL;
 }
 
-struct evsel *parse_events__add_event_hybrid(struct list_head *list, int *idx,
+struct evsel *parse_events__add_event_hybrid(struct parse_events_state *parse_state,
+					     struct list_head *list,
 					     struct perf_event_attr *attr,
 					     const char *name,
 					     const char *metric_id,
 					     struct perf_pmu *pmu,
 					     struct list_head *config_terms)
 {
-	return __add_event(list, idx, attr, /*init_attr=*/true, name, metric_id,
+	return __add_event(parse_state, list, attr, /*init_attr=*/true, name, metric_id,
 			   pmu, config_terms, /*auto_merge_stats=*/false,
 			   /*cpu_list=*/NULL);
 }
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index f60a661a2247..218a282d8b3d 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -186,12 +186,13 @@ int parse_events_add_numeric(struct parse_events_state *parse_state,
 int parse_events_add_tool(struct parse_events_state *parse_state,
 			  struct list_head *list,
 			  int tool_event);
-int parse_events_add_cache(struct list_head *list, int *idx,
+int parse_events_add_cache(struct parse_events_state *parse_state,
+			   struct list_head *list,
 			   char *type, char *op_result1, char *op_result2,
 			   struct parse_events_error *error,
-			   struct list_head *head_config,
-			   struct parse_events_state *parse_state);
-int parse_events_add_breakpoint(struct list_head *list, int *idx,
+			   struct list_head *head_config);
+int parse_events_add_breakpoint(struct parse_events_state *parse_state,
+				struct list_head *list,
 				u64 addr, char *type, u64 len);
 int parse_events_add_pmu(struct parse_events_state *parse_state,
 			 struct list_head *list, char *name,
@@ -199,7 +200,8 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
 			 bool auto_merge_stats,
 			 bool use_alias);
 
-struct evsel *parse_events__add_event(int idx, struct perf_event_attr *attr,
+struct evsel *parse_events__add_event(struct parse_events_state *parse_state,
+				      struct perf_event_attr *attr,
 				      const char *name, const char *metric_id,
 				      struct perf_pmu *pmu);
 
@@ -268,7 +270,8 @@ static inline bool is_sdt_event(char *str __maybe_unused)
 
 int perf_pmu__test_parse_init(void);
 
-struct evsel *parse_events__add_event_hybrid(struct list_head *list, int *idx,
+struct evsel *parse_events__add_event_hybrid(struct parse_events_state *parse_state,
+					     struct list_head *list,
 					     struct perf_event_attr *attr,
 					     const char *name,
 					     const char *metric_id,
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 2d60f3cbe42b..30c382d4a605 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -478,8 +478,7 @@ PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT opt_e
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	err = parse_events_add_cache(list, &parse_state->idx, $1, $3, $5, error, $6,
-				     parse_state);
+	err = parse_events_add_cache(parse_state, list, $1, $3, $5, error, $6);
 	parse_events_terms__delete($6);
 	free($1);
 	free($3);
@@ -500,8 +499,7 @@ PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT opt_event_config
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	err = parse_events_add_cache(list, &parse_state->idx, $1, $3, NULL, error, $4,
-				     parse_state);
+	err = parse_events_add_cache(parse_state, list, $1, $3, NULL, error, $4);
 	parse_events_terms__delete($4);
 	free($1);
 	free($3);
@@ -521,8 +519,7 @@ PE_NAME_CACHE_TYPE opt_event_config
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	err = parse_events_add_cache(list, &parse_state->idx, $1, NULL, NULL, error, $2,
-				     parse_state);
+	err = parse_events_add_cache(parse_state, list, $1, NULL, NULL, error, $2);
 	parse_events_terms__delete($2);
 	free($1);
 	if (err) {
@@ -541,8 +538,7 @@ PE_PREFIX_MEM PE_VALUE '/' PE_VALUE ':' PE_MODIFIER_BP sep_dc
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	err = parse_events_add_breakpoint(list, &parse_state->idx,
-					  $2, $6, $4);
+	err = parse_events_add_breakpoint(parse_state, list, $2, $6, $4);
 	free($6);
 	if (err) {
 		free(list);
@@ -558,8 +554,7 @@ PE_PREFIX_MEM PE_VALUE '/' PE_VALUE sep_dc
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	if (parse_events_add_breakpoint(list, &parse_state->idx,
-					$2, NULL, $4)) {
+	if (parse_events_add_breakpoint(parse_state, list, $2, NULL, $4)) {
 		free(list);
 		YYABORT;
 	}
@@ -574,8 +569,7 @@ PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	err = parse_events_add_breakpoint(list, &parse_state->idx,
-					  $2, $4, 0);
+	err = parse_events_add_breakpoint(parse_state, list, $2, $4, 0);
 	free($4);
 	if (err) {
 		free(list);
@@ -591,8 +585,7 @@ PE_PREFIX_MEM PE_VALUE sep_dc
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	if (parse_events_add_breakpoint(list, &parse_state->idx,
-					$2, NULL, 0)) {
+	if (parse_events_add_breakpoint(parse_state, list, $2, NULL, 0)) {
 		free(list);
 		YYABORT;
 	}
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 21/59] perf tools: Pass parse_state all the way down to add_tracepoint
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (18 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 20/59] perf tools: Pass parse_state all the way down to __add_event Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 22/59] perf tools: Add evsel__new callback to parse_state_ops Jiri Olsa
                   ` (38 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

So we can provide event allocation callbacks.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/parse-events.c | 30 ++++++++++++++++++------------
 tools/perf/util/parse-events.h |  3 ++-
 tools/perf/util/parse-events.y |  2 +-
 3 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index d3ad2c89c7a2..8f8151738a78 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -595,11 +595,13 @@ static void tracepoint_error(struct parse_events_error *e, int err,
 	parse_events__handle_error(e, 0, strdup(str), strdup(help));
 }
 
-static int add_tracepoint(struct list_head *list, int *idx,
+static int add_tracepoint(struct parse_events_state *parse_state,
+			  struct list_head *list,
 			  const char *sys_name, const char *evt_name,
 			  struct parse_events_error *err,
 			  struct list_head *head_config)
 {
+	int *idx = &parse_state->idx;
 	struct evsel *evsel = evsel__newtp_idx(sys_name, evt_name, (*idx)++);
 
 	if (IS_ERR(evsel)) {
@@ -619,7 +621,8 @@ static int add_tracepoint(struct list_head *list, int *idx,
 	return 0;
 }
 
-static int add_tracepoint_multi_event(struct list_head *list, int *idx,
+static int add_tracepoint_multi_event(struct parse_events_state *parse_state,
+				      struct list_head *list,
 				      const char *sys_name, const char *evt_name,
 				      struct parse_events_error *err,
 				      struct list_head *head_config)
@@ -653,7 +656,7 @@ static int add_tracepoint_multi_event(struct list_head *list, int *idx,
 
 		found++;
 
-		ret = add_tracepoint(list, idx, sys_name, evt_ent->d_name,
+		ret = add_tracepoint(parse_state, list, sys_name, evt_ent->d_name,
 				     err, head_config);
 	}
 
@@ -667,19 +670,21 @@ static int add_tracepoint_multi_event(struct list_head *list, int *idx,
 	return ret;
 }
 
-static int add_tracepoint_event(struct list_head *list, int *idx,
+static int add_tracepoint_event(struct parse_events_state *parse_state,
+				struct list_head *list,
 				const char *sys_name, const char *evt_name,
 				struct parse_events_error *err,
 				struct list_head *head_config)
 {
 	return strpbrk(evt_name, "*?") ?
-	       add_tracepoint_multi_event(list, idx, sys_name, evt_name,
+	       add_tracepoint_multi_event(parse_state, list, sys_name, evt_name,
 					  err, head_config) :
-	       add_tracepoint(list, idx, sys_name, evt_name,
+	       add_tracepoint(parse_state, list, sys_name, evt_name,
 			      err, head_config);
 }
 
-static int add_tracepoint_multi_sys(struct list_head *list, int *idx,
+static int add_tracepoint_multi_sys(struct parse_events_state *parse_state,
+				    struct list_head *list,
 				    const char *sys_name, const char *evt_name,
 				    struct parse_events_error *err,
 				    struct list_head *head_config)
@@ -705,7 +710,7 @@ static int add_tracepoint_multi_sys(struct list_head *list, int *idx,
 		if (!strglobmatch(events_ent->d_name, sys_name))
 			continue;
 
-		ret = add_tracepoint_event(list, idx, events_ent->d_name,
+		ret = add_tracepoint_event(parse_state, list, events_ent->d_name,
 					   evt_name, err, head_config);
 	}
 
@@ -742,7 +747,7 @@ static int add_bpf_event(const char *group, const char *event, int fd, struct bp
 	pr_debug("add bpf event %s:%s and attach bpf program %d\n",
 		 group, event, fd);
 
-	err = parse_events_add_tracepoint(&new_evsels, &parse_state->idx, group,
+	err = parse_events_add_tracepoint(parse_state, &new_evsels, group,
 					  event, parse_state->error,
 					  param->head_config);
 	if (err) {
@@ -1440,7 +1445,8 @@ static int get_config_chgs(struct perf_pmu *pmu, struct list_head *head_config,
 	return 0;
 }
 
-int parse_events_add_tracepoint(struct list_head *list, int *idx,
+int parse_events_add_tracepoint(struct parse_events_state *parse_state,
+				struct list_head *list,
 				const char *sys, const char *event,
 				struct parse_events_error *err,
 				struct list_head *head_config)
@@ -1454,10 +1460,10 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx,
 	}
 
 	if (strpbrk(sys, "*?"))
-		return add_tracepoint_multi_sys(list, idx, sys, event,
+		return add_tracepoint_multi_sys(parse_state, list, sys, event,
 						err, head_config);
 	else
-		return add_tracepoint_event(list, idx, sys, event,
+		return add_tracepoint_event(parse_state, list, sys, event,
 					    err, head_config);
 }
 
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 218a282d8b3d..aedb1153a1a1 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -164,7 +164,8 @@ void parse_events__clear_array(struct parse_events_array *a);
 int parse_events__modifier_event(struct list_head *list, char *str, bool add);
 int parse_events__modifier_group(struct list_head *list, char *event_mod);
 int parse_events_name(struct list_head *list, const char *name);
-int parse_events_add_tracepoint(struct list_head *list, int *idx,
+int parse_events_add_tracepoint(struct parse_events_state *parse_state,
+				struct list_head *list,
 				const char *sys, const char *event,
 				struct parse_events_error *error,
 				struct list_head *head_config);
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 30c382d4a605..7d7bffed0dd7 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -605,7 +605,7 @@ tracepoint_name opt_event_config
 	if (error)
 		error->idx = @1.first_column;
 
-	err = parse_events_add_tracepoint(list, &parse_state->idx, $1.sys, $1.event,
+	err = parse_events_add_tracepoint(parse_state, list, $1.sys, $1.event,
 					error, $2);
 
 	parse_events_terms__delete($2);
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 22/59] perf tools: Add evsel__new callback to parse_state_ops
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (19 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 21/59] perf tools: Pass parse_state all the way down to add_tracepoint Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 23/59] perf tools: Add evsel__new_tp " Jiri Olsa
                   ` (37 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Adding evsel__new callback to parse_state_ops to allow
custom event allocation for event parsing.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/parse-events.c | 13 ++++++++++---
 tools/perf/util/parse-events.h |  5 +++++
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 8f8151738a78..e782a329484e 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -154,6 +154,10 @@ struct event_symbol event_symbols_sw[PERF_COUNT_SW_MAX] = {
 	},
 };
 
+static struct parse_events_ops parse_state_ops = {
+	.evsel__new = evsel__new_idx,
+};
+
 #define __PERF_EVENT_FIELD(config, name) \
 	((config & PERF_EVENT_##name##_MASK) >> PERF_EVENT_##name##_SHIFT)
 
@@ -376,7 +380,7 @@ __add_event(struct parse_events_state *parse_state,
 	if (init_attr)
 		event_attr_init(attr);
 
-	evsel = evsel__new_idx(attr, *idx);
+	evsel = parse_state->ops->evsel__new(attr, *idx);
 	if (!evsel) {
 		perf_cpu_map__put(cpus);
 		return NULL;
@@ -2256,8 +2260,9 @@ static int parse_events__scanner(const char *str,
 int parse_events_terms(struct list_head *terms, const char *str)
 {
 	struct parse_events_state parse_state = {
-		.terms  = NULL,
-		.stoken = PE_START_TERMS,
+		.ops     = &parse_state_ops,
+		.terms   = NULL,
+		.stoken  = PE_START_TERMS,
 	};
 	int ret;
 
@@ -2283,6 +2288,7 @@ static int parse_events__with_hybrid_pmu(struct parse_events_state *parse_state,
 		.stoken          = PE_START_EVENTS,
 		.hybrid_pmu_name = pmu_name,
 		.idx             = parse_state->idx,
+		.ops             = &parse_state_ops,
 	};
 	int ret;
 
@@ -2311,6 +2317,7 @@ int __parse_events(struct evlist *evlist, const char *str,
 		.evlist	  = evlist,
 		.stoken	  = PE_START_EVENTS,
 		.fake_pmu = fake_pmu,
+		.ops	  = &parse_state_ops,
 	};
 	int ret;
 
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index aedb1153a1a1..346c3a8cd381 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -130,6 +130,10 @@ struct parse_events_error {
 	char *first_help;
 };
 
+struct parse_events_ops {
+	struct evsel* (*evsel__new)(struct perf_event_attr *attr, int idx);
+};
+
 struct parse_events_state {
 	struct list_head	   list;
 	int			   idx;
@@ -140,6 +144,7 @@ struct parse_events_state {
 	int			   stoken;
 	struct perf_pmu		  *fake_pmu;
 	char			  *hybrid_pmu_name;
+	struct parse_events_ops	  *ops;
 };
 
 void parse_events__handle_error(struct parse_events_error *err, int idx,
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 23/59] perf tools: Add evsel__new_tp callback to parse_state_ops
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (20 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 22/59] perf tools: Add evsel__new callback to parse_state_ops Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 24/59] perf tools: Add loc_term and loc_val helpers to parse_events_term__str Jiri Olsa
                   ` (36 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Adding evsel__new_tp callback to parse_state_ops to allow
custom tracepoint event allocation for event parsing.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/parse-events.c | 5 +++--
 tools/perf/util/parse-events.h | 1 +
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index e782a329484e..60f48d797853 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -155,7 +155,8 @@ struct event_symbol event_symbols_sw[PERF_COUNT_SW_MAX] = {
 };
 
 static struct parse_events_ops parse_state_ops = {
-	.evsel__new = evsel__new_idx,
+	.evsel__new    = evsel__new_idx,
+	.evsel__new_tp = evsel__newtp_idx,
 };
 
 #define __PERF_EVENT_FIELD(config, name) \
@@ -606,7 +607,7 @@ static int add_tracepoint(struct parse_events_state *parse_state,
 			  struct list_head *head_config)
 {
 	int *idx = &parse_state->idx;
-	struct evsel *evsel = evsel__newtp_idx(sys_name, evt_name, (*idx)++);
+	struct evsel *evsel = parse_state->ops->evsel__new_tp(sys_name, evt_name, (*idx)++);
 
 	if (IS_ERR(evsel)) {
 		tracepoint_error(err, PTR_ERR(evsel), sys_name, evt_name);
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 346c3a8cd381..728074093c95 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -132,6 +132,7 @@ struct parse_events_error {
 
 struct parse_events_ops {
 	struct evsel* (*evsel__new)(struct perf_event_attr *attr, int idx);
+	struct evsel* (*evsel__new_tp)(const char *sys, const char *name, int idx);
 };
 
 struct parse_events_state {
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 24/59] perf tools: Add loc_term and loc_val helpers to parse_events_term__str
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (21 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 23/59] perf tools: Add evsel__new_tp " Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 25/59] perf tools: Add loc_term and loc_val helpers to parse_events_term__num Jiri Olsa
                   ` (35 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Move out bison specific code out of parse_events_term__str.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/parse-events.c |  9 +++------
 tools/perf/util/parse-events.h |  2 +-
 tools/perf/util/parse-events.y | 23 +++++++++++++++++++----
 3 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 60f48d797853..cf46930750b5 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -3210,17 +3210,14 @@ int parse_events_term__num(struct parse_events_term **term,
 
 int parse_events_term__str(struct parse_events_term **term,
 			   int type_term, char *config, char *str,
-			   void *loc_term_, void *loc_val_)
+			   int loc_term, int loc_val)
 {
-	YYLTYPE *loc_term = loc_term_;
-	YYLTYPE *loc_val = loc_val_;
-
 	struct parse_events_term temp = {
 		.type_val  = PARSE_EVENTS__TERM_TYPE_STR,
 		.type_term = type_term,
 		.config    = config,
-		.err_term  = loc_term ? loc_term->first_column : 0,
-		.err_val   = loc_val  ? loc_val->first_column  : 0,
+		.err_term  = loc_term,
+		.err_val   = loc_val,
 	};
 
 	return new_term(term, &temp, str, 0);
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 728074093c95..0590f613a38c 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -158,7 +158,7 @@ int parse_events_term__num(struct parse_events_term **term,
 			   void *loc_term, void *loc_val);
 int parse_events_term__str(struct parse_events_term **term,
 			   int type_term, char *config, char *str,
-			   void *loc_term, void *loc_val);
+			   int loc_term, int loc_val);
 int parse_events_term__sym_hw(struct parse_events_term **term,
 			      char *config, unsigned idx);
 int parse_events_term__clone(struct parse_events_term **new,
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 7d7bffed0dd7..76b089c572af 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -57,6 +57,20 @@ static void inc_group_count(struct list_head *list,
 		parse_state->nr_groups++;
 }
 
+static int loc_term(void *loc_term_)
+{
+	YYLTYPE *loc_term = loc_term_;
+
+	return loc_term ? loc_term->first_column : 0;
+}
+
+static int loc_val(void *loc_val_)
+{
+	YYLTYPE *loc_val = loc_val_;
+
+	return loc_val ? loc_val->first_column  : 0;
+}
+
 %}
 
 %token PE_START_EVENTS PE_START_TERMS
@@ -782,7 +796,7 @@ PE_NAME '=' PE_NAME
 	struct parse_events_term *term;
 
 	if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
-					$1, $3, &@1, &@3)) {
+					$1, $3, loc_term(&@1), loc_val(&@3))) {
 		free($1);
 		free($3);
 		YYABORT;
@@ -839,7 +853,8 @@ PE_TERM '=' PE_NAME
 {
 	struct parse_events_term *term;
 
-	if (parse_events_term__str(&term, (int)$1, NULL, $3, &@1, &@3)) {
+	if (parse_events_term__str(&term, (int)$1, NULL, $3,
+				   loc_term(&@1), loc_val(&@3))) {
 		free($3);
 		YYABORT;
 	}
@@ -867,7 +882,7 @@ PE_NAME array '=' PE_NAME
 	struct parse_events_term *term;
 
 	if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
-					$1, $4, &@1, &@4)) {
+					$1, $4, loc_term(&@1), loc_val(&@4))) {
 		free($1);
 		free($4);
 		free($2.ranges);
@@ -898,7 +913,7 @@ PE_DRV_CFG_TERM
 
 	ABORT_ON(!config);
 	if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_DRV_CFG,
-					config, $1, &@1, NULL)) {
+					config, $1, loc_term(&@1), 0)) {
 		free($1);
 		free(config);
 		YYABORT;
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 25/59] perf tools: Add loc_term and loc_val helpers to parse_events_term__num
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (22 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 24/59] perf tools: Add loc_term and loc_val helpers to parse_events_term__str Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 26/59] libperf: Move in the event_symbols_hw/event_symbols_sw Jiri Olsa
                   ` (34 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Move out bison specific code out of parse_events_term__num.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/parse-events.c | 11 ++++-------
 tools/perf/util/parse-events.h |  2 +-
 tools/perf/util/parse-events.y | 13 +++++++------
 3 files changed, 12 insertions(+), 14 deletions(-)

diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index cf46930750b5..c36657d906ce 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1714,7 +1714,7 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
 
 	if (parse_events_term__num(&term,
 				   PARSE_EVENTS__TERM_TYPE_USER,
-				   config, 1, false, NULL, NULL) < 0) {
+				   config, 1, false, 0, 0) < 0) {
 		free(config);
 		goto out_err;
 	}
@@ -3191,18 +3191,15 @@ static int new_term(struct parse_events_term **_term,
 int parse_events_term__num(struct parse_events_term **term,
 			   int type_term, char *config, u64 num,
 			   bool no_value,
-			   void *loc_term_, void *loc_val_)
+			   int loc_term, int loc_val)
 {
-	YYLTYPE *loc_term = loc_term_;
-	YYLTYPE *loc_val = loc_val_;
-
 	struct parse_events_term temp = {
 		.type_val  = PARSE_EVENTS__TERM_TYPE_NUM,
 		.type_term = type_term,
 		.config    = config ? : strdup(config_term_names[type_term]),
 		.no_value  = no_value,
-		.err_term  = loc_term ? loc_term->first_column : 0,
-		.err_val   = loc_val  ? loc_val->first_column  : 0,
+		.err_term  = loc_term,
+		.err_val   = loc_val,
 	};
 
 	return new_term(term, &temp, NULL, num);
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 0590f613a38c..29ea37808d32 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -155,7 +155,7 @@ int parse_events__is_hardcoded_term(struct parse_events_term *term);
 int parse_events_term__num(struct parse_events_term **term,
 			   int type_term, char *config, u64 num,
 			   bool novalue,
-			   void *loc_term, void *loc_val);
+			   int loc_term, int loc_val);
 int parse_events_term__str(struct parse_events_term **term,
 			   int type_term, char *config, char *str,
 			   int loc_term, int loc_val);
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 76b089c572af..e62a7a3bf6b2 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -787,7 +787,7 @@ PE_RAW
 	struct parse_events_term *term;
 
 	ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_CONFIG,
-					NULL, $1, false, &@1, NULL));
+					NULL, $1, false, loc_term(&@1), 0));
 	$$ = term;
 }
 |
@@ -809,7 +809,7 @@ PE_NAME '=' PE_VALUE
 	struct parse_events_term *term;
 
 	if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
-					$1, $3, false, &@1, &@3)) {
+					$1, $3, false, loc_term(&@1), loc_val(&@3))) {
 		free($1);
 		YYABORT;
 	}
@@ -833,7 +833,7 @@ PE_NAME
 	struct parse_events_term *term;
 
 	if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
-					$1, 1, true, &@1, NULL)) {
+					$1, 1, true, loc_term(&@1), 0)) {
 		free($1);
 		YYABORT;
 	}
@@ -865,7 +865,8 @@ PE_TERM '=' PE_VALUE
 {
 	struct parse_events_term *term;
 
-	ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3, false, &@1, &@3));
+	ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3, false,
+					loc_term(&@1), loc_val(&@3)));
 	$$ = term;
 }
 |
@@ -873,7 +874,7 @@ PE_TERM
 {
 	struct parse_events_term *term;
 
-	ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1, true, &@1, NULL));
+	ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1, true, loc_term(&@1), 0));
 	$$ = term;
 }
 |
@@ -897,7 +898,7 @@ PE_NAME array '=' PE_VALUE
 	struct parse_events_term *term;
 
 	if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
-					$1, $4, false, &@1, &@4)) {
+					$1, $4, false, loc_term(&@1), loc_val(&@4))) {
 		free($1);
 		free($2.ranges);
 		YYABORT;
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 26/59] libperf: Move in the event_symbols_hw/event_symbols_sw
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (23 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 25/59] perf tools: Add loc_term and loc_val helpers to parse_events_term__num Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 27/59] libperf: Move in struct parse_events_term code Jiri Olsa
                   ` (33 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving event_symbols_hw/event_symbols_sw to libperf.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/Build                          |  1 +
 .../lib/perf/include/internal/parse-events.h  | 12 +++
 tools/lib/perf/parse-events.c                 | 99 +++++++++++++++++++
 tools/perf/util/parse-events.c                | 94 ------------------
 tools/perf/util/parse-events.h                |  6 --
 5 files changed, 112 insertions(+), 100 deletions(-)
 create mode 100644 tools/lib/perf/include/internal/parse-events.h
 create mode 100644 tools/lib/perf/parse-events.c

diff --git a/tools/lib/perf/Build b/tools/lib/perf/Build
index 006a9bef9566..af4663e4421f 100644
--- a/tools/lib/perf/Build
+++ b/tools/lib/perf/Build
@@ -11,6 +11,7 @@ libperf-y += pmu-flex.o
 libperf-y += pmu-bison.o
 libperf-y += pmu.o
 libperf-y += pmu-hybrid.o
+libperf-y += parse-events.o
 
 $(OUTPUT)zalloc.o: ../../lib/zalloc.c FORCE
 	$(call rule_mkdir)
diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
new file mode 100644
index 000000000000..cf7cc117c497
--- /dev/null
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __LIBPERF_PARSE_EVENTS_H
+#define __LIBPERF_PARSE_EVENTS_H
+
+struct event_symbol {
+	const char	*symbol;
+	const char	*alias;
+};
+extern struct event_symbol event_symbols_hw[];
+extern struct event_symbol event_symbols_sw[];
+
+#endif /* __LIBPERF_PARSE_EVENTS_H */
diff --git a/tools/lib/perf/parse-events.c b/tools/lib/perf/parse-events.c
new file mode 100644
index 000000000000..92b552b0a91a
--- /dev/null
+++ b/tools/lib/perf/parse-events.c
@@ -0,0 +1,99 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <internal/parse-events.h>
+#include <linux/perf_event.h>
+
+struct event_symbol event_symbols_hw[PERF_COUNT_HW_MAX] = {
+	[PERF_COUNT_HW_CPU_CYCLES] = {
+		.symbol = "cpu-cycles",
+		.alias  = "cycles",
+	},
+	[PERF_COUNT_HW_INSTRUCTIONS] = {
+		.symbol = "instructions",
+		.alias  = "",
+	},
+	[PERF_COUNT_HW_CACHE_REFERENCES] = {
+		.symbol = "cache-references",
+		.alias  = "",
+	},
+	[PERF_COUNT_HW_CACHE_MISSES] = {
+		.symbol = "cache-misses",
+		.alias  = "",
+	},
+	[PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = {
+		.symbol = "branch-instructions",
+		.alias  = "branches",
+	},
+	[PERF_COUNT_HW_BRANCH_MISSES] = {
+		.symbol = "branch-misses",
+		.alias  = "",
+	},
+	[PERF_COUNT_HW_BUS_CYCLES] = {
+		.symbol = "bus-cycles",
+		.alias  = "",
+	},
+	[PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = {
+		.symbol = "stalled-cycles-frontend",
+		.alias  = "idle-cycles-frontend",
+	},
+	[PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = {
+		.symbol = "stalled-cycles-backend",
+		.alias  = "idle-cycles-backend",
+	},
+	[PERF_COUNT_HW_REF_CPU_CYCLES] = {
+		.symbol = "ref-cycles",
+		.alias  = "",
+	},
+};
+
+struct event_symbol event_symbols_sw[PERF_COUNT_SW_MAX] = {
+	[PERF_COUNT_SW_CPU_CLOCK] = {
+		.symbol = "cpu-clock",
+		.alias  = "",
+	},
+	[PERF_COUNT_SW_TASK_CLOCK] = {
+		.symbol = "task-clock",
+		.alias  = "",
+	},
+	[PERF_COUNT_SW_PAGE_FAULTS] = {
+		.symbol = "page-faults",
+		.alias  = "faults",
+	},
+	[PERF_COUNT_SW_CONTEXT_SWITCHES] = {
+		.symbol = "context-switches",
+		.alias  = "cs",
+	},
+	[PERF_COUNT_SW_CPU_MIGRATIONS] = {
+		.symbol = "cpu-migrations",
+		.alias  = "migrations",
+	},
+	[PERF_COUNT_SW_PAGE_FAULTS_MIN] = {
+		.symbol = "minor-faults",
+		.alias  = "",
+	},
+	[PERF_COUNT_SW_PAGE_FAULTS_MAJ] = {
+		.symbol = "major-faults",
+		.alias  = "",
+	},
+	[PERF_COUNT_SW_ALIGNMENT_FAULTS] = {
+		.symbol = "alignment-faults",
+		.alias  = "",
+	},
+	[PERF_COUNT_SW_EMULATION_FAULTS] = {
+		.symbol = "emulation-faults",
+		.alias  = "",
+	},
+	[PERF_COUNT_SW_DUMMY] = {
+		.symbol = "dummy",
+		.alias  = "",
+	},
+	[PERF_COUNT_SW_BPF_OUTPUT] = {
+		.symbol = "bpf-output",
+		.alias  = "",
+	},
+	[PERF_COUNT_SW_CGROUP_SWITCHES] = {
+		.symbol = "cgroup-switches",
+		.alias  = "",
+	},
+};
+
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index c36657d906ce..1c62b2c31832 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -60,100 +60,6 @@ static struct perf_pmu_event_symbol *perf_pmu_events_list;
  */
 static int perf_pmu_events_list_num;
 
-struct event_symbol event_symbols_hw[PERF_COUNT_HW_MAX] = {
-	[PERF_COUNT_HW_CPU_CYCLES] = {
-		.symbol = "cpu-cycles",
-		.alias  = "cycles",
-	},
-	[PERF_COUNT_HW_INSTRUCTIONS] = {
-		.symbol = "instructions",
-		.alias  = "",
-	},
-	[PERF_COUNT_HW_CACHE_REFERENCES] = {
-		.symbol = "cache-references",
-		.alias  = "",
-	},
-	[PERF_COUNT_HW_CACHE_MISSES] = {
-		.symbol = "cache-misses",
-		.alias  = "",
-	},
-	[PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = {
-		.symbol = "branch-instructions",
-		.alias  = "branches",
-	},
-	[PERF_COUNT_HW_BRANCH_MISSES] = {
-		.symbol = "branch-misses",
-		.alias  = "",
-	},
-	[PERF_COUNT_HW_BUS_CYCLES] = {
-		.symbol = "bus-cycles",
-		.alias  = "",
-	},
-	[PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = {
-		.symbol = "stalled-cycles-frontend",
-		.alias  = "idle-cycles-frontend",
-	},
-	[PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = {
-		.symbol = "stalled-cycles-backend",
-		.alias  = "idle-cycles-backend",
-	},
-	[PERF_COUNT_HW_REF_CPU_CYCLES] = {
-		.symbol = "ref-cycles",
-		.alias  = "",
-	},
-};
-
-struct event_symbol event_symbols_sw[PERF_COUNT_SW_MAX] = {
-	[PERF_COUNT_SW_CPU_CLOCK] = {
-		.symbol = "cpu-clock",
-		.alias  = "",
-	},
-	[PERF_COUNT_SW_TASK_CLOCK] = {
-		.symbol = "task-clock",
-		.alias  = "",
-	},
-	[PERF_COUNT_SW_PAGE_FAULTS] = {
-		.symbol = "page-faults",
-		.alias  = "faults",
-	},
-	[PERF_COUNT_SW_CONTEXT_SWITCHES] = {
-		.symbol = "context-switches",
-		.alias  = "cs",
-	},
-	[PERF_COUNT_SW_CPU_MIGRATIONS] = {
-		.symbol = "cpu-migrations",
-		.alias  = "migrations",
-	},
-	[PERF_COUNT_SW_PAGE_FAULTS_MIN] = {
-		.symbol = "minor-faults",
-		.alias  = "",
-	},
-	[PERF_COUNT_SW_PAGE_FAULTS_MAJ] = {
-		.symbol = "major-faults",
-		.alias  = "",
-	},
-	[PERF_COUNT_SW_ALIGNMENT_FAULTS] = {
-		.symbol = "alignment-faults",
-		.alias  = "",
-	},
-	[PERF_COUNT_SW_EMULATION_FAULTS] = {
-		.symbol = "emulation-faults",
-		.alias  = "",
-	},
-	[PERF_COUNT_SW_DUMMY] = {
-		.symbol = "dummy",
-		.alias  = "",
-	},
-	[PERF_COUNT_SW_BPF_OUTPUT] = {
-		.symbol = "bpf-output",
-		.alias  = "",
-	},
-	[PERF_COUNT_SW_CGROUP_SWITCHES] = {
-		.symbol = "cgroup-switches",
-		.alias  = "",
-	},
-};
-
 static struct parse_events_ops parse_state_ops = {
 	.evsel__new    = evsel__new_idx,
 	.evsel__new_tp = evsel__newtp_idx,
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 29ea37808d32..181bd72ade6b 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -233,12 +233,6 @@ void print_events(const char *event_glob, bool name_only, bool quiet,
 		  bool long_desc, bool details_flag, bool deprecated,
 		  const char *pmu_name);
 
-struct event_symbol {
-	const char	*symbol;
-	const char	*alias;
-};
-extern struct event_symbol event_symbols_hw[];
-extern struct event_symbol event_symbols_sw[];
 void print_symbol_events(const char *event_glob, unsigned type,
 				struct event_symbol *syms, unsigned max,
 				bool name_only);
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 27/59] libperf: Move in struct parse_events_term code
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (24 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 26/59] libperf: Move in the event_symbols_hw/event_symbols_sw Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 28/59] perf tools: Add perf_evsel__add_event function Jiri Olsa
                   ` (32 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving parse_events_term related code to libperf.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 .../lib/perf/include/internal/parse-events.h  |  82 +++++++
 tools/lib/perf/parse-events.c                 | 205 ++++++++++++++++++
 tools/perf/util/parse-events.c                | 201 -----------------
 tools/perf/util/parse-events.h                |  78 +------
 4 files changed, 288 insertions(+), 278 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index cf7cc117c497..46f632efd71b 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -2,11 +2,93 @@
 #ifndef __LIBPERF_PARSE_EVENTS_H
 #define __LIBPERF_PARSE_EVENTS_H
 
+#include <linux/types.h>
+#include <linux/list.h>
+#include <unistd.h>
+
 struct event_symbol {
 	const char	*symbol;
 	const char	*alias;
 };
 extern struct event_symbol event_symbols_hw[];
 extern struct event_symbol event_symbols_sw[];
+extern const char *config_term_names[];
+
+enum {
+	PARSE_EVENTS__TERM_TYPE_NUM,
+	PARSE_EVENTS__TERM_TYPE_STR,
+};
+
+enum {
+	PARSE_EVENTS__TERM_TYPE_USER,
+	PARSE_EVENTS__TERM_TYPE_CONFIG,
+	PARSE_EVENTS__TERM_TYPE_CONFIG1,
+	PARSE_EVENTS__TERM_TYPE_CONFIG2,
+	PARSE_EVENTS__TERM_TYPE_NAME,
+	PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD,
+	PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ,
+	PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE,
+	PARSE_EVENTS__TERM_TYPE_TIME,
+	PARSE_EVENTS__TERM_TYPE_CALLGRAPH,
+	PARSE_EVENTS__TERM_TYPE_STACKSIZE,
+	PARSE_EVENTS__TERM_TYPE_NOINHERIT,
+	PARSE_EVENTS__TERM_TYPE_INHERIT,
+	PARSE_EVENTS__TERM_TYPE_MAX_STACK,
+	PARSE_EVENTS__TERM_TYPE_MAX_EVENTS,
+	PARSE_EVENTS__TERM_TYPE_NOOVERWRITE,
+	PARSE_EVENTS__TERM_TYPE_OVERWRITE,
+	PARSE_EVENTS__TERM_TYPE_DRV_CFG,
+	PARSE_EVENTS__TERM_TYPE_PERCORE,
+	PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT,
+	PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE,
+	PARSE_EVENTS__TERM_TYPE_METRIC_ID,
+	__PARSE_EVENTS__TERM_TYPE_NR,
+};
+
+struct parse_events_array {
+	size_t nr_ranges;
+	struct {
+		unsigned int start;
+		size_t length;
+	} *ranges;
+};
+
+struct parse_events_term {
+	char *config;
+	struct parse_events_array array;
+	union {
+		char *str;
+		u64  num;
+	} val;
+	int type_val;
+	int type_term;
+	struct list_head list;
+	bool used;
+	bool no_value;
+
+	/* error string indexes for within parsed string */
+	int err_term;
+	int err_val;
+
+	/* Coming from implicit alias */
+	bool weak;
+};
 
+int parse_events_term__num(struct parse_events_term **term,
+			   int type_term, char *config, u64 num,
+			   bool novalue,
+			   int loc_term, int loc_val);
+int parse_events_term__str(struct parse_events_term **term,
+			   int type_term, char *config, char *str,
+			   int loc_term, int loc_val);
+int parse_events_term__sym_hw(struct parse_events_term **term,
+			      char *config, unsigned idx);
+int parse_events_term__clone(struct parse_events_term **new,
+			     struct parse_events_term *term);
+int parse_events__is_hardcoded_term(struct parse_events_term *term);
+void parse_events_term__delete(struct parse_events_term *term);
+void parse_events_terms__delete(struct list_head *terms);
+void parse_events_terms__purge(struct list_head *terms);
+int parse_events_copy_term_list(struct list_head *old,
+				 struct list_head **new);
 #endif /* __LIBPERF_PARSE_EVENTS_H */
diff --git a/tools/lib/perf/parse-events.c b/tools/lib/perf/parse-events.c
index 92b552b0a91a..cda7c1e5563e 100644
--- a/tools/lib/perf/parse-events.c
+++ b/tools/lib/perf/parse-events.c
@@ -2,6 +2,11 @@
 
 #include <internal/parse-events.h>
 #include <linux/perf_event.h>
+#include <linux/zalloc.h>
+#include <string.h>
+#include <internal/parse-events.h>
+#include <stdlib.h>
+#include <errno.h>
 
 struct event_symbol event_symbols_hw[PERF_COUNT_HW_MAX] = {
 	[PERF_COUNT_HW_CPU_CYCLES] = {
@@ -97,3 +102,203 @@ struct event_symbol event_symbols_sw[PERF_COUNT_SW_MAX] = {
 	},
 };
 
+/*
+ * Update according to parse-events.l
+ */
+const char *config_term_names[__PARSE_EVENTS__TERM_TYPE_NR] = {
+	[PARSE_EVENTS__TERM_TYPE_USER]			= "<sysfs term>",
+	[PARSE_EVENTS__TERM_TYPE_CONFIG]		= "config",
+	[PARSE_EVENTS__TERM_TYPE_CONFIG1]		= "config1",
+	[PARSE_EVENTS__TERM_TYPE_CONFIG2]		= "config2",
+	[PARSE_EVENTS__TERM_TYPE_NAME]			= "name",
+	[PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD]		= "period",
+	[PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ]		= "freq",
+	[PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE]	= "branch_type",
+	[PARSE_EVENTS__TERM_TYPE_TIME]			= "time",
+	[PARSE_EVENTS__TERM_TYPE_CALLGRAPH]		= "call-graph",
+	[PARSE_EVENTS__TERM_TYPE_STACKSIZE]		= "stack-size",
+	[PARSE_EVENTS__TERM_TYPE_NOINHERIT]		= "no-inherit",
+	[PARSE_EVENTS__TERM_TYPE_INHERIT]		= "inherit",
+	[PARSE_EVENTS__TERM_TYPE_MAX_STACK]		= "max-stack",
+	[PARSE_EVENTS__TERM_TYPE_MAX_EVENTS]		= "nr",
+	[PARSE_EVENTS__TERM_TYPE_OVERWRITE]		= "overwrite",
+	[PARSE_EVENTS__TERM_TYPE_NOOVERWRITE]		= "no-overwrite",
+	[PARSE_EVENTS__TERM_TYPE_DRV_CFG]		= "driver-config",
+	[PARSE_EVENTS__TERM_TYPE_PERCORE]		= "percore",
+	[PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT]		= "aux-output",
+	[PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE]	= "aux-sample-size",
+	[PARSE_EVENTS__TERM_TYPE_METRIC_ID]		= "metric-id",
+};
+
+static int new_term(struct parse_events_term **_term,
+		    struct parse_events_term *temp,
+		    char *str, u64 num)
+{
+	struct parse_events_term *term;
+
+	term = malloc(sizeof(*term));
+	if (!term)
+		return -ENOMEM;
+
+	*term = *temp;
+	INIT_LIST_HEAD(&term->list);
+	term->weak = false;
+
+	switch (term->type_val) {
+	case PARSE_EVENTS__TERM_TYPE_NUM:
+		term->val.num = num;
+		break;
+	case PARSE_EVENTS__TERM_TYPE_STR:
+		term->val.str = str;
+		break;
+	default:
+		free(term);
+		return -EINVAL;
+	}
+
+	*_term = term;
+	return 0;
+}
+
+int parse_events_term__num(struct parse_events_term **term,
+			   int type_term, char *config, u64 num,
+			   bool no_value,
+			   int loc_term, int loc_val)
+{
+	struct parse_events_term temp = {
+		.type_val  = PARSE_EVENTS__TERM_TYPE_NUM,
+		.type_term = type_term,
+		.config    = config ? : strdup(config_term_names[type_term]),
+		.no_value  = no_value,
+		.err_term  = loc_term,
+		.err_val   = loc_val,
+	};
+
+	return new_term(term, &temp, NULL, num);
+}
+
+int parse_events_term__str(struct parse_events_term **term,
+			   int type_term, char *config, char *str,
+			   int loc_term, int loc_val)
+{
+	struct parse_events_term temp = {
+		.type_val  = PARSE_EVENTS__TERM_TYPE_STR,
+		.type_term = type_term,
+		.config    = config,
+		.err_term  = loc_term,
+		.err_val   = loc_val,
+	};
+
+	return new_term(term, &temp, str, 0);
+}
+
+int parse_events_term__sym_hw(struct parse_events_term **term,
+			      char *config, unsigned idx)
+{
+	struct event_symbol *sym;
+	char *str;
+	struct parse_events_term temp = {
+		.type_val  = PARSE_EVENTS__TERM_TYPE_STR,
+		.type_term = PARSE_EVENTS__TERM_TYPE_USER,
+		.config    = config,
+	};
+
+	if (!temp.config) {
+		temp.config = strdup("event");
+		if (!temp.config)
+			return -ENOMEM;
+	}
+	BUG_ON(idx >= PERF_COUNT_HW_MAX);
+	sym = &event_symbols_hw[idx];
+
+	str = strdup(sym->symbol);
+	if (!str)
+		return -ENOMEM;
+	return new_term(term, &temp, str, 0);
+}
+
+int parse_events_term__clone(struct parse_events_term **new,
+			     struct parse_events_term *term)
+{
+	char *str;
+	struct parse_events_term temp = {
+		.type_val  = term->type_val,
+		.type_term = term->type_term,
+		.config    = NULL,
+		.err_term  = term->err_term,
+		.err_val   = term->err_val,
+	};
+
+	if (term->config) {
+		temp.config = strdup(term->config);
+		if (!temp.config)
+			return -ENOMEM;
+	}
+	if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM)
+		return new_term(new, &temp, NULL, term->val.num);
+
+	str = strdup(term->val.str);
+	if (!str)
+		return -ENOMEM;
+	return new_term(new, &temp, str, 0);
+}
+
+int parse_events__is_hardcoded_term(struct parse_events_term *term)
+{
+	return term->type_term != PARSE_EVENTS__TERM_TYPE_USER;
+}
+
+void parse_events_term__delete(struct parse_events_term *term)
+{
+	if (term->array.nr_ranges)
+		zfree(&term->array.ranges);
+
+	if (term->type_val != PARSE_EVENTS__TERM_TYPE_NUM)
+		zfree(&term->val.str);
+
+	zfree(&term->config);
+	free(term);
+}
+
+int parse_events_copy_term_list(struct list_head *old,
+				 struct list_head **new)
+{
+	struct parse_events_term *term, *n;
+	int ret;
+
+	if (!old) {
+		*new = NULL;
+		return 0;
+	}
+
+	*new = malloc(sizeof(struct list_head));
+	if (!*new)
+		return -ENOMEM;
+	INIT_LIST_HEAD(*new);
+
+	list_for_each_entry (term, old, list) {
+		ret = parse_events_term__clone(&n, term);
+		if (ret)
+			return ret;
+		list_add_tail(&n->list, *new);
+	}
+	return 0;
+}
+
+void parse_events_terms__purge(struct list_head *terms)
+{
+	struct parse_events_term *term, *h;
+
+	list_for_each_entry_safe(term, h, terms, list) {
+		list_del_init(&term->list);
+		parse_events_term__delete(term);
+	}
+}
+
+void parse_events_terms__delete(struct list_head *terms)
+{
+	if (!terms)
+		return;
+	parse_events_terms__purge(terms);
+	free(terms);
+}
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 1c62b2c31832..d98e8c4388ac 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -973,34 +973,6 @@ static int check_type_val(struct parse_events_term *term,
 	return -EINVAL;
 }
 
-/*
- * Update according to parse-events.l
- */
-static const char *config_term_names[__PARSE_EVENTS__TERM_TYPE_NR] = {
-	[PARSE_EVENTS__TERM_TYPE_USER]			= "<sysfs term>",
-	[PARSE_EVENTS__TERM_TYPE_CONFIG]		= "config",
-	[PARSE_EVENTS__TERM_TYPE_CONFIG1]		= "config1",
-	[PARSE_EVENTS__TERM_TYPE_CONFIG2]		= "config2",
-	[PARSE_EVENTS__TERM_TYPE_NAME]			= "name",
-	[PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD]		= "period",
-	[PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ]		= "freq",
-	[PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE]	= "branch_type",
-	[PARSE_EVENTS__TERM_TYPE_TIME]			= "time",
-	[PARSE_EVENTS__TERM_TYPE_CALLGRAPH]		= "call-graph",
-	[PARSE_EVENTS__TERM_TYPE_STACKSIZE]		= "stack-size",
-	[PARSE_EVENTS__TERM_TYPE_NOINHERIT]		= "no-inherit",
-	[PARSE_EVENTS__TERM_TYPE_INHERIT]		= "inherit",
-	[PARSE_EVENTS__TERM_TYPE_MAX_STACK]		= "max-stack",
-	[PARSE_EVENTS__TERM_TYPE_MAX_EVENTS]		= "nr",
-	[PARSE_EVENTS__TERM_TYPE_OVERWRITE]		= "overwrite",
-	[PARSE_EVENTS__TERM_TYPE_NOOVERWRITE]		= "no-overwrite",
-	[PARSE_EVENTS__TERM_TYPE_DRV_CFG]		= "driver-config",
-	[PARSE_EVENTS__TERM_TYPE_PERCORE]		= "percore",
-	[PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT]		= "aux-output",
-	[PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE]	= "aux-sample-size",
-	[PARSE_EVENTS__TERM_TYPE_METRIC_ID]		= "metric-id",
-};
-
 static bool config_term_shrinked;
 
 static bool
@@ -3059,179 +3031,6 @@ void print_events(const char *event_glob, bool name_only, bool quiet_flag,
 	print_libpfm_events(name_only, long_desc);
 }
 
-int parse_events__is_hardcoded_term(struct parse_events_term *term)
-{
-	return term->type_term != PARSE_EVENTS__TERM_TYPE_USER;
-}
-
-static int new_term(struct parse_events_term **_term,
-		    struct parse_events_term *temp,
-		    char *str, u64 num)
-{
-	struct parse_events_term *term;
-
-	term = malloc(sizeof(*term));
-	if (!term)
-		return -ENOMEM;
-
-	*term = *temp;
-	INIT_LIST_HEAD(&term->list);
-	term->weak = false;
-
-	switch (term->type_val) {
-	case PARSE_EVENTS__TERM_TYPE_NUM:
-		term->val.num = num;
-		break;
-	case PARSE_EVENTS__TERM_TYPE_STR:
-		term->val.str = str;
-		break;
-	default:
-		free(term);
-		return -EINVAL;
-	}
-
-	*_term = term;
-	return 0;
-}
-
-int parse_events_term__num(struct parse_events_term **term,
-			   int type_term, char *config, u64 num,
-			   bool no_value,
-			   int loc_term, int loc_val)
-{
-	struct parse_events_term temp = {
-		.type_val  = PARSE_EVENTS__TERM_TYPE_NUM,
-		.type_term = type_term,
-		.config    = config ? : strdup(config_term_names[type_term]),
-		.no_value  = no_value,
-		.err_term  = loc_term,
-		.err_val   = loc_val,
-	};
-
-	return new_term(term, &temp, NULL, num);
-}
-
-int parse_events_term__str(struct parse_events_term **term,
-			   int type_term, char *config, char *str,
-			   int loc_term, int loc_val)
-{
-	struct parse_events_term temp = {
-		.type_val  = PARSE_EVENTS__TERM_TYPE_STR,
-		.type_term = type_term,
-		.config    = config,
-		.err_term  = loc_term,
-		.err_val   = loc_val,
-	};
-
-	return new_term(term, &temp, str, 0);
-}
-
-int parse_events_term__sym_hw(struct parse_events_term **term,
-			      char *config, unsigned idx)
-{
-	struct event_symbol *sym;
-	char *str;
-	struct parse_events_term temp = {
-		.type_val  = PARSE_EVENTS__TERM_TYPE_STR,
-		.type_term = PARSE_EVENTS__TERM_TYPE_USER,
-		.config    = config,
-	};
-
-	if (!temp.config) {
-		temp.config = strdup("event");
-		if (!temp.config)
-			return -ENOMEM;
-	}
-	BUG_ON(idx >= PERF_COUNT_HW_MAX);
-	sym = &event_symbols_hw[idx];
-
-	str = strdup(sym->symbol);
-	if (!str)
-		return -ENOMEM;
-	return new_term(term, &temp, str, 0);
-}
-
-int parse_events_term__clone(struct parse_events_term **new,
-			     struct parse_events_term *term)
-{
-	char *str;
-	struct parse_events_term temp = {
-		.type_val  = term->type_val,
-		.type_term = term->type_term,
-		.config    = NULL,
-		.err_term  = term->err_term,
-		.err_val   = term->err_val,
-	};
-
-	if (term->config) {
-		temp.config = strdup(term->config);
-		if (!temp.config)
-			return -ENOMEM;
-	}
-	if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM)
-		return new_term(new, &temp, NULL, term->val.num);
-
-	str = strdup(term->val.str);
-	if (!str)
-		return -ENOMEM;
-	return new_term(new, &temp, str, 0);
-}
-
-void parse_events_term__delete(struct parse_events_term *term)
-{
-	if (term->array.nr_ranges)
-		zfree(&term->array.ranges);
-
-	if (term->type_val != PARSE_EVENTS__TERM_TYPE_NUM)
-		zfree(&term->val.str);
-
-	zfree(&term->config);
-	free(term);
-}
-
-int parse_events_copy_term_list(struct list_head *old,
-				 struct list_head **new)
-{
-	struct parse_events_term *term, *n;
-	int ret;
-
-	if (!old) {
-		*new = NULL;
-		return 0;
-	}
-
-	*new = malloc(sizeof(struct list_head));
-	if (!*new)
-		return -ENOMEM;
-	INIT_LIST_HEAD(*new);
-
-	list_for_each_entry (term, old, list) {
-		ret = parse_events_term__clone(&n, term);
-		if (ret)
-			return ret;
-		list_add_tail(&n->list, *new);
-	}
-	return 0;
-}
-
-void parse_events_terms__purge(struct list_head *terms)
-{
-	struct parse_events_term *term, *h;
-
-	list_for_each_entry_safe(term, h, terms, list) {
-		list_del_init(&term->list);
-		parse_events_term__delete(term);
-	}
-}
-
-void parse_events_terms__delete(struct list_head *terms)
-{
-	if (!terms)
-		return;
-	parse_events_terms__purge(terms);
-	free(terms);
-}
-
 void parse_events__clear_array(struct parse_events_array *a)
 {
 	zfree(&a->ranges);
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 181bd72ade6b..5e30977bdb07 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -10,6 +10,7 @@
 #include <linux/types.h>
 #include <linux/perf_event.h>
 #include <string.h>
+#include <internal/parse-events.h>
 
 struct list_head;
 struct evsel;
@@ -60,66 +61,6 @@ struct perf_pmu_event_symbol {
 	enum perf_pmu_event_symbol_type	type;
 };
 
-enum {
-	PARSE_EVENTS__TERM_TYPE_NUM,
-	PARSE_EVENTS__TERM_TYPE_STR,
-};
-
-enum {
-	PARSE_EVENTS__TERM_TYPE_USER,
-	PARSE_EVENTS__TERM_TYPE_CONFIG,
-	PARSE_EVENTS__TERM_TYPE_CONFIG1,
-	PARSE_EVENTS__TERM_TYPE_CONFIG2,
-	PARSE_EVENTS__TERM_TYPE_NAME,
-	PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD,
-	PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ,
-	PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE,
-	PARSE_EVENTS__TERM_TYPE_TIME,
-	PARSE_EVENTS__TERM_TYPE_CALLGRAPH,
-	PARSE_EVENTS__TERM_TYPE_STACKSIZE,
-	PARSE_EVENTS__TERM_TYPE_NOINHERIT,
-	PARSE_EVENTS__TERM_TYPE_INHERIT,
-	PARSE_EVENTS__TERM_TYPE_MAX_STACK,
-	PARSE_EVENTS__TERM_TYPE_MAX_EVENTS,
-	PARSE_EVENTS__TERM_TYPE_NOOVERWRITE,
-	PARSE_EVENTS__TERM_TYPE_OVERWRITE,
-	PARSE_EVENTS__TERM_TYPE_DRV_CFG,
-	PARSE_EVENTS__TERM_TYPE_PERCORE,
-	PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT,
-	PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE,
-	PARSE_EVENTS__TERM_TYPE_METRIC_ID,
-	__PARSE_EVENTS__TERM_TYPE_NR,
-};
-
-struct parse_events_array {
-	size_t nr_ranges;
-	struct {
-		unsigned int start;
-		size_t length;
-	} *ranges;
-};
-
-struct parse_events_term {
-	char *config;
-	struct parse_events_array array;
-	union {
-		char *str;
-		u64  num;
-	} val;
-	int type_val;
-	int type_term;
-	struct list_head list;
-	bool used;
-	bool no_value;
-
-	/* error string indexes for within parsed string */
-	int err_term;
-	int err_val;
-
-	/* Coming from implicit alias */
-	bool weak;
-};
-
 struct parse_events_error {
 	int   num_errors;       /* number of errors encountered */
 	int   idx;	/* index in the parsed string */
@@ -151,21 +92,6 @@ struct parse_events_state {
 void parse_events__handle_error(struct parse_events_error *err, int idx,
 				char *str, char *help);
 void parse_events__shrink_config_terms(void);
-int parse_events__is_hardcoded_term(struct parse_events_term *term);
-int parse_events_term__num(struct parse_events_term **term,
-			   int type_term, char *config, u64 num,
-			   bool novalue,
-			   int loc_term, int loc_val);
-int parse_events_term__str(struct parse_events_term **term,
-			   int type_term, char *config, char *str,
-			   int loc_term, int loc_val);
-int parse_events_term__sym_hw(struct parse_events_term **term,
-			      char *config, unsigned idx);
-int parse_events_term__clone(struct parse_events_term **new,
-			     struct parse_events_term *term);
-void parse_events_term__delete(struct parse_events_term *term);
-void parse_events_terms__delete(struct list_head *terms);
-void parse_events_terms__purge(struct list_head *terms);
 void parse_events__clear_array(struct parse_events_array *a);
 int parse_events__modifier_event(struct list_head *list, char *str, bool add);
 int parse_events__modifier_group(struct list_head *list, char *event_mod);
@@ -217,8 +143,6 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
 			       struct list_head *head_config,
 			       struct list_head **listp);
 
-int parse_events_copy_term_list(struct list_head *old,
-				 struct list_head **new);
 
 enum perf_pmu_event_symbol_type
 perf_pmu__parse_check(const char *name);
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 28/59] perf tools: Add perf_evsel__add_event function
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (25 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 27/59] libperf: Move in struct parse_events_term code Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 29/59] perf tools: Change struct parse_events_state::evlist to perf_evlist Jiri Olsa
                   ` (31 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Adding perf_evsel__add_event function as a replacement
for __add_event and prepare it for moving to libperf.

That includes changing current parse_state_ops callbacks
to work over perf_evsel instead of evsel.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/parse-events.c | 121 +++++++++++++++++++++------------
 tools/perf/util/parse-events.h |   4 +-
 2 files changed, 78 insertions(+), 47 deletions(-)

diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index d98e8c4388ac..f41dd97f1623 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -60,9 +60,23 @@ static struct perf_pmu_event_symbol *perf_pmu_events_list;
  */
 static int perf_pmu_events_list_num;
 
+static struct perf_evsel *perf_evsel__new_idx(struct perf_event_attr *attr, int idx)
+{
+	struct evsel *evsel = evsel__new_idx(attr, idx);
+
+	return evsel ? &evsel->core : NULL;
+}
+
+static struct perf_evsel *perf_evsel__newtp_idx(const char *sys, const char *name, int idx)
+{
+	struct evsel *evsel = evsel__newtp_idx(sys, name, idx);
+
+	return IS_ERR(evsel) ? (void*) evsel : &evsel->core;
+}
+
 static struct parse_events_ops parse_state_ops = {
-	.evsel__new    = evsel__new_idx,
-	.evsel__new_tp = evsel__newtp_idx,
+	.perf_evsel__new    = perf_evsel__new_idx,
+	.perf_evsel__new_tp = perf_evsel__newtp_idx,
 };
 
 #define __PERF_EVENT_FIELD(config, name) \
@@ -267,16 +281,16 @@ static char *get_config_name(struct list_head *head_terms)
 	return get_config_str(head_terms, PARSE_EVENTS__TERM_TYPE_NAME);
 }
 
-static struct evsel *
-__add_event(struct parse_events_state *parse_state,
-	    struct list_head *list,
-	    struct perf_event_attr *attr,
-	    bool init_attr,
-	    const char *name, const char *metric_id, struct perf_pmu *pmu,
-	    struct list_head *config_terms, bool auto_merge_stats,
-	    const char *cpu_list)
+static struct perf_evsel *
+perf_evsel__add_event(struct parse_events_state *parse_state,
+		      struct list_head *list,
+		      struct perf_event_attr *attr,
+		      bool init_attr,
+		      const char *name, const char *metric_id, struct perf_pmu *pmu,
+		      struct list_head *config_terms, bool auto_merge_stats,
+		      const char *cpu_list)
 {
-	struct evsel *evsel;
+	struct perf_evsel *evsel;
 	struct perf_cpu_map *cpus = pmu ? perf_cpu_map__get(pmu->cpus) :
 			       cpu_list ? perf_cpu_map__new(cpu_list) : NULL;
 	int *idx = &parse_state->idx;
@@ -287,41 +301,58 @@ __add_event(struct parse_events_state *parse_state,
 	if (init_attr)
 		event_attr_init(attr);
 
-	evsel = parse_state->ops->evsel__new(attr, *idx);
+	evsel = parse_state->ops->perf_evsel__new(attr, *idx);
 	if (!evsel) {
 		perf_cpu_map__put(cpus);
 		return NULL;
 	}
 
 	(*idx)++;
-	evsel->core.cpus = cpus;
-	evsel->core.own_cpus = perf_cpu_map__get(cpus);
-	evsel->core.system_wide = pmu ? pmu->is_uncore : false;
-	evsel->core.auto_merge_stats = auto_merge_stats;
+	evsel->cpus = cpus;
+	evsel->own_cpus = perf_cpu_map__get(cpus);
+	evsel->system_wide = pmu ? pmu->is_uncore : false;
+	evsel->auto_merge_stats = auto_merge_stats;
 
 	if (name)
-		evsel->core.name = strdup(name);
+		evsel->name = strdup(name);
 
 	if (metric_id)
-		evsel->core.metric_id = strdup(metric_id);
+		evsel->metric_id = strdup(metric_id);
 
 	if (config_terms)
-		list_splice_init(config_terms, &evsel->core.config_terms);
+		list_splice_init(config_terms, &evsel->config_terms);
 
 	if (list)
-		list_add_tail(&evsel->core.node, list);
+		list_add_tail(&evsel->node, list);
 
 	return evsel;
 }
 
+static struct evsel *
+evsel__add_event(struct parse_events_state *parse_state,
+		 struct list_head *list,
+		 struct perf_event_attr *attr,
+		 bool init_attr,
+		 const char *name, const char *metric_id, struct perf_pmu *pmu,
+		 struct list_head *config_terms, bool auto_merge_stats,
+		 const char *cpu_list)
+{
+	struct perf_evsel *evsel;
+
+	evsel = perf_evsel__add_event(parse_state, list, attr, init_attr,
+				      name, metric_id, pmu, config_terms,
+				      auto_merge_stats, cpu_list);
+	return container_of(evsel, struct evsel, core);
+}
+
 struct evsel *parse_events__add_event(struct parse_events_state *parse_state,
 				      struct perf_event_attr *attr,
 				      const char *name, const char *metric_id,
 				      struct perf_pmu *pmu)
 {
-	return __add_event(parse_state, /*list=*/NULL, attr, /*init_attr=*/false, name,
-			   metric_id, pmu, /*config_terms=*/NULL,
-			   /*auto_merge_stats=*/false, /*cpu_list=*/NULL);
+	return evsel__add_event(parse_state, /*list=*/NULL, attr, /*init_attr=*/false, name,
+				metric_id, pmu, /*config_terms=*/NULL,
+				/*auto_merge_stats=*/false, /*cpu_list=*/NULL);
 }
 
 static int add_event(struct parse_events_state *parse_state,
@@ -329,9 +360,9 @@ static int add_event(struct parse_events_state *parse_state,
 		     struct perf_event_attr *attr, const char *name,
 		     const char *metric_id, struct list_head *config_terms)
 {
-	return __add_event(parse_state, list, attr, /*init_attr*/true, name, metric_id,
-			   /*pmu=*/NULL, config_terms,
-			   /*auto_merge_stats=*/false, /*cpu_list=*/NULL) ? 0 : -ENOMEM;
+	return evsel__add_event(parse_state, list, attr, /*init_attr*/true, name, metric_id,
+				/*pmu=*/NULL, config_terms,
+				/*auto_merge_stats=*/false, /*cpu_list=*/NULL) ? 0 : -ENOMEM;
 }
 
 static int add_event_tool(struct parse_events_state *parse_state,
@@ -344,10 +375,10 @@ static int add_event_tool(struct parse_events_state *parse_state,
 		.config = PERF_COUNT_SW_DUMMY,
 	};
 
-	evsel = __add_event(parse_state, list, &attr, /*init_attr=*/true, /*name=*/NULL,
-			    /*metric_id=*/NULL, /*pmu=*/NULL,
-			    /*config_terms=*/NULL, /*auto_merge_stats=*/false,
-			    /*cpu_list=*/"0");
+	evsel = evsel__add_event(parse_state, list, &attr, /*init_attr=*/true, /*name=*/NULL,
+				 /*metric_id=*/NULL, /*pmu=*/NULL,
+				 /*config_terms=*/NULL, /*auto_merge_stats=*/false,
+				 /*cpu_list=*/"0");
 	if (!evsel)
 		return -ENOMEM;
 	evsel->core.tool_event = tool_event;
@@ -513,7 +544,7 @@ static int add_tracepoint(struct parse_events_state *parse_state,
 			  struct list_head *head_config)
 {
 	int *idx = &parse_state->idx;
-	struct evsel *evsel = parse_state->ops->evsel__new_tp(sys_name, evt_name, (*idx)++);
+	struct perf_evsel *evsel = parse_state->ops->perf_evsel__new_tp(sys_name, evt_name, (*idx)++);
 
 	if (IS_ERR(evsel)) {
 		tracepoint_error(err, PTR_ERR(evsel), sys_name, evt_name);
@@ -525,10 +556,10 @@ static int add_tracepoint(struct parse_events_state *parse_state,
 
 		if (get_config_terms(head_config, &config_terms))
 			return -ENOMEM;
-		list_splice(&config_terms, &evsel->core.config_terms);
+		list_splice(&config_terms, &evsel->config_terms);
 	}
 
-	list_add_tail(&evsel->core.node, list);
+	list_add_tail(&evsel->node, list);
 	return 0;
 }
 
@@ -1484,11 +1515,11 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
 
 	if (!head_config) {
 		attr.type = pmu->type;
-		evsel = __add_event(parse_state, list, &attr,
-				    /*init_attr=*/true, /*name=*/NULL,
-				    /*metric_id=*/NULL, pmu,
-				    /*config_terms=*/NULL, auto_merge_stats,
-				    /*cpu_list=*/NULL);
+		evsel = evsel__add_event(parse_state, list, &attr,
+					 /*init_attr=*/true, /*name=*/NULL,
+					 /*metric_id=*/NULL, pmu,
+					 /*config_terms=*/NULL, auto_merge_stats,
+					 /*cpu_list=*/NULL);
 		if (evsel) {
 			evsel->pmu_name = name ? strdup(name) : NULL;
 			evsel->use_uncore_alias = use_uncore_alias;
@@ -1541,10 +1572,10 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
 		return -EINVAL;
 	}
 
-	evsel = __add_event(parse_state, list, &attr, /*init_attr=*/true,
-			    get_config_name(head_config),
-			    get_config_metric_id(head_config), pmu,
-			    &config_terms, auto_merge_stats, /*cpu_list=*/NULL);
+	evsel = evsel__add_event(parse_state, list, &attr, /*init_attr=*/true,
+				 get_config_name(head_config),
+				 get_config_metric_id(head_config), pmu,
+				 &config_terms, auto_merge_stats, /*cpu_list=*/NULL);
 	if (!evsel)
 		return -ENOMEM;
 
@@ -3107,7 +3138,7 @@ struct evsel *parse_events__add_event_hybrid(struct parse_events_state *parse_st
 					     struct perf_pmu *pmu,
 					     struct list_head *config_terms)
 {
-	return __add_event(parse_state, list, attr, /*init_attr=*/true, name, metric_id,
-			   pmu, config_terms, /*auto_merge_stats=*/false,
-			   /*cpu_list=*/NULL);
+	return evsel__add_event(parse_state, list, attr, /*init_attr=*/true, name, metric_id,
+				pmu, config_terms, /*auto_merge_stats=*/false,
+				/*cpu_list=*/NULL);
 }
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 5e30977bdb07..34ee456629b0 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -72,8 +72,8 @@ struct parse_events_error {
 };
 
 struct parse_events_ops {
-	struct evsel* (*evsel__new)(struct perf_event_attr *attr, int idx);
-	struct evsel* (*evsel__new_tp)(const char *sys, const char *name, int idx);
+	struct perf_evsel* (*perf_evsel__new)(struct perf_event_attr *attr, int idx);
+	struct perf_evsel* (*perf_evsel__new_tp)(const char *sys, const char *name, int idx);
 };
 
 struct parse_events_state {
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 29/59] perf tools: Change struct parse_events_state::evlist to perf_evlist
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (26 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 28/59] perf tools: Add perf_evsel__add_event function Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 30/59] libperf: Move in struct parse_events_state Jiri Olsa
                   ` (30 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Changing struct parse_events_state::evlist to perf_evlist
to prepare it for moving to libperf.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/parse-events.c | 8 +++++---
 tools/perf/util/parse-events.h | 2 +-
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index f41dd97f1623..7e4bc4c1190e 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -774,6 +774,7 @@ parse_events_config_bpf(struct parse_events_state *parse_state,
 			struct list_head *head_config)
 {
 	struct parse_events_term *term;
+	struct evlist *evlist;
 	int error_pos;
 
 	if (!head_config || list_empty(head_config))
@@ -789,12 +790,13 @@ parse_events_config_bpf(struct parse_events_state *parse_state,
 			return -EINVAL;
 		}
 
-		err = bpf__config_obj(obj, term, parse_state->evlist, &error_pos);
+		evlist = container_of(parse_state->evlist, struct evlist, core);
+		err = bpf__config_obj(obj, term, evlist, &error_pos);
 		if (err) {
 			char errbuf[BUFSIZ];
 			int idx;
 
-			bpf__strerror_config_obj(obj, term, parse_state->evlist,
+			bpf__strerror_config_obj(obj, term, evlist,
 						 &error_pos, err, errbuf,
 						 sizeof(errbuf));
 
@@ -2224,7 +2226,7 @@ int __parse_events(struct evlist *evlist, const char *str,
 		.list	  = LIST_HEAD_INIT(parse_state.list),
 		.idx	  = evlist->core.nr_entries,
 		.error	  = err,
-		.evlist	  = evlist,
+		.evlist	  = &evlist->core,
 		.stoken	  = PE_START_EVENTS,
 		.fake_pmu = fake_pmu,
 		.ops	  = &parse_state_ops,
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 34ee456629b0..2f75e823124f 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -81,7 +81,7 @@ struct parse_events_state {
 	int			   idx;
 	int			   nr_groups;
 	struct parse_events_error *error;
-	struct evlist		  *evlist;
+	struct perf_evlist	  *evlist;
 	struct list_head	  *terms;
 	int			   stoken;
 	struct perf_pmu		  *fake_pmu;
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 30/59] libperf: Move in struct parse_events_state
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (27 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 29/59] perf tools: Change struct parse_events_state::evlist to perf_evlist Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 18:21   ` Ian Rogers
  2021-11-08 13:36 ` [PATCH 31/59] perf tools: Move event_attr_init in evsel__new_idx function Jiri Olsa
                   ` (29 subsequent siblings)
  58 siblings, 1 reply; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving in struct parse_events_state to libperf
together with related structs.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 .../lib/perf/include/internal/parse-events.h  | 29 +++++++++++++++++++
 tools/perf/util/parse-events.h                | 28 ------------------
 2 files changed, 29 insertions(+), 28 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index 46f632efd71b..aff13afa08e1 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -5,6 +5,7 @@
 #include <linux/types.h>
 #include <linux/list.h>
 #include <unistd.h>
+#include <linux/perf_event.h>
 
 struct event_symbol {
 	const char	*symbol;
@@ -74,6 +75,34 @@ struct parse_events_term {
 	bool weak;
 };
 
+struct parse_events_error {
+	int   num_errors;       /* number of errors encountered */
+	int   idx;	/* index in the parsed string */
+	char *str;      /* string to display at the index */
+	char *help;	/* optional help string */
+	int   first_idx;/* as above, but for the first encountered error */
+	char *first_str;
+	char *first_help;
+};
+
+struct parse_events_ops {
+	struct perf_evsel* (*perf_evsel__new)(struct perf_event_attr *attr, int idx);
+	struct perf_evsel* (*perf_evsel__new_tp)(const char *sys, const char *name, int idx);
+};
+
+struct parse_events_state {
+	struct list_head	   list;
+	int			   idx;
+	int			   nr_groups;
+	struct parse_events_error *error;
+	struct perf_evlist	  *evlist;
+	struct list_head	  *terms;
+	int			   stoken;
+	struct perf_pmu		  *fake_pmu;
+	char			  *hybrid_pmu_name;
+	struct parse_events_ops	  *ops;
+};
+
 int parse_events_term__num(struct parse_events_term **term,
 			   int type_term, char *config, u64 num,
 			   bool novalue,
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 2f75e823124f..057b92778d17 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -61,34 +61,6 @@ struct perf_pmu_event_symbol {
 	enum perf_pmu_event_symbol_type	type;
 };
 
-struct parse_events_error {
-	int   num_errors;       /* number of errors encountered */
-	int   idx;	/* index in the parsed string */
-	char *str;      /* string to display at the index */
-	char *help;	/* optional help string */
-	int   first_idx;/* as above, but for the first encountered error */
-	char *first_str;
-	char *first_help;
-};
-
-struct parse_events_ops {
-	struct perf_evsel* (*perf_evsel__new)(struct perf_event_attr *attr, int idx);
-	struct perf_evsel* (*perf_evsel__new_tp)(const char *sys, const char *name, int idx);
-};
-
-struct parse_events_state {
-	struct list_head	   list;
-	int			   idx;
-	int			   nr_groups;
-	struct parse_events_error *error;
-	struct perf_evlist	  *evlist;
-	struct list_head	  *terms;
-	int			   stoken;
-	struct perf_pmu		  *fake_pmu;
-	char			  *hybrid_pmu_name;
-	struct parse_events_ops	  *ops;
-};
-
 void parse_events__handle_error(struct parse_events_error *err, int idx,
 				char *str, char *help);
 void parse_events__shrink_config_terms(void);
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 31/59] perf tools: Move event_attr_init in evsel__new_idx function
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (28 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 30/59] libperf: Move in struct parse_events_state Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 32/59] libperf: Move in perf_pmu__warn_invalid_config function Jiri Olsa
                   ` (28 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving event_attr_init in evsel__new_idx function so we can
move perf_evsel__add_event into libperf later.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/parse-events.h | 2 +-
 tools/perf/util/evlist.c                       | 4 ++--
 tools/perf/util/evsel.c                        | 5 ++++-
 tools/perf/util/evsel.h                        | 4 ++--
 tools/perf/util/parse-events.c                 | 9 +++------
 tools/perf/util/sideband_evlist.c              | 2 +-
 6 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index aff13afa08e1..b314c8639c78 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -86,7 +86,7 @@ struct parse_events_error {
 };
 
 struct parse_events_ops {
-	struct perf_evsel* (*perf_evsel__new)(struct perf_event_attr *attr, int idx);
+	struct perf_evsel* (*perf_evsel__new)(struct perf_event_attr *attr, int idx, bool init_attr);
 	struct perf_evsel* (*perf_evsel__new_tp)(const char *sys, const char *name, int idx);
 };
 
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index 8a2da1365666..89146f4aa00d 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -249,7 +249,7 @@ int evlist__add_dummy(struct evlist *evlist)
 		.config = PERF_COUNT_SW_DUMMY,
 		.size	= sizeof(attr), /* to capture ABI version */
 	};
-	struct evsel *evsel = evsel__new_idx(&attr, evlist->core.nr_entries);
+	struct evsel *evsel = evsel__new_idx(&attr, evlist->core.nr_entries, false);
 
 	if (evsel == NULL)
 		return -ENOMEM;
@@ -265,7 +265,7 @@ static int evlist__add_attrs(struct evlist *evlist, struct perf_event_attr *attr
 	size_t i;
 
 	for (i = 0; i < nr_attrs; i++) {
-		evsel = evsel__new_idx(attrs + i, evlist->core.nr_entries + i);
+		evsel = evsel__new_idx(attrs + i, evlist->core.nr_entries + i, false);
 		if (evsel == NULL)
 			goto out_delete_partial_list;
 		list_add_tail(&evsel->core.node, &head);
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 7621eddc8e58..fec92fc8c97a 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -261,12 +261,15 @@ void evsel__init(struct evsel *evsel,
 	evsel->pmu_name      = NULL;
 }
 
-struct evsel *evsel__new_idx(struct perf_event_attr *attr, int idx)
+struct evsel *evsel__new_idx(struct perf_event_attr *attr, int idx, bool init_attr)
 {
 	struct evsel *evsel = zalloc(perf_evsel__object.size);
 
 	if (!evsel)
 		return NULL;
+	if (init_attr)
+		event_attr_init(attr);
+
 	evsel__init(evsel, attr, idx);
 
 	if (evsel__is_bpf_output(evsel)) {
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index e06d171baba3..203abab2c48d 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -187,11 +187,11 @@ int evsel__object_config(size_t object_size,
 struct perf_pmu *evsel__find_pmu(struct evsel *evsel);
 bool evsel__is_aux_event(struct evsel *evsel);
 
-struct evsel *evsel__new_idx(struct perf_event_attr *attr, int idx);
+struct evsel *evsel__new_idx(struct perf_event_attr *attr, int idx, bool init_attr);
 
 static inline struct evsel *evsel__new(struct perf_event_attr *attr)
 {
-	return evsel__new_idx(attr, 0);
+	return evsel__new_idx(attr, 0, false);
 }
 
 struct evsel *evsel__clone(struct evsel *orig);
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 7e4bc4c1190e..c971291f2ec7 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -60,9 +60,9 @@ static struct perf_pmu_event_symbol *perf_pmu_events_list;
  */
 static int perf_pmu_events_list_num;
 
-static struct perf_evsel *perf_evsel__new_idx(struct perf_event_attr *attr, int idx)
+static struct perf_evsel *perf_evsel__new_idx(struct perf_event_attr *attr, int idx, bool init_attr)
 {
-	struct evsel *evsel = evsel__new_idx(attr, idx);
+	struct evsel *evsel = evsel__new_idx(attr, idx, init_attr);
 
 	return evsel ? &evsel->core : NULL;
 }
@@ -298,10 +298,7 @@ perf_evsel__add_event(struct parse_events_state *parse_state,
 	if (pmu && attr->type == PERF_TYPE_RAW)
 		perf_pmu__warn_invalid_config(pmu, attr->config, name);
 
-	if (init_attr)
-		event_attr_init(attr);
-
-	evsel = parse_state->ops->perf_evsel__new(attr, *idx);
+	evsel = parse_state->ops->perf_evsel__new(attr, *idx, init_attr);
 	if (!evsel) {
 		perf_cpu_map__put(cpus);
 		return NULL;
diff --git a/tools/perf/util/sideband_evlist.c b/tools/perf/util/sideband_evlist.c
index 748371ac22be..9bc5760436a4 100644
--- a/tools/perf/util/sideband_evlist.c
+++ b/tools/perf/util/sideband_evlist.c
@@ -22,7 +22,7 @@ int evlist__add_sb_event(struct evlist *evlist, struct perf_event_attr *attr,
 		attr->sample_id_all = 1;
 	}
 
-	evsel = evsel__new_idx(attr, evlist->core.nr_entries);
+	evsel = evsel__new_idx(attr, evlist->core.nr_entries, false);
 	if (!evsel)
 		return -1;
 
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 32/59] libperf: Move in perf_pmu__warn_invalid_config function
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (29 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 31/59] perf tools: Move event_attr_init in evsel__new_idx function Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 33/59] libperf: Move in perf_evsel__add_event function Jiri Olsa
                   ` (27 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving perf_pmu__warn_invalid_config function to libperf.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/pmu.h |  2 ++
 tools/lib/perf/pmu.c                  | 34 +++++++++++++++++++++++++++
 tools/perf/util/pmu.c                 | 33 --------------------------
 tools/perf/util/pmu.h                 |  3 ---
 4 files changed, 36 insertions(+), 36 deletions(-)

diff --git a/tools/lib/perf/include/internal/pmu.h b/tools/lib/perf/include/internal/pmu.h
index b8a78e024f6d..49ae6b3813e6 100644
--- a/tools/lib/perf/include/internal/pmu.h
+++ b/tools/lib/perf/include/internal/pmu.h
@@ -54,4 +54,6 @@ void perf_pmu__set_format(unsigned long *bits, long from, long to);
 void perf_pmu_error(struct list_head *list, char *name, char const *msg);
 int perf_pmu__format_parse(char *dir, struct list_head *head);
 
+void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config,
+				   const char *name);
 #endif /* __LIBPERF_INTERNAL_PMU_H */
diff --git a/tools/lib/perf/pmu.c b/tools/lib/perf/pmu.c
index 2fa361516ca8..af7f1c44c914 100644
--- a/tools/lib/perf/pmu.c
+++ b/tools/lib/perf/pmu.c
@@ -10,6 +10,7 @@
 #include <sys/types.h>
 #include <dirent.h>
 #include <internal/pmu.h>
+#include "internal.h"
 
 extern FILE *perf_pmu_in;
 
@@ -81,3 +82,36 @@ int perf_pmu__format_parse(char *dir, struct list_head *head)
 	closedir(format_dir);
 	return ret;
 }
+
+void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config,
+				   const char *name)
+{
+	struct perf_pmu_format *format;
+	__u64 masks = 0, bits;
+	char buf[100];
+	unsigned int i;
+
+	list_for_each_entry(format, &pmu->format, list)	{
+		if (format->value != PERF_PMU_FORMAT_VALUE_CONFIG)
+			continue;
+
+		for_each_set_bit(i, format->bits, PERF_PMU_FORMAT_BITS)
+			masks |= 1ULL << i;
+	}
+
+	/*
+	 * Kernel doesn't export any valid format bits.
+	 */
+	if (masks == 0)
+		return;
+
+	bits = config & ~masks;
+	if (bits == 0)
+		return;
+
+	bitmap_scnprintf((unsigned long *)&bits, sizeof(bits) * 8, buf, sizeof(buf));
+
+	pr_warning("WARNING: event '%s' not valid (bits %s of config "
+		   "'%llx' not supported by kernel)!\n",
+		   name ?: "N/A", buf, config);
+}
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index 5bda7796f91a..920f2df52b6d 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -1846,39 +1846,6 @@ int perf_pmu__caps_parse(struct perf_pmu *pmu)
 	return nr_caps;
 }
 
-void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config,
-				   const char *name)
-{
-	struct perf_pmu_format *format;
-	__u64 masks = 0, bits;
-	char buf[100];
-	unsigned int i;
-
-	list_for_each_entry(format, &pmu->format, list)	{
-		if (format->value != PERF_PMU_FORMAT_VALUE_CONFIG)
-			continue;
-
-		for_each_set_bit(i, format->bits, PERF_PMU_FORMAT_BITS)
-			masks |= 1ULL << i;
-	}
-
-	/*
-	 * Kernel doesn't export any valid format bits.
-	 */
-	if (masks == 0)
-		return;
-
-	bits = config & ~masks;
-	if (bits == 0)
-		return;
-
-	bitmap_scnprintf((unsigned long *)&bits, sizeof(bits) * 8, buf, sizeof(buf));
-
-	pr_warning("WARNING: event '%s' not valid (bits %s of config "
-		   "'%llx' not supported by kernel)!\n",
-		   name ?: "N/A", buf, config);
-}
-
 bool perf_pmu__has_hybrid(void)
 {
 	if (!hybrid_scanned) {
diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h
index 091f49a655f8..077dbbdccb95 100644
--- a/tools/perf/util/pmu.h
+++ b/tools/perf/util/pmu.h
@@ -96,9 +96,6 @@ int perf_pmu__convert_scale(const char *scale, char **end, double *sval);
 
 int perf_pmu__caps_parse(struct perf_pmu *pmu);
 
-void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config,
-				   const char *name);
-
 bool perf_pmu__has_hybrid(void);
 int perf_pmu__match(char *pattern, char *name, char *tok);
 
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 33/59] libperf: Move in perf_evsel__add_event function
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (30 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 32/59] libperf: Move in perf_pmu__warn_invalid_config function Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 34/59] perf tools: Move parse_events_update_lists to parser unit Jiri Olsa
                   ` (26 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving perf_evsel__add_event function to libperf.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 .../lib/perf/include/internal/parse-events.h  |  9 ++++
 tools/lib/perf/parse-events.c                 | 47 +++++++++++++++++++
 tools/perf/util/parse-events.c                | 44 -----------------
 3 files changed, 56 insertions(+), 44 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index b314c8639c78..7bf58f6fc53f 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -120,4 +120,13 @@ void parse_events_terms__delete(struct list_head *terms);
 void parse_events_terms__purge(struct list_head *terms);
 int parse_events_copy_term_list(struct list_head *old,
 				 struct list_head **new);
+
+struct perf_evsel *
+perf_evsel__add_event(struct parse_events_state *parse_state,
+		      struct list_head *list,
+		      struct perf_event_attr *attr,
+		      bool init_attr,
+		      const char *name, const char *metric_id, struct perf_pmu *pmu,
+		      struct list_head *config_terms, bool auto_merge_stats,
+		      const char *cpu_list);
 #endif /* __LIBPERF_PARSE_EVENTS_H */
diff --git a/tools/lib/perf/parse-events.c b/tools/lib/perf/parse-events.c
index cda7c1e5563e..6d840764c84d 100644
--- a/tools/lib/perf/parse-events.c
+++ b/tools/lib/perf/parse-events.c
@@ -5,6 +5,9 @@
 #include <linux/zalloc.h>
 #include <string.h>
 #include <internal/parse-events.h>
+#include <internal/pmu.h>
+#include <internal/evsel.h>
+#include <perf/cpumap.h>
 #include <stdlib.h>
 #include <errno.h>
 
@@ -302,3 +305,47 @@ void parse_events_terms__delete(struct list_head *terms)
 	parse_events_terms__purge(terms);
 	free(terms);
 }
+
+struct perf_evsel *
+perf_evsel__add_event(struct parse_events_state *parse_state,
+		      struct list_head *list,
+		      struct perf_event_attr *attr,
+		      bool init_attr,
+		      const char *name, const char *metric_id, struct perf_pmu *pmu,
+		      struct list_head *config_terms, bool auto_merge_stats,
+		      const char *cpu_list)
+{
+	struct perf_evsel *evsel;
+	struct perf_cpu_map *cpus = pmu ? perf_cpu_map__get(pmu->cpus) :
+			       cpu_list ? perf_cpu_map__new(cpu_list) : NULL;
+	int *idx = &parse_state->idx;
+
+	if (pmu && attr->type == PERF_TYPE_RAW)
+		perf_pmu__warn_invalid_config(pmu, attr->config, name);
+
+	evsel = parse_state->ops->perf_evsel__new(attr, *idx, init_attr);
+	if (!evsel) {
+		perf_cpu_map__put(cpus);
+		return NULL;
+	}
+
+	(*idx)++;
+	evsel->cpus = cpus;
+	evsel->own_cpus = perf_cpu_map__get(cpus);
+	evsel->system_wide = pmu ? pmu->is_uncore : false;
+	evsel->auto_merge_stats = auto_merge_stats;
+
+	if (name)
+		evsel->name = strdup(name);
+
+	if (metric_id)
+		evsel->metric_id = strdup(metric_id);
+
+	if (config_terms)
+		list_splice_init(config_terms, &evsel->config_terms);
+
+	if (list)
+		list_add_tail(&evsel->node, list);
+
+	return evsel;
+}
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index c971291f2ec7..77e122eb5601 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -281,50 +281,6 @@ static char *get_config_name(struct list_head *head_terms)
 	return get_config_str(head_terms, PARSE_EVENTS__TERM_TYPE_NAME);
 }
 
-static struct perf_evsel *
-perf_evsel__add_event(struct parse_events_state *parse_state,
-		      struct list_head *list,
-		      struct perf_event_attr *attr,
-		      bool init_attr,
-		      const char *name, const char *metric_id, struct perf_pmu *pmu,
-		      struct list_head *config_terms, bool auto_merge_stats,
-		      const char *cpu_list)
-{
-	struct perf_evsel *evsel;
-	struct perf_cpu_map *cpus = pmu ? perf_cpu_map__get(pmu->cpus) :
-			       cpu_list ? perf_cpu_map__new(cpu_list) : NULL;
-	int *idx = &parse_state->idx;
-
-	if (pmu && attr->type == PERF_TYPE_RAW)
-		perf_pmu__warn_invalid_config(pmu, attr->config, name);
-
-	evsel = parse_state->ops->perf_evsel__new(attr, *idx, init_attr);
-	if (!evsel) {
-		perf_cpu_map__put(cpus);
-		return NULL;
-	}
-
-	(*idx)++;
-	evsel->cpus = cpus;
-	evsel->own_cpus = perf_cpu_map__get(cpus);
-	evsel->system_wide = pmu ? pmu->is_uncore : false;
-	evsel->auto_merge_stats = auto_merge_stats;
-
-	if (name)
-		evsel->name = strdup(name);
-
-	if (metric_id)
-		evsel->metric_id = strdup(metric_id);
-
-	if (config_terms)
-		list_splice_init(config_terms, &evsel->config_terms);
-
-	if (list)
-		list_add_tail(&evsel->node, list);
-
-	return evsel;
-}
-
 static struct evsel *
 evsel__add_event(struct parse_events_state *parse_state,
 		 struct list_head *list,
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 34/59] perf tools: Move parse_events_update_lists to parser unit
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (31 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 33/59] libperf: Move in perf_evsel__add_event function Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 35/59] libperf: Add perf_evsel__is_group_leader function Jiri Olsa
                   ` (25 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving parse_events_update_lists to parser unit,
so we can easily move it to libperf.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/parse-events.c | 13 -------------
 tools/perf/util/parse-events.h |  2 --
 tools/perf/util/parse-events.y | 21 +++++++++++++++++----
 3 files changed, 17 insertions(+), 19 deletions(-)

diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 77e122eb5601..1e3ec927545e 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1752,19 +1752,6 @@ void parse_events__set_leader(char *name, struct list_head *list,
 	leader->core.group_name = name ? strdup(name) : NULL;
 }
 
-/* list_event is assumed to point to malloc'ed memory */
-void parse_events_update_lists(struct list_head *list_event,
-			       struct list_head *list_all)
-{
-	/*
-	 * Called for single event definition. Update the
-	 * 'all event' list, and reinit the 'single event'
-	 * list, for next event definition.
-	 */
-	list_splice_tail(list_event, list_all);
-	free(list_event);
-}
-
 struct event_modifier {
 	int eu;
 	int ek;
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 057b92778d17..e4ac9b546bc3 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -120,8 +120,6 @@ enum perf_pmu_event_symbol_type
 perf_pmu__parse_check(const char *name);
 void parse_events__set_leader(char *name, struct list_head *list,
 			      struct parse_events_state *parse_state);
-void parse_events_update_lists(struct list_head *list_event,
-			       struct list_head *list_all);
 void parse_events_evlist_error(struct parse_events_state *parse_state,
 			       int idx, const char *str);
 
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index e62a7a3bf6b2..098e27ac718c 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -49,6 +49,19 @@ static void free_list_evsel(struct list_head* list_evsel)
 	free(list_evsel);
 }
 
+/* list_event is assumed to point to malloc'ed memory */
+static void update_lists(struct list_head *list_event,
+			 struct list_head *list_all)
+{
+	/*
+	 * Called for single event definition. Update the
+	 * 'all event' list, and reinit the 'single event'
+	 * list, for next event definition.
+	 */
+	list_splice_tail(list_event, list_all);
+	free(list_event);
+}
+
 static void inc_group_count(struct list_head *list,
 		       struct parse_events_state *parse_state)
 {
@@ -160,7 +173,7 @@ start_events: groups
 	struct parse_events_state *parse_state = _parse_state;
 
 	/* frees $1 */
-	parse_events_update_lists($1, &parse_state->list);
+	update_lists($1, &parse_state->list);
 }
 
 groups:
@@ -170,7 +183,7 @@ groups ',' group
 	struct list_head *group = $3;
 
 	/* frees $3 */
-	parse_events_update_lists(group, list);
+	update_lists(group, list);
 	$$ = list;
 }
 |
@@ -180,7 +193,7 @@ groups ',' event
 	struct list_head *event = $3;
 
 	/* frees $3 */
-	parse_events_update_lists(event, list);
+	update_lists(event, list);
 	$$ = list;
 }
 |
@@ -237,7 +250,7 @@ events ',' event
 	struct list_head *list  = $1;
 
 	/* frees $3 */
-	parse_events_update_lists(event, list);
+	update_lists(event, list);
 	$$ = list;
 }
 |
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 35/59] libperf: Add perf_evsel__is_group_leader function
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (32 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 34/59] perf tools: Move parse_events_update_lists to parser unit Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 36/59] perf tools: Make parse_events__modifier_event work over perf_evsel Jiri Olsa
                   ` (24 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Adding perf_evsel__is_group_leader function.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/evsel.h | 5 +++++
 tools/perf/util/evsel.h                 | 2 +-
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
index befcd180ef3d..7759fe12d78e 100644
--- a/tools/lib/perf/include/internal/evsel.h
+++ b/tools/lib/perf/include/internal/evsel.h
@@ -89,4 +89,9 @@ int perf_evsel__apply_filter(struct perf_evsel *evsel, const char *filter);
 int perf_evsel__alloc_id(struct perf_evsel *evsel, int ncpus, int nthreads);
 void perf_evsel__free_id(struct perf_evsel *evsel);
 
+static inline bool perf_evsel__is_group_leader(const struct perf_evsel *evsel)
+{
+        return evsel->leader == evsel;
+}
+
 #endif /* __LIBPERF_INTERNAL_EVSEL_H */
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index 203abab2c48d..bf698e43c9fc 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -368,7 +368,7 @@ static inline struct evsel *evsel__prev(struct evsel *evsel)
  */
 static inline bool evsel__is_group_leader(const struct evsel *evsel)
 {
-	return evsel->core.leader == &evsel->core;
+	return perf_evsel__is_group_leader(&evsel->core);
 }
 
 /**
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 36/59] perf tools: Make parse_events__modifier_event work over perf_evsel
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (33 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 35/59] libperf: Add perf_evsel__is_group_leader function Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 37/59] perf tool: Pass perf_guest in struct parse_events_state Jiri Olsa
                   ` (23 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Making parse_events__modifier_event work over perf_evsel.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/parse-events.c | 60 +++++++++++++++++-----------------
 1 file changed, 30 insertions(+), 30 deletions(-)

diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 1e3ec927545e..41615c6e9871 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1770,22 +1770,22 @@ struct event_modifier {
 };
 
 static int get_event_modifier(struct event_modifier *mod, char *str,
-			       struct evsel *evsel)
-{
-	int eu = evsel ? evsel->core.attr.exclude_user : 0;
-	int ek = evsel ? evsel->core.attr.exclude_kernel : 0;
-	int eh = evsel ? evsel->core.attr.exclude_hv : 0;
-	int eH = evsel ? evsel->core.attr.exclude_host : 0;
-	int eG = evsel ? evsel->core.attr.exclude_guest : 0;
-	int eI = evsel ? evsel->core.attr.exclude_idle : 0;
-	int precise = evsel ? evsel->core.attr.precise_ip : 0;
+			       struct perf_evsel *evsel)
+{
+	int eu = evsel ? evsel->attr.exclude_user : 0;
+	int ek = evsel ? evsel->attr.exclude_kernel : 0;
+	int eh = evsel ? evsel->attr.exclude_hv : 0;
+	int eH = evsel ? evsel->attr.exclude_host : 0;
+	int eG = evsel ? evsel->attr.exclude_guest : 0;
+	int eI = evsel ? evsel->attr.exclude_idle : 0;
+	int precise = evsel ? evsel->attr.precise_ip : 0;
 	int precise_max = 0;
 	int sample_read = 0;
-	int pinned = evsel ? evsel->core.attr.pinned : 0;
-	int exclusive = evsel ? evsel->core.attr.exclusive : 0;
+	int pinned = evsel ? evsel->attr.pinned : 0;
+	int exclusive = evsel ? evsel->attr.exclusive : 0;
 
 	int exclude = eu | ek | eh;
-	int exclude_GH = evsel ? evsel->core.exclude_GH : 0;
+	int exclude_GH = evsel ? evsel->exclude_GH : 0;
 	int weak = 0;
 	int bpf_counter = 0;
 
@@ -1893,7 +1893,7 @@ static int check_modifier(char *str)
 
 int parse_events__modifier_event(struct list_head *list, char *str, bool add)
 {
-	struct evsel *evsel;
+	struct perf_evsel *evsel;
 	struct event_modifier mod;
 
 	if (str == NULL)
@@ -1905,26 +1905,26 @@ int parse_events__modifier_event(struct list_head *list, char *str, bool add)
 	if (!add && get_event_modifier(&mod, str, NULL))
 		return -EINVAL;
 
-	__evlist__for_each_entry(list, evsel) {
+	__perf_evlist__for_each_entry(list, evsel) {
 		if (add && get_event_modifier(&mod, str, evsel))
 			return -EINVAL;
 
-		evsel->core.attr.exclude_user   = mod.eu;
-		evsel->core.attr.exclude_kernel = mod.ek;
-		evsel->core.attr.exclude_hv     = mod.eh;
-		evsel->core.attr.precise_ip     = mod.precise;
-		evsel->core.attr.exclude_host   = mod.eH;
-		evsel->core.attr.exclude_guest  = mod.eG;
-		evsel->core.attr.exclude_idle   = mod.eI;
-		evsel->core.exclude_GH          = mod.exclude_GH;
-		evsel->core.sample_read         = mod.sample_read;
-		evsel->core.precise_max         = mod.precise_max;
-		evsel->core.weak_group          = mod.weak;
-		evsel->core.bpf_counter	        = mod.bpf_counter;
-
-		if (evsel__is_group_leader(evsel)) {
-			evsel->core.attr.pinned = mod.pinned;
-			evsel->core.attr.exclusive = mod.exclusive;
+		evsel->attr.exclude_user   = mod.eu;
+		evsel->attr.exclude_kernel = mod.ek;
+		evsel->attr.exclude_hv     = mod.eh;
+		evsel->attr.precise_ip     = mod.precise;
+		evsel->attr.exclude_host   = mod.eH;
+		evsel->attr.exclude_guest  = mod.eG;
+		evsel->attr.exclude_idle   = mod.eI;
+		evsel->exclude_GH          = mod.exclude_GH;
+		evsel->sample_read         = mod.sample_read;
+		evsel->precise_max         = mod.precise_max;
+		evsel->weak_group          = mod.weak;
+		evsel->bpf_counter         = mod.bpf_counter;
+
+		if (perf_evsel__is_group_leader(evsel)) {
+			evsel->attr.pinned = mod.pinned;
+			evsel->attr.exclusive = mod.exclusive;
 		}
 	}
 
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 37/59] perf tool: Pass perf_guest in struct parse_events_state
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (34 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 36/59] perf tools: Make parse_events__modifier_event work over perf_evsel Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 38/59] libperf: Move in parse_events__modifier_group/event functions Jiri Olsa
                   ` (22 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Passing perf_guest in struct parse_events_state so the
parsing code does not depend on perf_guest variable.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/parse-events.h |  1 +
 tools/perf/util/parse-events.c                 | 18 +++++++++++-------
 tools/perf/util/parse-events.h                 |  4 ++--
 tools/perf/util/parse-events.y                 |  8 ++++----
 4 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index 7bf58f6fc53f..e4b136a58484 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -101,6 +101,7 @@ struct parse_events_state {
 	struct perf_pmu		  *fake_pmu;
 	char			  *hybrid_pmu_name;
 	struct parse_events_ops	  *ops;
+	bool			   guest;
 };
 
 int parse_events_term__num(struct parse_events_term **term,
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 41615c6e9871..e10f6476854f 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1618,9 +1618,9 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
 }
 
 int parse_events__modifier_group(struct list_head *list,
-				 char *event_mod)
+				 char *event_mod, bool guest)
 {
-	return parse_events__modifier_event(list, event_mod, true);
+	return parse_events__modifier_event(list, event_mod, true, guest);
 }
 
 /*
@@ -1770,7 +1770,7 @@ struct event_modifier {
 };
 
 static int get_event_modifier(struct event_modifier *mod, char *str,
-			       struct perf_evsel *evsel)
+			       struct perf_evsel *evsel, bool guest)
 {
 	int eu = evsel ? evsel->attr.exclude_user : 0;
 	int ek = evsel ? evsel->attr.exclude_kernel : 0;
@@ -1795,7 +1795,7 @@ static int get_event_modifier(struct event_modifier *mod, char *str,
 		if (*str == 'u') {
 			if (!exclude)
 				exclude = eu = ek = eh = 1;
-			if (!exclude_GH && !perf_guest)
+			if (!exclude_GH && !guest)
 				eG = 1;
 			eu = 0;
 		} else if (*str == 'k') {
@@ -1891,7 +1891,8 @@ static int check_modifier(char *str)
 	return 0;
 }
 
-int parse_events__modifier_event(struct list_head *list, char *str, bool add)
+int parse_events__modifier_event(struct list_head *list, char *str,
+				 bool add, bool guest)
 {
 	struct perf_evsel *evsel;
 	struct event_modifier mod;
@@ -1902,11 +1903,11 @@ int parse_events__modifier_event(struct list_head *list, char *str, bool add)
 	if (check_modifier(str))
 		return -EINVAL;
 
-	if (!add && get_event_modifier(&mod, str, NULL))
+	if (!add && get_event_modifier(&mod, str, NULL, guest))
 		return -EINVAL;
 
 	__perf_evlist__for_each_entry(list, evsel) {
-		if (add && get_event_modifier(&mod, str, evsel))
+		if (add && get_event_modifier(&mod, str, evsel, guest))
 			return -EINVAL;
 
 		evsel->attr.exclude_user   = mod.eu;
@@ -2115,6 +2116,7 @@ int parse_events_terms(struct list_head *terms, const char *str)
 		.ops     = &parse_state_ops,
 		.terms   = NULL,
 		.stoken  = PE_START_TERMS,
+		.guest   = perf_guest,
 	};
 	int ret;
 
@@ -2141,6 +2143,7 @@ static int parse_events__with_hybrid_pmu(struct parse_events_state *parse_state,
 		.hybrid_pmu_name = pmu_name,
 		.idx             = parse_state->idx,
 		.ops             = &parse_state_ops,
+		.guest           = perf_guest,
 	};
 	int ret;
 
@@ -2170,6 +2173,7 @@ int __parse_events(struct evlist *evlist, const char *str,
 		.stoken	  = PE_START_EVENTS,
 		.fake_pmu = fake_pmu,
 		.ops	  = &parse_state_ops,
+		.guest    = perf_guest,
 	};
 	int ret;
 
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index e4ac9b546bc3..599ee3a760d7 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -65,8 +65,8 @@ void parse_events__handle_error(struct parse_events_error *err, int idx,
 				char *str, char *help);
 void parse_events__shrink_config_terms(void);
 void parse_events__clear_array(struct parse_events_array *a);
-int parse_events__modifier_event(struct list_head *list, char *str, bool add);
-int parse_events__modifier_group(struct list_head *list, char *event_mod);
+int parse_events__modifier_event(struct list_head *list, char *str, bool add, bool guest);
+int parse_events__modifier_group(struct list_head *list, char *event_mod, bool guest);
 int parse_events_name(struct list_head *list, const char *name);
 int parse_events_add_tracepoint(struct parse_events_state *parse_state,
 				struct list_head *list,
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 098e27ac718c..d5cd2827b8a0 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -204,13 +204,13 @@ event
 group:
 group_def ':' PE_MODIFIER_EVENT
 {
+	struct parse_events_state *parse_state = _parse_state;
 	struct list_head *list = $1;
 	int err;
 
-	err = parse_events__modifier_group(list, $3);
+	err = parse_events__modifier_group(list, $3, parse_state->guest);
 	free($3);
 	if (err) {
-		struct parse_events_state *parse_state = _parse_state;
 		struct parse_events_error *error = parse_state->error;
 
 		parse_events__handle_error(error, @3.first_column,
@@ -261,6 +261,7 @@ event: event_mod
 event_mod:
 event_name PE_MODIFIER_EVENT
 {
+	struct parse_events_state *parse_state = _parse_state;
 	struct list_head *list = $1;
 	int err;
 
@@ -269,10 +270,9 @@ event_name PE_MODIFIER_EVENT
 	 * (there could be more events added for multiple tracepoint
 	 * definitions via '*?'.
 	 */
-	err = parse_events__modifier_event(list, $2, false);
+	err = parse_events__modifier_event(list, $2, false, parse_state->guest);
 	free($2);
 	if (err) {
-		struct parse_events_state *parse_state = _parse_state;
 		struct parse_events_error *error = parse_state->error;
 
 		parse_events__handle_error(error, @2.first_column,
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 38/59] libperf: Move in parse_events__modifier_group/event functions
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (35 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 37/59] perf tool: Pass perf_guest in struct parse_events_state Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 39/59] libperf: Move in parse_events__handle_error function Jiri Olsa
                   ` (21 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving parse_events__modifier_group/event functions to libperf.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 .../lib/perf/include/internal/parse-events.h  |   2 +
 tools/lib/perf/parse-events.c                 | 187 ++++++++++++++++++
 tools/perf/util/parse-events.c                | 186 -----------------
 tools/perf/util/parse-events.h                |   2 -
 4 files changed, 189 insertions(+), 188 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index e4b136a58484..88195ae2eb10 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -130,4 +130,6 @@ perf_evsel__add_event(struct parse_events_state *parse_state,
 		      const char *name, const char *metric_id, struct perf_pmu *pmu,
 		      struct list_head *config_terms, bool auto_merge_stats,
 		      const char *cpu_list);
+int parse_events__modifier_event(struct list_head *list, char *str, bool add, bool guest);
+int parse_events__modifier_group(struct list_head *list, char *event_mod, bool guest);
 #endif /* __LIBPERF_PARSE_EVENTS_H */
diff --git a/tools/lib/perf/parse-events.c b/tools/lib/perf/parse-events.c
index 6d840764c84d..3b93528f4569 100644
--- a/tools/lib/perf/parse-events.c
+++ b/tools/lib/perf/parse-events.c
@@ -6,6 +6,7 @@
 #include <string.h>
 #include <internal/parse-events.h>
 #include <internal/pmu.h>
+#include <internal/evlist.h>
 #include <internal/evsel.h>
 #include <perf/cpumap.h>
 #include <stdlib.h>
@@ -349,3 +350,189 @@ perf_evsel__add_event(struct parse_events_state *parse_state,
 
 	return evsel;
 }
+
+struct event_modifier {
+	int eu;
+	int ek;
+	int eh;
+	int eH;
+	int eG;
+	int eI;
+	int precise;
+	int precise_max;
+	int exclude_GH;
+	int sample_read;
+	int pinned;
+	int weak;
+	int exclusive;
+	int bpf_counter;
+};
+
+static int get_event_modifier(struct event_modifier *mod, char *str,
+			       struct perf_evsel *evsel, bool guest)
+{
+	int eu = evsel ? evsel->attr.exclude_user : 0;
+	int ek = evsel ? evsel->attr.exclude_kernel : 0;
+	int eh = evsel ? evsel->attr.exclude_hv : 0;
+	int eH = evsel ? evsel->attr.exclude_host : 0;
+	int eG = evsel ? evsel->attr.exclude_guest : 0;
+	int eI = evsel ? evsel->attr.exclude_idle : 0;
+	int precise = evsel ? evsel->attr.precise_ip : 0;
+	int precise_max = 0;
+	int sample_read = 0;
+	int pinned = evsel ? evsel->attr.pinned : 0;
+	int exclusive = evsel ? evsel->attr.exclusive : 0;
+
+	int exclude = eu | ek | eh;
+	int exclude_GH = evsel ? evsel->exclude_GH : 0;
+	int weak = 0;
+	int bpf_counter = 0;
+
+	memset(mod, 0, sizeof(*mod));
+
+	while (*str) {
+		if (*str == 'u') {
+			if (!exclude)
+				exclude = eu = ek = eh = 1;
+			if (!exclude_GH && !guest)
+				eG = 1;
+			eu = 0;
+		} else if (*str == 'k') {
+			if (!exclude)
+				exclude = eu = ek = eh = 1;
+			ek = 0;
+		} else if (*str == 'h') {
+			if (!exclude)
+				exclude = eu = ek = eh = 1;
+			eh = 0;
+		} else if (*str == 'G') {
+			if (!exclude_GH)
+				exclude_GH = eG = eH = 1;
+			eG = 0;
+		} else if (*str == 'H') {
+			if (!exclude_GH)
+				exclude_GH = eG = eH = 1;
+			eH = 0;
+		} else if (*str == 'I') {
+			eI = 1;
+		} else if (*str == 'p') {
+			precise++;
+			/* use of precise requires exclude_guest */
+			if (!exclude_GH)
+				eG = 1;
+		} else if (*str == 'P') {
+			precise_max = 1;
+		} else if (*str == 'S') {
+			sample_read = 1;
+		} else if (*str == 'D') {
+			pinned = 1;
+		} else if (*str == 'e') {
+			exclusive = 1;
+		} else if (*str == 'W') {
+			weak = 1;
+		} else if (*str == 'b') {
+			bpf_counter = 1;
+		} else
+			break;
+
+		++str;
+	}
+
+	/*
+	 * precise ip:
+	 *
+	 *  0 - SAMPLE_IP can have arbitrary skid
+	 *  1 - SAMPLE_IP must have constant skid
+	 *  2 - SAMPLE_IP requested to have 0 skid
+	 *  3 - SAMPLE_IP must have 0 skid
+	 *
+	 *  See also PERF_RECORD_MISC_EXACT_IP
+	 */
+	if (precise > 3)
+		return -EINVAL;
+
+	mod->eu = eu;
+	mod->ek = ek;
+	mod->eh = eh;
+	mod->eH = eH;
+	mod->eG = eG;
+	mod->eI = eI;
+	mod->precise = precise;
+	mod->precise_max = precise_max;
+	mod->exclude_GH = exclude_GH;
+	mod->sample_read = sample_read;
+	mod->pinned = pinned;
+	mod->weak = weak;
+	mod->bpf_counter = bpf_counter;
+	mod->exclusive = exclusive;
+
+	return 0;
+}
+
+/*
+ * Basic modifier sanity check to validate it contains only one
+ * instance of any modifier (apart from 'p') present.
+ */
+static int check_modifier(char *str)
+{
+	char *p = str;
+
+	/* The sizeof includes 0 byte as well. */
+	if (strlen(str) > (sizeof("ukhGHpppPSDIWeb") - 1))
+		return -1;
+
+	while (*p) {
+		if (*p != 'p' && strchr(p + 1, *p))
+			return -1;
+		p++;
+	}
+
+	return 0;
+}
+
+int parse_events__modifier_event(struct list_head *list, char *str,
+				 bool add, bool guest)
+{
+	struct perf_evsel *evsel;
+	struct event_modifier mod;
+
+	if (str == NULL)
+		return 0;
+
+	if (check_modifier(str))
+		return -EINVAL;
+
+	if (!add && get_event_modifier(&mod, str, NULL, guest))
+		return -EINVAL;
+
+	__perf_evlist__for_each_entry(list, evsel) {
+		if (add && get_event_modifier(&mod, str, evsel, guest))
+			return -EINVAL;
+
+		evsel->attr.exclude_user   = mod.eu;
+		evsel->attr.exclude_kernel = mod.ek;
+		evsel->attr.exclude_hv     = mod.eh;
+		evsel->attr.precise_ip     = mod.precise;
+		evsel->attr.exclude_host   = mod.eH;
+		evsel->attr.exclude_guest  = mod.eG;
+		evsel->attr.exclude_idle   = mod.eI;
+		evsel->exclude_GH          = mod.exclude_GH;
+		evsel->sample_read         = mod.sample_read;
+		evsel->precise_max         = mod.precise_max;
+		evsel->weak_group          = mod.weak;
+		evsel->bpf_counter         = mod.bpf_counter;
+
+		if (perf_evsel__is_group_leader(evsel)) {
+			evsel->attr.pinned = mod.pinned;
+			evsel->attr.exclusive = mod.exclusive;
+		}
+	}
+
+	return 0;
+}
+
+int parse_events__modifier_group(struct list_head *list,
+				 char *event_mod, bool guest)
+{
+	return parse_events__modifier_event(list, event_mod, true, guest);
+}
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index e10f6476854f..ecbb7f284158 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1617,12 +1617,6 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
 	return ok ? 0 : -1;
 }
 
-int parse_events__modifier_group(struct list_head *list,
-				 char *event_mod, bool guest)
-{
-	return parse_events__modifier_event(list, event_mod, true, guest);
-}
-
 /*
  * Check if the two uncore PMUs are from the same uncore block
  * The format of the uncore PMU name is uncore_#blockname_#pmuidx
@@ -1752,186 +1746,6 @@ void parse_events__set_leader(char *name, struct list_head *list,
 	leader->core.group_name = name ? strdup(name) : NULL;
 }
 
-struct event_modifier {
-	int eu;
-	int ek;
-	int eh;
-	int eH;
-	int eG;
-	int eI;
-	int precise;
-	int precise_max;
-	int exclude_GH;
-	int sample_read;
-	int pinned;
-	int weak;
-	int exclusive;
-	int bpf_counter;
-};
-
-static int get_event_modifier(struct event_modifier *mod, char *str,
-			       struct perf_evsel *evsel, bool guest)
-{
-	int eu = evsel ? evsel->attr.exclude_user : 0;
-	int ek = evsel ? evsel->attr.exclude_kernel : 0;
-	int eh = evsel ? evsel->attr.exclude_hv : 0;
-	int eH = evsel ? evsel->attr.exclude_host : 0;
-	int eG = evsel ? evsel->attr.exclude_guest : 0;
-	int eI = evsel ? evsel->attr.exclude_idle : 0;
-	int precise = evsel ? evsel->attr.precise_ip : 0;
-	int precise_max = 0;
-	int sample_read = 0;
-	int pinned = evsel ? evsel->attr.pinned : 0;
-	int exclusive = evsel ? evsel->attr.exclusive : 0;
-
-	int exclude = eu | ek | eh;
-	int exclude_GH = evsel ? evsel->exclude_GH : 0;
-	int weak = 0;
-	int bpf_counter = 0;
-
-	memset(mod, 0, sizeof(*mod));
-
-	while (*str) {
-		if (*str == 'u') {
-			if (!exclude)
-				exclude = eu = ek = eh = 1;
-			if (!exclude_GH && !guest)
-				eG = 1;
-			eu = 0;
-		} else if (*str == 'k') {
-			if (!exclude)
-				exclude = eu = ek = eh = 1;
-			ek = 0;
-		} else if (*str == 'h') {
-			if (!exclude)
-				exclude = eu = ek = eh = 1;
-			eh = 0;
-		} else if (*str == 'G') {
-			if (!exclude_GH)
-				exclude_GH = eG = eH = 1;
-			eG = 0;
-		} else if (*str == 'H') {
-			if (!exclude_GH)
-				exclude_GH = eG = eH = 1;
-			eH = 0;
-		} else if (*str == 'I') {
-			eI = 1;
-		} else if (*str == 'p') {
-			precise++;
-			/* use of precise requires exclude_guest */
-			if (!exclude_GH)
-				eG = 1;
-		} else if (*str == 'P') {
-			precise_max = 1;
-		} else if (*str == 'S') {
-			sample_read = 1;
-		} else if (*str == 'D') {
-			pinned = 1;
-		} else if (*str == 'e') {
-			exclusive = 1;
-		} else if (*str == 'W') {
-			weak = 1;
-		} else if (*str == 'b') {
-			bpf_counter = 1;
-		} else
-			break;
-
-		++str;
-	}
-
-	/*
-	 * precise ip:
-	 *
-	 *  0 - SAMPLE_IP can have arbitrary skid
-	 *  1 - SAMPLE_IP must have constant skid
-	 *  2 - SAMPLE_IP requested to have 0 skid
-	 *  3 - SAMPLE_IP must have 0 skid
-	 *
-	 *  See also PERF_RECORD_MISC_EXACT_IP
-	 */
-	if (precise > 3)
-		return -EINVAL;
-
-	mod->eu = eu;
-	mod->ek = ek;
-	mod->eh = eh;
-	mod->eH = eH;
-	mod->eG = eG;
-	mod->eI = eI;
-	mod->precise = precise;
-	mod->precise_max = precise_max;
-	mod->exclude_GH = exclude_GH;
-	mod->sample_read = sample_read;
-	mod->pinned = pinned;
-	mod->weak = weak;
-	mod->bpf_counter = bpf_counter;
-	mod->exclusive = exclusive;
-
-	return 0;
-}
-
-/*
- * Basic modifier sanity check to validate it contains only one
- * instance of any modifier (apart from 'p') present.
- */
-static int check_modifier(char *str)
-{
-	char *p = str;
-
-	/* The sizeof includes 0 byte as well. */
-	if (strlen(str) > (sizeof("ukhGHpppPSDIWeb") - 1))
-		return -1;
-
-	while (*p) {
-		if (*p != 'p' && strchr(p + 1, *p))
-			return -1;
-		p++;
-	}
-
-	return 0;
-}
-
-int parse_events__modifier_event(struct list_head *list, char *str,
-				 bool add, bool guest)
-{
-	struct perf_evsel *evsel;
-	struct event_modifier mod;
-
-	if (str == NULL)
-		return 0;
-
-	if (check_modifier(str))
-		return -EINVAL;
-
-	if (!add && get_event_modifier(&mod, str, NULL, guest))
-		return -EINVAL;
-
-	__perf_evlist__for_each_entry(list, evsel) {
-		if (add && get_event_modifier(&mod, str, evsel, guest))
-			return -EINVAL;
-
-		evsel->attr.exclude_user   = mod.eu;
-		evsel->attr.exclude_kernel = mod.ek;
-		evsel->attr.exclude_hv     = mod.eh;
-		evsel->attr.precise_ip     = mod.precise;
-		evsel->attr.exclude_host   = mod.eH;
-		evsel->attr.exclude_guest  = mod.eG;
-		evsel->attr.exclude_idle   = mod.eI;
-		evsel->exclude_GH          = mod.exclude_GH;
-		evsel->sample_read         = mod.sample_read;
-		evsel->precise_max         = mod.precise_max;
-		evsel->weak_group          = mod.weak;
-		evsel->bpf_counter         = mod.bpf_counter;
-
-		if (perf_evsel__is_group_leader(evsel)) {
-			evsel->attr.pinned = mod.pinned;
-			evsel->attr.exclusive = mod.exclusive;
-		}
-	}
-
-	return 0;
-}
-
 int parse_events_name(struct list_head *list, const char *name)
 {
 	struct evsel *evsel;
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 599ee3a760d7..78a8fa799b09 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -65,8 +65,6 @@ void parse_events__handle_error(struct parse_events_error *err, int idx,
 				char *str, char *help);
 void parse_events__shrink_config_terms(void);
 void parse_events__clear_array(struct parse_events_array *a);
-int parse_events__modifier_event(struct list_head *list, char *str, bool add, bool guest);
-int parse_events__modifier_group(struct list_head *list, char *event_mod, bool guest);
 int parse_events_name(struct list_head *list, const char *name);
 int parse_events_add_tracepoint(struct parse_events_state *parse_state,
 				struct list_head *list,
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 39/59] libperf: Move in parse_events__handle_error function
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (36 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 38/59] libperf: Move in parse_events__modifier_group/event functions Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 40/59] libperf: Move in parse_events_evlist_error function Jiri Olsa
                   ` (20 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving parse_events__handle_error function to libperf.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 .../lib/perf/include/internal/parse-events.h  |  2 ++
 tools/lib/perf/parse-events.c                 | 35 +++++++++++++++++++
 tools/perf/util/parse-events.c                | 33 -----------------
 tools/perf/util/parse-events.h                |  2 --
 4 files changed, 37 insertions(+), 35 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index 88195ae2eb10..9706ce11e2fd 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -132,4 +132,6 @@ perf_evsel__add_event(struct parse_events_state *parse_state,
 		      const char *cpu_list);
 int parse_events__modifier_event(struct list_head *list, char *str, bool add, bool guest);
 int parse_events__modifier_group(struct list_head *list, char *event_mod, bool guest);
+void parse_events__handle_error(struct parse_events_error *err, int idx,
+				char *str, char *help);
 #endif /* __LIBPERF_PARSE_EVENTS_H */
diff --git a/tools/lib/perf/parse-events.c b/tools/lib/perf/parse-events.c
index 3b93528f4569..d2d538f89ff9 100644
--- a/tools/lib/perf/parse-events.c
+++ b/tools/lib/perf/parse-events.c
@@ -11,6 +11,8 @@
 #include <perf/cpumap.h>
 #include <stdlib.h>
 #include <errno.h>
+#include <asm/bug.h>
+#include "internal.h"
 
 struct event_symbol event_symbols_hw[PERF_COUNT_HW_MAX] = {
 	[PERF_COUNT_HW_CPU_CYCLES] = {
@@ -536,3 +538,36 @@ int parse_events__modifier_group(struct list_head *list,
 {
 	return parse_events__modifier_event(list, event_mod, true, guest);
 }
+
+void parse_events__handle_error(struct parse_events_error *err, int idx,
+				char *str, char *help)
+{
+	if (WARN(!str, "WARNING: failed to provide error string\n")) {
+		free(help);
+		return;
+	}
+	switch (err->num_errors) {
+	case 0:
+		err->idx = idx;
+		err->str = str;
+		err->help = help;
+		break;
+	case 1:
+		err->first_idx = err->idx;
+		err->idx = idx;
+		err->first_str = err->str;
+		err->str = str;
+		err->first_help = err->help;
+		err->help = help;
+		break;
+	default:
+		pr_debug("Multiple errors dropping message: %s (%s)\n",
+			err->str, err->help);
+		free(err->str);
+		err->str = str;
+		free(err->help);
+		err->help = help;
+		break;
+	}
+	err->num_errors++;
+}
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index ecbb7f284158..8cc29dd8743a 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -116,39 +116,6 @@ static int tp_event_has_id(const char *dir_path, struct dirent *evt_dir)
 
 #define MAX_EVENT_LENGTH 512
 
-void parse_events__handle_error(struct parse_events_error *err, int idx,
-				char *str, char *help)
-{
-	if (WARN(!str, "WARNING: failed to provide error string\n")) {
-		free(help);
-		return;
-	}
-	switch (err->num_errors) {
-	case 0:
-		err->idx = idx;
-		err->str = str;
-		err->help = help;
-		break;
-	case 1:
-		err->first_idx = err->idx;
-		err->idx = idx;
-		err->first_str = err->str;
-		err->str = str;
-		err->first_help = err->help;
-		err->help = help;
-		break;
-	default:
-		pr_debug("Multiple errors dropping message: %s (%s)\n",
-			err->str, err->help);
-		free(err->str);
-		err->str = str;
-		free(err->help);
-		err->help = help;
-		break;
-	}
-	err->num_errors++;
-}
-
 struct tracepoint_path *tracepoint_id_to_path(u64 config)
 {
 	struct tracepoint_path *path = NULL;
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 78a8fa799b09..c058488ef8e2 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -61,8 +61,6 @@ struct perf_pmu_event_symbol {
 	enum perf_pmu_event_symbol_type	type;
 };
 
-void parse_events__handle_error(struct parse_events_error *err, int idx,
-				char *str, char *help);
 void parse_events__shrink_config_terms(void);
 void parse_events__clear_array(struct parse_events_array *a);
 int parse_events_name(struct list_head *list, const char *name);
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 40/59] libperf: Move in parse_events_evlist_error function
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (37 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 39/59] libperf: Move in parse_events__handle_error function Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 41/59] perf tools: Add perf_evsel__delete callback to struct parse_events_ops Jiri Olsa
                   ` (19 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving parse_events_evlist_error function to libperf.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/parse-events.h | 2 ++
 tools/lib/perf/parse-events.c                  | 9 +++++++++
 tools/perf/util/parse-events.c                 | 9 ---------
 tools/perf/util/parse-events.h                 | 2 --
 4 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index 9706ce11e2fd..13a7baf2f781 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -134,4 +134,6 @@ int parse_events__modifier_event(struct list_head *list, char *str, bool add, bo
 int parse_events__modifier_group(struct list_head *list, char *event_mod, bool guest);
 void parse_events__handle_error(struct parse_events_error *err, int idx,
 				char *str, char *help);
+void parse_events_evlist_error(struct parse_events_state *parse_state,
+			       int idx, const char *str);
 #endif /* __LIBPERF_PARSE_EVENTS_H */
diff --git a/tools/lib/perf/parse-events.c b/tools/lib/perf/parse-events.c
index d2d538f89ff9..07c89a3601b1 100644
--- a/tools/lib/perf/parse-events.c
+++ b/tools/lib/perf/parse-events.c
@@ -571,3 +571,12 @@ void parse_events__handle_error(struct parse_events_error *err, int idx,
 	}
 	err->num_errors++;
 }
+
+void parse_events_evlist_error(struct parse_events_state *parse_state,
+			       int idx, const char *str)
+{
+	if (!parse_state->error)
+		return;
+
+	parse_events__handle_error(parse_state->error, idx, strdup(str), NULL);
+}
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 8cc29dd8743a..5d4ad2179a48 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -2794,15 +2794,6 @@ void parse_events__clear_array(struct parse_events_array *a)
 	zfree(&a->ranges);
 }
 
-void parse_events_evlist_error(struct parse_events_state *parse_state,
-			       int idx, const char *str)
-{
-	if (!parse_state->error)
-		return;
-
-	parse_events__handle_error(parse_state->error, idx, strdup(str), NULL);
-}
-
 static void config_terms_list(char *buf, size_t buf_sz)
 {
 	int i;
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index c058488ef8e2..cc7c6449d423 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -116,8 +116,6 @@ enum perf_pmu_event_symbol_type
 perf_pmu__parse_check(const char *name);
 void parse_events__set_leader(char *name, struct list_head *list,
 			      struct parse_events_state *parse_state);
-void parse_events_evlist_error(struct parse_events_state *parse_state,
-			       int idx, const char *str);
 
 void print_events(const char *event_glob, bool name_only, bool quiet,
 		  bool long_desc, bool details_flag, bool deprecated,
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 41/59] perf tools: Add perf_evsel__delete callback to struct parse_events_ops
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (38 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 40/59] libperf: Move in parse_events_evlist_error function Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 42/59] libperf: Move in parse_events_name function Jiri Olsa
                   ` (18 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Adding perf_evsel__delete callback to struct parse_events_ops,
to allow custom event free for event parsing.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 .../lib/perf/include/internal/parse-events.h  |  1 +
 tools/perf/util/parse-events.c                |  8 ++++++
 tools/perf/util/parse-events.y                | 27 ++++++++++---------
 3 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index 13a7baf2f781..1d7ee03b8a80 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -88,6 +88,7 @@ struct parse_events_error {
 struct parse_events_ops {
 	struct perf_evsel* (*perf_evsel__new)(struct perf_event_attr *attr, int idx, bool init_attr);
 	struct perf_evsel* (*perf_evsel__new_tp)(const char *sys, const char *name, int idx);
+	void (*perf_evsel__delete)(struct perf_evsel *evsel);
 };
 
 struct parse_events_state {
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 5d4ad2179a48..0f2bf2b48888 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -74,9 +74,17 @@ static struct perf_evsel *perf_evsel__newtp_idx(const char *sys, const char *nam
 	return IS_ERR(evsel) ? (void*) evsel : &evsel->core;
 }
 
+static void perf_evsel__delete_helper(struct perf_evsel *evsel)
+{
+	struct evsel *tmp = container_of(evsel, struct evsel, core);
+
+	free(tmp);
+}
+
 static struct parse_events_ops parse_state_ops = {
 	.perf_evsel__new    = perf_evsel__new_idx,
 	.perf_evsel__new_tp = perf_evsel__newtp_idx,
+	.perf_evsel__delete = perf_evsel__delete_helper,
 };
 
 #define __PERF_EVENT_FIELD(config, name) \
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index d5cd2827b8a0..0ac863e06352 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -38,13 +38,14 @@ static struct list_head* alloc_list(void)
 	return list;
 }
 
-static void free_list_evsel(struct list_head* list_evsel)
+static void free_list_evsel(struct parse_events_state *parse_state,
+			    struct list_head* list_evsel)
 {
-	struct evsel *evsel, *tmp;
+	struct perf_evsel *evsel, *tmp;
 
-	list_for_each_entry_safe(evsel, tmp, list_evsel, core.node) {
-		list_del_init(&evsel->core.node);
-		evsel__delete(evsel);
+	list_for_each_entry_safe(evsel, tmp, list_evsel, node) {
+		list_del_init(&evsel->node);
+		parse_state->ops->perf_evsel__delete(evsel);
 	}
 	free(list_evsel);
 }
@@ -140,7 +141,7 @@ static int loc_val(void *loc_val_)
 %type <list_evsel> group_def
 %type <list_evsel> group
 %type <list_evsel> groups
-%destructor { free_list_evsel ($$); } <list_evsel>
+%destructor { free_list_evsel (_parse_state, $$); } <list_evsel>
 %type <tracepoint_name> tracepoint_name
 %destructor { free ($$.sys); free ($$.event); } <tracepoint_name>
 %type <array> array
@@ -215,7 +216,7 @@ group_def ':' PE_MODIFIER_EVENT
 
 		parse_events__handle_error(error, @3.first_column,
 					   strdup("Bad modifier"), NULL);
-		free_list_evsel(list);
+		free_list_evsel(parse_state, list);
 		YYABORT;
 	}
 	$$ = list;
@@ -277,7 +278,7 @@ event_name PE_MODIFIER_EVENT
 
 		parse_events__handle_error(error, @2.first_column,
 					   strdup("Bad modifier"), NULL);
-		free_list_evsel(list);
+		free_list_evsel(parse_state, list);
 		YYABORT;
 	}
 	$$ = list;
@@ -293,7 +294,7 @@ PE_EVENT_NAME event_def
 	err = parse_events_name($2, $1);
 	free($1);
 	if (err) {
-		free_list_evsel($2);
+		free_list_evsel(_parse_state, $2);
 		YYABORT;
 	}
 	$$ = $2;
@@ -467,7 +468,7 @@ value_sym '/' event_config '/'
 	err = parse_events_add_numeric(_parse_state, list, type, config, $3);
 	parse_events_terms__delete($3);
 	if (err) {
-		free_list_evsel(list);
+		free_list_evsel(_parse_state, list);
 		YYABORT;
 	}
 	$$ = list;
@@ -511,7 +512,7 @@ PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT opt_e
 	free($3);
 	free($5);
 	if (err) {
-		free_list_evsel(list);
+		free_list_evsel(parse_state, list);
 		YYABORT;
 	}
 	$$ = list;
@@ -531,7 +532,7 @@ PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT opt_event_config
 	free($1);
 	free($3);
 	if (err) {
-		free_list_evsel(list);
+		free_list_evsel(parse_state, list);
 		YYABORT;
 	}
 	$$ = list;
@@ -550,7 +551,7 @@ PE_NAME_CACHE_TYPE opt_event_config
 	parse_events_terms__delete($2);
 	free($1);
 	if (err) {
-		free_list_evsel(list);
+		free_list_evsel(parse_state, list);
 		YYABORT;
 	}
 	$$ = list;
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 42/59] libperf: Move in parse_events_name function
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (39 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 41/59] perf tools: Add perf_evsel__delete callback to struct parse_events_ops Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 18:23   ` Ian Rogers
  2021-11-08 13:36 ` [PATCH 43/59] perf tools: Move out parse_events_add_pmu fallback from parser code Jiri Olsa
                   ` (17 subsequent siblings)
  58 siblings, 1 reply; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving parse_events_name function to libperf.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/parse-events.h |  1 +
 tools/lib/perf/parse-events.c                  | 12 ++++++++++++
 tools/perf/util/parse-events.c                 | 12 ------------
 tools/perf/util/parse-events.h                 |  1 -
 4 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index 1d7ee03b8a80..11a85a118480 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -137,4 +137,5 @@ void parse_events__handle_error(struct parse_events_error *err, int idx,
 				char *str, char *help);
 void parse_events_evlist_error(struct parse_events_state *parse_state,
 			       int idx, const char *str);
+int parse_events_name(struct list_head *list, const char *name);
 #endif /* __LIBPERF_PARSE_EVENTS_H */
diff --git a/tools/lib/perf/parse-events.c b/tools/lib/perf/parse-events.c
index 07c89a3601b1..6efc2bb73cdf 100644
--- a/tools/lib/perf/parse-events.c
+++ b/tools/lib/perf/parse-events.c
@@ -580,3 +580,15 @@ void parse_events_evlist_error(struct parse_events_state *parse_state,
 
 	parse_events__handle_error(parse_state->error, idx, strdup(str), NULL);
 }
+
+int parse_events_name(struct list_head *list, const char *name)
+{
+	struct perf_evsel *evsel;
+
+	__perf_evlist__for_each_entry(list, evsel) {
+		if (!evsel->name)
+			evsel->name = strdup(name);
+	}
+
+	return 0;
+}
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 0f2bf2b48888..1469bdf88f2b 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1721,18 +1721,6 @@ void parse_events__set_leader(char *name, struct list_head *list,
 	leader->core.group_name = name ? strdup(name) : NULL;
 }
 
-int parse_events_name(struct list_head *list, const char *name)
-{
-	struct evsel *evsel;
-
-	__evlist__for_each_entry(list, evsel) {
-		if (!evsel->core.name)
-			evsel->core.name = strdup(name);
-	}
-
-	return 0;
-}
-
 static int
 comp_pmu(const void *p1, const void *p2)
 {
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index cc7c6449d423..5530614e7a10 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -63,7 +63,6 @@ struct perf_pmu_event_symbol {
 
 void parse_events__shrink_config_terms(void);
 void parse_events__clear_array(struct parse_events_array *a);
-int parse_events_name(struct list_head *list, const char *name);
 int parse_events_add_tracepoint(struct parse_events_state *parse_state,
 				struct list_head *list,
 				const char *sys, const char *event,
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 43/59] perf tools: Move out parse_events_add_pmu fallback from parser code
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (40 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 42/59] libperf: Move in parse_events_name function Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 44/59] perf tools: Add add_pmu callback to struct parse_events_ops Jiri Olsa
                   ` (16 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving out parse_events_add_pmu fallback from parser code
into parse_events_add_pmu, so we can easily move parser
code to libperf later.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/parse-events.c | 60 +++++++++++++++++++++++++++++-----
 tools/perf/util/parse-events.h |  1 +
 tools/perf/util/parse-events.y | 37 +++------------------
 3 files changed, 58 insertions(+), 40 deletions(-)

diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 1469bdf88f2b..57f59253322d 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1396,11 +1396,11 @@ static int parse_events__inside_hybrid_pmu(struct parse_events_state *parse_stat
 	return ret;
 }
 
-int parse_events_add_pmu(struct parse_events_state *parse_state,
-			 struct list_head *list, char *name,
-			 struct list_head *head_config,
-			 bool auto_merge_stats,
-			 bool use_alias)
+static int __parse_events_add_pmu(struct parse_events_state *parse_state,
+				  struct list_head *list, char *name,
+				  struct list_head *head_config,
+				  bool auto_merge_stats,
+				  bool use_alias)
 {
 	struct perf_event_attr attr;
 	struct perf_pmu_info info;
@@ -1528,6 +1528,50 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
 	return 0;
 }
 
+int parse_events_add_pmu(struct parse_events_state *parse_state,
+			 struct list_head *list, char *pmu_name,
+			 struct list_head *head_config,
+			 struct list_head *orig_terms,
+			 bool auto_merge_stats,
+			 bool use_alias)
+{
+	int err;
+
+	err = __parse_events_add_pmu(parse_state, list, pmu_name, head_config,
+				     auto_merge_stats, use_alias);
+	if (err && orig_terms) {
+		struct list_head *terms;
+		struct perf_pmu *pmu = NULL;
+		char *pattern = NULL;
+		int ok = 0;
+
+		if (asprintf(&pattern, "%s*", pmu_name) < 0)
+			return -1;
+
+		while ((pmu = perf_pmu__scan(pmu)) != NULL) {
+			char *name = pmu->name;
+
+			if (!strncmp(name, "uncore_", 7) &&
+			    strncmp(pmu_name, "uncore_", 7))
+				name += 7;
+			if (!perf_pmu__match(pattern, name, pmu_name) ||
+			    !perf_pmu__match(pattern, pmu->alias_name, pmu_name)) {
+				if (parse_events_copy_term_list(orig_terms, &terms)) {
+					free(pattern);
+					return -1;
+				}
+				if (!__parse_events_add_pmu(parse_state, list, pmu->name, terms, true, false))
+					ok++;
+				parse_events_terms__delete(terms);
+			}
+		}
+		free(pattern);
+		if (!ok)
+			return -1;
+	}
+	return err;
+}
+
 int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
 			       char *str, struct list_head *head,
 			       struct list_head **listp)
@@ -1572,9 +1616,9 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
 
 		list_for_each_entry(alias, &pmu->aliases, list) {
 			if (!strcasecmp(alias->name, str)) {
-				if (!parse_events_add_pmu(parse_state, list,
-							  pmu->name, head,
-							  true, true)) {
+				if (!__parse_events_add_pmu(parse_state, list,
+							    pmu->name, head,
+							    true, true)) {
 					pr_debug("%s -> %s/%s/\n", str,
 						 pmu->name, alias->str);
 					ok++;
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 5530614e7a10..74bf778400a9 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -97,6 +97,7 @@ int parse_events_add_breakpoint(struct parse_events_state *parse_state,
 int parse_events_add_pmu(struct parse_events_state *parse_state,
 			 struct list_head *list, char *name,
 			 struct list_head *head_config,
+			 struct list_head *orig_terms,
 			 bool auto_merge_stats,
 			 bool use_alias);
 
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 0ac863e06352..b963c023bd40 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -319,8 +319,7 @@ event_pmu_name opt_pmu_config
 {
 	struct parse_events_state *parse_state = _parse_state;
 	struct parse_events_error *error = parse_state->error;
-	struct list_head *list = NULL, *orig_terms = NULL, *terms= NULL;
-	char *pattern = NULL;
+	struct list_head *list = NULL, *orig_terms = NULL;
 
 #define CLEANUP_YYABORT					\
 	do {						\
@@ -328,7 +327,6 @@ event_pmu_name opt_pmu_config
 		parse_events_terms__delete(orig_terms);	\
 		free(list);				\
 		free($1);				\
-		free(pattern);				\
 		YYABORT;				\
 	} while(0)
 
@@ -341,35 +339,10 @@ event_pmu_name opt_pmu_config
 	list = alloc_list();
 	if (!list)
 		CLEANUP_YYABORT;
-	if (parse_events_add_pmu(_parse_state, list, $1, $2, false, false)) {
-		struct perf_pmu *pmu = NULL;
-		int ok = 0;
-
-		if (asprintf(&pattern, "%s*", $1) < 0)
-			CLEANUP_YYABORT;
-
-		while ((pmu = perf_pmu__scan(pmu)) != NULL) {
-			char *name = pmu->name;
-
-			if (!strncmp(name, "uncore_", 7) &&
-			    strncmp($1, "uncore_", 7))
-				name += 7;
-			if (!perf_pmu__match(pattern, name, $1) ||
-			    !perf_pmu__match(pattern, pmu->alias_name, $1)) {
-				if (parse_events_copy_term_list(orig_terms, &terms))
-					CLEANUP_YYABORT;
-				if (!parse_events_add_pmu(_parse_state, list, pmu->name, terms, true, false))
-					ok++;
-				parse_events_terms__delete(terms);
-			}
-		}
-
-		if (!ok)
-			CLEANUP_YYABORT;
-	}
+	if (parse_events_add_pmu(_parse_state, list, $1, $2, orig_terms, false, false))
+		CLEANUP_YYABORT;
 	parse_events_terms__delete($2);
 	parse_events_terms__delete(orig_terms);
-	free(pattern);
 	free($1);
 	$$ = list;
 #undef CLEANUP_YYABORT
@@ -422,7 +395,7 @@ PE_PMU_EVENT_FAKE sep_dc
 	if (!list)
 		YYABORT;
 
-	err = parse_events_add_pmu(_parse_state, list, $1, NULL, false, false);
+	err = parse_events_add_pmu(_parse_state, list, $1, NULL, NULL, false, false);
 	free($1);
 	if (err < 0) {
 		free(list);
@@ -440,7 +413,7 @@ PE_PMU_EVENT_FAKE opt_pmu_config
 	if (!list)
 		YYABORT;
 
-	err = parse_events_add_pmu(_parse_state, list, $1, $2, false, false);
+	err = parse_events_add_pmu(_parse_state, list, $1, $2, NULL, false, false);
 	free($1);
 	parse_events_terms__delete($2);
 	if (err < 0) {
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 44/59] perf tools: Add add_pmu callback to struct parse_events_ops
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (41 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 43/59] perf tools: Move out parse_events_add_pmu fallback from parser code Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 45/59] perf tools: Add add_pmu_multi " Jiri Olsa
                   ` (15 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Adding add_pmu callback to struct parse_events_ops,
to allow custom pmu parsing code.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/parse-events.h |  9 +++++++++
 tools/perf/util/parse-events.c                 | 15 +++++++++------
 tools/perf/util/parse-events.h                 |  6 ------
 tools/perf/util/parse-events.y                 |  8 +++++---
 4 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index 11a85a118480..6733068879a7 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -85,10 +85,19 @@ struct parse_events_error {
 	char *first_help;
 };
 
+struct parse_events_state;
+
 struct parse_events_ops {
 	struct perf_evsel* (*perf_evsel__new)(struct perf_event_attr *attr, int idx, bool init_attr);
 	struct perf_evsel* (*perf_evsel__new_tp)(const char *sys, const char *name, int idx);
 	void (*perf_evsel__delete)(struct perf_evsel *evsel);
+
+	int (*add_pmu)(struct parse_events_state *parse_state,
+		       struct list_head *list, char *pmu_name,
+		       struct list_head *head_config,
+		       struct list_head *orig_terms,
+		       bool auto_merge_stats,
+		       bool use_alias);
 };
 
 struct parse_events_state {
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 57f59253322d..78f10083f917 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -51,6 +51,7 @@ static int parse_events__with_hybrid_pmu(struct parse_events_state *parse_state,
 					 const char *str, char *pmu_name,
 					 struct list_head *list);
 
+static struct parse_events_ops parse_state_ops;
 static struct perf_pmu_event_symbol *perf_pmu_events_list;
 /*
  * The variable indicates the number of supported pmu event symbols.
@@ -81,12 +82,6 @@ static void perf_evsel__delete_helper(struct perf_evsel *evsel)
 	free(tmp);
 }
 
-static struct parse_events_ops parse_state_ops = {
-	.perf_evsel__new    = perf_evsel__new_idx,
-	.perf_evsel__new_tp = perf_evsel__newtp_idx,
-	.perf_evsel__delete = perf_evsel__delete_helper,
-};
-
 #define __PERF_EVENT_FIELD(config, name) \
 	((config & PERF_EVENT_##name##_MASK) >> PERF_EVENT_##name##_SHIFT)
 
@@ -1528,6 +1523,7 @@ static int __parse_events_add_pmu(struct parse_events_state *parse_state,
 	return 0;
 }
 
+static
 int parse_events_add_pmu(struct parse_events_state *parse_state,
 			 struct list_head *list, char *pmu_name,
 			 struct list_head *head_config,
@@ -2900,3 +2896,10 @@ struct evsel *parse_events__add_event_hybrid(struct parse_events_state *parse_st
 				pmu, config_terms, /*auto_merge_stats=*/false,
 				/*cpu_list=*/NULL);
 }
+
+static struct parse_events_ops parse_state_ops = {
+	.perf_evsel__new    = perf_evsel__new_idx,
+	.perf_evsel__new_tp = perf_evsel__newtp_idx,
+	.perf_evsel__delete = perf_evsel__delete_helper,
+	.add_pmu            = parse_events_add_pmu,
+};
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 74bf778400a9..d1057942825d 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -94,12 +94,6 @@ int parse_events_add_cache(struct parse_events_state *parse_state,
 int parse_events_add_breakpoint(struct parse_events_state *parse_state,
 				struct list_head *list,
 				u64 addr, char *type, u64 len);
-int parse_events_add_pmu(struct parse_events_state *parse_state,
-			 struct list_head *list, char *name,
-			 struct list_head *head_config,
-			 struct list_head *orig_terms,
-			 bool auto_merge_stats,
-			 bool use_alias);
 
 struct evsel *parse_events__add_event(struct parse_events_state *parse_state,
 				      struct perf_event_attr *attr,
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index b963c023bd40..5c57c8424323 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -339,7 +339,7 @@ event_pmu_name opt_pmu_config
 	list = alloc_list();
 	if (!list)
 		CLEANUP_YYABORT;
-	if (parse_events_add_pmu(_parse_state, list, $1, $2, orig_terms, false, false))
+	if (parse_state->ops->add_pmu(parse_state, list, $1, $2, orig_terms, false, false))
 		CLEANUP_YYABORT;
 	parse_events_terms__delete($2);
 	parse_events_terms__delete(orig_terms);
@@ -388,6 +388,7 @@ PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc
 |
 PE_PMU_EVENT_FAKE sep_dc
 {
+	struct parse_events_state *parse_state = _parse_state;
 	struct list_head *list;
 	int err;
 
@@ -395,7 +396,7 @@ PE_PMU_EVENT_FAKE sep_dc
 	if (!list)
 		YYABORT;
 
-	err = parse_events_add_pmu(_parse_state, list, $1, NULL, NULL, false, false);
+	err = parse_state->ops->add_pmu(parse_state, list, $1, NULL, NULL, false, false);
 	free($1);
 	if (err < 0) {
 		free(list);
@@ -406,6 +407,7 @@ PE_PMU_EVENT_FAKE sep_dc
 |
 PE_PMU_EVENT_FAKE opt_pmu_config
 {
+	struct parse_events_state *parse_state = _parse_state;
 	struct list_head *list;
 	int err;
 
@@ -413,7 +415,7 @@ PE_PMU_EVENT_FAKE opt_pmu_config
 	if (!list)
 		YYABORT;
 
-	err = parse_events_add_pmu(_parse_state, list, $1, $2, NULL, false, false);
+	err = parse_state->ops->add_pmu(parse_state, list, $1, $2, NULL, false, false);
 	free($1);
 	parse_events_terms__delete($2);
 	if (err < 0) {
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 45/59] perf tools: Add add_pmu_multi callback to struct parse_events_ops
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (42 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 44/59] perf tools: Add add_pmu callback to struct parse_events_ops Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 46/59] perf tools: Add add_numeric " Jiri Olsa
                   ` (14 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Adding add_pmu_multi callback to struct parse_events_ops,
to allow custom multi pmu parsing code.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/parse-events.h | 4 ++++
 tools/perf/util/parse-events.c                 | 2 ++
 tools/perf/util/parse-events.h                 | 6 ------
 tools/perf/util/parse-events.y                 | 9 ++++++---
 4 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index 6733068879a7..78dd3f989346 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -98,6 +98,10 @@ struct parse_events_ops {
 		       struct list_head *orig_terms,
 		       bool auto_merge_stats,
 		       bool use_alias);
+
+	int (*add_pmu_multi)(struct parse_events_state *parse_state,
+			     char *str, struct list_head *head,
+			     struct list_head **listp);
 };
 
 struct parse_events_state {
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 78f10083f917..c67634c9de0d 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1568,6 +1568,7 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
 	return err;
 }
 
+static
 int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
 			       char *str, struct list_head *head,
 			       struct list_head **listp)
@@ -2902,4 +2903,5 @@ static struct parse_events_ops parse_state_ops = {
 	.perf_evsel__new_tp = perf_evsel__newtp_idx,
 	.perf_evsel__delete = perf_evsel__delete_helper,
 	.add_pmu            = parse_events_add_pmu,
+	.add_pmu_multi      = parse_events_multi_pmu_add,
 };
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index d1057942825d..fa03f8f70f33 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -100,12 +100,6 @@ struct evsel *parse_events__add_event(struct parse_events_state *parse_state,
 				      const char *name, const char *metric_id,
 				      struct perf_pmu *pmu);
 
-int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
-			       char *str,
-			       struct list_head *head_config,
-			       struct list_head **listp);
-
-
 enum perf_pmu_event_symbol_type
 perf_pmu__parse_check(const char *name);
 void parse_events__set_leader(char *name, struct list_head *list,
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 5c57c8424323..f903690b3c8a 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -350,10 +350,11 @@ event_pmu_name opt_pmu_config
 |
 PE_KERNEL_PMU_EVENT sep_dc
 {
+	struct parse_events_state *parse_state = _parse_state;
 	struct list_head *list;
 	int err;
 
-	err = parse_events_multi_pmu_add(_parse_state, $1, NULL, &list);
+	err = parse_state->ops->add_pmu_multi(parse_state, $1, NULL, &list);
 	free($1);
 	if (err < 0)
 		YYABORT;
@@ -362,11 +363,12 @@ PE_KERNEL_PMU_EVENT sep_dc
 |
 PE_KERNEL_PMU_EVENT opt_pmu_config
 {
+	struct parse_events_state *parse_state = _parse_state;
 	struct list_head *list;
 	int err;
 
 	/* frees $2 */
-	err = parse_events_multi_pmu_add(_parse_state, $1, $2, &list);
+	err = parse_state->ops->add_pmu_multi(_parse_state, $1, $2, &list);
 	free($1);
 	if (err < 0)
 		YYABORT;
@@ -375,13 +377,14 @@ PE_KERNEL_PMU_EVENT opt_pmu_config
 |
 PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc
 {
+	struct parse_events_state *parse_state = _parse_state;
 	struct list_head *list;
 	char pmu_name[128];
 
 	snprintf(pmu_name, sizeof(pmu_name), "%s-%s", $1, $3);
 	free($1);
 	free($3);
-	if (parse_events_multi_pmu_add(_parse_state, pmu_name, NULL, &list) < 0)
+	if (parse_state->ops->add_pmu_multi(_parse_state, pmu_name, NULL, &list) < 0)
 		YYABORT;
 	$$ = list;
 }
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 46/59] perf tools: Add add_numeric callback to struct parse_events_ops
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (43 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 45/59] perf tools: Add add_pmu_multi " Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 18:27   ` Ian Rogers
  2021-11-08 13:36 ` [PATCH 47/59] perf tools: Add add_cache " Jiri Olsa
                   ` (13 subsequent siblings)
  58 siblings, 1 reply; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Adding add_numeric callback to struct parse_events_ops,
to allow custom numeric parsing code.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/parse-events.h |  5 +++++
 tools/perf/util/parse-events.c                 |  2 ++
 tools/perf/util/parse-events.h                 |  4 ----
 tools/perf/util/parse-events.y                 | 12 ++++++++----
 4 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index 78dd3f989346..cbcf799f8969 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -102,6 +102,11 @@ struct parse_events_ops {
 	int (*add_pmu_multi)(struct parse_events_state *parse_state,
 			     char *str, struct list_head *head,
 			     struct list_head **listp);
+
+	int (*add_numeric)(struct parse_events_state *parse_state,
+			   struct list_head *list,
+			   u32 type, u64 config,
+			   struct list_head *head_config);
 };
 
 struct parse_events_state {
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index c67634c9de0d..a05e1bdb4e60 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1306,6 +1306,7 @@ int parse_events_add_tracepoint(struct parse_events_state *parse_state,
 					    err, head_config);
 }
 
+static
 int parse_events_add_numeric(struct parse_events_state *parse_state,
 			     struct list_head *list,
 			     u32 type, u64 config,
@@ -2904,4 +2905,5 @@ static struct parse_events_ops parse_state_ops = {
 	.perf_evsel__delete = perf_evsel__delete_helper,
 	.add_pmu            = parse_events_add_pmu,
 	.add_pmu_multi      = parse_events_multi_pmu_add,
+	.add_numeric        = parse_events_add_numeric,
 };
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index fa03f8f70f33..40d192cace03 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -79,10 +79,6 @@ int parse_events_load_bpf_obj(struct parse_events_state *parse_state,
 			      struct list_head *list,
 			      struct bpf_object *obj,
 			      struct list_head *head_config);
-int parse_events_add_numeric(struct parse_events_state *parse_state,
-			     struct list_head *list,
-			     u32 type, u64 config,
-			     struct list_head *head_config);
 int parse_events_add_tool(struct parse_events_state *parse_state,
 			  struct list_head *list,
 			  int tool_event);
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index f903690b3c8a..b23691397374 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -436,6 +436,7 @@ PE_VALUE_SYM_SW
 event_legacy_symbol:
 value_sym '/' event_config '/'
 {
+	struct parse_events_state *parse_state = _parse_state;
 	struct list_head *list;
 	int type = $1 >> 16;
 	int config = $1 & 255;
@@ -443,7 +444,7 @@ value_sym '/' event_config '/'
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	err = parse_events_add_numeric(_parse_state, list, type, config, $3);
+	err = parse_state->ops->add_numeric(parse_state, list, type, config, $3);
 	parse_events_terms__delete($3);
 	if (err) {
 		free_list_evsel(_parse_state, list);
@@ -454,13 +455,14 @@ value_sym '/' event_config '/'
 |
 value_sym sep_slash_slash_dc
 {
+	struct parse_events_state *parse_state = _parse_state;
 	struct list_head *list;
 	int type = $1 >> 16;
 	int config = $1 & 255;
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config, NULL));
+	ABORT_ON(parse_state->ops->add_numeric(parse_state, list, type, config, NULL));
 	$$ = list;
 }
 |
@@ -646,12 +648,13 @@ PE_NAME ':' PE_NAME
 event_legacy_numeric:
 PE_VALUE ':' PE_VALUE opt_event_config
 {
+	struct parse_events_state *parse_state = _parse_state;
 	struct list_head *list;
 	int err;
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	err = parse_events_add_numeric(_parse_state, list, (u32)$1, $3, $4);
+	err = parse_state->ops->add_numeric(_parse_state, list, (u32)$1, $3, $4);
 	parse_events_terms__delete($4);
 	if (err) {
 		free(list);
@@ -663,12 +666,13 @@ PE_VALUE ':' PE_VALUE opt_event_config
 event_legacy_raw:
 PE_RAW opt_event_config
 {
+	struct parse_events_state *parse_state = _parse_state;
 	struct list_head *list;
 	int err;
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	err = parse_events_add_numeric(_parse_state, list, PERF_TYPE_RAW, $1, $2);
+	err = parse_state->ops->add_numeric(_parse_state, list, PERF_TYPE_RAW, $1, $2);
 	parse_events_terms__delete($2);
 	if (err) {
 		free(list);
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 47/59] perf tools: Add add_cache callback to struct parse_events_ops
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (44 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 46/59] perf tools: Add add_numeric " Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:36 ` [PATCH 48/59] perf tools: Add add_breakpoint " Jiri Olsa
                   ` (12 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Adding add_cache callback to struct parse_events_ops,
to allow custom cache parsing code.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/parse-events.h | 6 ++++++
 tools/perf/util/parse-events.c                 | 2 ++
 tools/perf/util/parse-events.h                 | 5 -----
 tools/perf/util/parse-events.y                 | 6 +++---
 4 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index cbcf799f8969..bc938cddb3d7 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -107,6 +107,12 @@ struct parse_events_ops {
 			   struct list_head *list,
 			   u32 type, u64 config,
 			   struct list_head *head_config);
+
+	int (*add_cache)(struct parse_events_state *parse_state,
+			 struct list_head *list,
+			 char *type, char *op_result1, char *op_result2,
+			 struct parse_events_error *err,
+			 struct list_head *head_config);
 };
 
 struct parse_events_state {
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index a05e1bdb4e60..6bffb67f8c24 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -339,6 +339,7 @@ static int config_attr(struct perf_event_attr *attr,
 		       struct parse_events_error *err,
 		       config_term_func_t config_term);
 
+static
 int parse_events_add_cache(struct parse_events_state *parse_state,
 			   struct list_head *list,
 			   char *type, char *op_result1, char *op_result2,
@@ -2906,4 +2907,5 @@ static struct parse_events_ops parse_state_ops = {
 	.add_pmu            = parse_events_add_pmu,
 	.add_pmu_multi      = parse_events_multi_pmu_add,
 	.add_numeric        = parse_events_add_numeric,
+	.add_cache          = parse_events_add_cache,
 };
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 40d192cace03..91c3f5bdf434 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -82,11 +82,6 @@ int parse_events_load_bpf_obj(struct parse_events_state *parse_state,
 int parse_events_add_tool(struct parse_events_state *parse_state,
 			  struct list_head *list,
 			  int tool_event);
-int parse_events_add_cache(struct parse_events_state *parse_state,
-			   struct list_head *list,
-			   char *type, char *op_result1, char *op_result2,
-			   struct parse_events_error *error,
-			   struct list_head *head_config);
 int parse_events_add_breakpoint(struct parse_events_state *parse_state,
 				struct list_head *list,
 				u64 addr, char *type, u64 len);
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index b23691397374..6dcd1e1677e9 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -486,7 +486,7 @@ PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT opt_e
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	err = parse_events_add_cache(parse_state, list, $1, $3, $5, error, $6);
+	err = parse_state->ops->add_cache(parse_state, list, $1, $3, $5, error, $6);
 	parse_events_terms__delete($6);
 	free($1);
 	free($3);
@@ -507,7 +507,7 @@ PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT opt_event_config
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	err = parse_events_add_cache(parse_state, list, $1, $3, NULL, error, $4);
+	err = parse_state->ops->add_cache(parse_state, list, $1, $3, NULL, error, $4);
 	parse_events_terms__delete($4);
 	free($1);
 	free($3);
@@ -527,7 +527,7 @@ PE_NAME_CACHE_TYPE opt_event_config
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	err = parse_events_add_cache(parse_state, list, $1, NULL, NULL, error, $2);
+	err = parse_state->ops->add_cache(parse_state, list, $1, NULL, NULL, error, $2);
 	parse_events_terms__delete($2);
 	free($1);
 	if (err) {
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 48/59] perf tools: Add add_breakpoint callback to struct parse_events_ops
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (45 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 47/59] perf tools: Add add_cache " Jiri Olsa
@ 2021-11-08 13:36 ` Jiri Olsa
  2021-11-08 13:37 ` [PATCH 49/59] perf tools: Add add_tracepoint " Jiri Olsa
                   ` (11 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:36 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Adding add_breakpoint callback to struct parse_events_ops,
to allow custom breakpoint parsing code.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/parse-events.h | 4 ++++
 tools/perf/util/parse-events.c                 | 2 ++
 tools/perf/util/parse-events.h                 | 3 ---
 tools/perf/util/parse-events.y                 | 8 ++++----
 4 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index bc938cddb3d7..9a30155d628b 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -113,6 +113,10 @@ struct parse_events_ops {
 			 char *type, char *op_result1, char *op_result2,
 			 struct parse_events_error *err,
 			 struct list_head *head_config);
+
+	int (*add_breakpoint)(struct parse_events_state *parse_state,
+			      struct list_head *list,
+			      u64 addr, char *type, u64 len);
 };
 
 struct parse_events_state {
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 6bffb67f8c24..0b033c8a852a 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -884,6 +884,7 @@ do {					\
 	return 0;
 }
 
+static
 int parse_events_add_breakpoint(struct parse_events_state *parse_state,
 				struct list_head *list,
 				u64 addr, char *type, u64 len)
@@ -2908,4 +2909,5 @@ static struct parse_events_ops parse_state_ops = {
 	.add_pmu_multi      = parse_events_multi_pmu_add,
 	.add_numeric        = parse_events_add_numeric,
 	.add_cache          = parse_events_add_cache,
+	.add_breakpoint     = parse_events_add_breakpoint,
 };
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 91c3f5bdf434..6bd3ab01f063 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -82,9 +82,6 @@ int parse_events_load_bpf_obj(struct parse_events_state *parse_state,
 int parse_events_add_tool(struct parse_events_state *parse_state,
 			  struct list_head *list,
 			  int tool_event);
-int parse_events_add_breakpoint(struct parse_events_state *parse_state,
-				struct list_head *list,
-				u64 addr, char *type, u64 len);
 
 struct evsel *parse_events__add_event(struct parse_events_state *parse_state,
 				      struct perf_event_attr *attr,
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 6dcd1e1677e9..1e43e6839278 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -546,7 +546,7 @@ PE_PREFIX_MEM PE_VALUE '/' PE_VALUE ':' PE_MODIFIER_BP sep_dc
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	err = parse_events_add_breakpoint(parse_state, list, $2, $6, $4);
+	err = parse_state->ops->add_breakpoint(parse_state, list, $2, $6, $4);
 	free($6);
 	if (err) {
 		free(list);
@@ -562,7 +562,7 @@ PE_PREFIX_MEM PE_VALUE '/' PE_VALUE sep_dc
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	if (parse_events_add_breakpoint(parse_state, list, $2, NULL, $4)) {
+	if (parse_state->ops->add_breakpoint(parse_state, list, $2, NULL, $4)) {
 		free(list);
 		YYABORT;
 	}
@@ -577,7 +577,7 @@ PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	err = parse_events_add_breakpoint(parse_state, list, $2, $4, 0);
+	err = parse_state->ops->add_breakpoint(parse_state, list, $2, $4, 0);
 	free($4);
 	if (err) {
 		free(list);
@@ -593,7 +593,7 @@ PE_PREFIX_MEM PE_VALUE sep_dc
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	if (parse_events_add_breakpoint(parse_state, list, $2, NULL, 0)) {
+	if (parse_state->ops->add_breakpoint(parse_state, list, $2, NULL, 0)) {
 		free(list);
 		YYABORT;
 	}
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 49/59] perf tools: Add add_tracepoint callback to struct parse_events_ops
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (46 preceding siblings ...)
  2021-11-08 13:36 ` [PATCH 48/59] perf tools: Add add_breakpoint " Jiri Olsa
@ 2021-11-08 13:37 ` Jiri Olsa
  2021-11-08 13:37 ` [PATCH 50/59] perf tools: Add add_bpf " Jiri Olsa
                   ` (10 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:37 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Adding add_tracepoint callback to struct parse_events_ops,
to allow custom tracepoint parsing code.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/parse-events.h | 6 ++++++
 tools/perf/util/parse-events.c                 | 8 ++++++++
 tools/perf/util/parse-events.h                 | 5 -----
 tools/perf/util/parse-events.y                 | 4 ++--
 4 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index 9a30155d628b..f06c86630fda 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -117,6 +117,12 @@ struct parse_events_ops {
 	int (*add_breakpoint)(struct parse_events_state *parse_state,
 			      struct list_head *list,
 			      u64 addr, char *type, u64 len);
+
+	int (*add_tracepoint)(struct parse_events_state *parse_state,
+			      struct list_head *list,
+			      const char *sys, const char *event,
+			      struct parse_events_error *err,
+			      struct list_head *head_config);
 };
 
 struct parse_events_state {
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 0b033c8a852a..ad2bec6e6b37 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -50,6 +50,12 @@ static int get_config_terms(struct list_head *head_config,
 static int parse_events__with_hybrid_pmu(struct parse_events_state *parse_state,
 					 const char *str, char *pmu_name,
 					 struct list_head *list);
+static
+int parse_events_add_tracepoint(struct parse_events_state *parse_state,
+				struct list_head *list,
+				const char *sys, const char *event,
+				struct parse_events_error *err,
+				struct list_head *head_config);
 
 static struct parse_events_ops parse_state_ops;
 static struct perf_pmu_event_symbol *perf_pmu_events_list;
@@ -1286,6 +1292,7 @@ static int get_config_chgs(struct perf_pmu *pmu, struct list_head *head_config,
 	return 0;
 }
 
+static
 int parse_events_add_tracepoint(struct parse_events_state *parse_state,
 				struct list_head *list,
 				const char *sys, const char *event,
@@ -2910,4 +2917,5 @@ static struct parse_events_ops parse_state_ops = {
 	.add_numeric        = parse_events_add_numeric,
 	.add_cache          = parse_events_add_cache,
 	.add_breakpoint     = parse_events_add_breakpoint,
+	.add_tracepoint     = parse_events_add_tracepoint,
 };
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 6bd3ab01f063..328612945503 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -63,11 +63,6 @@ struct perf_pmu_event_symbol {
 
 void parse_events__shrink_config_terms(void);
 void parse_events__clear_array(struct parse_events_array *a);
-int parse_events_add_tracepoint(struct parse_events_state *parse_state,
-				struct list_head *list,
-				const char *sys, const char *event,
-				struct parse_events_error *error,
-				struct list_head *head_config);
 int parse_events_load_bpf(struct parse_events_state *parse_state,
 			  struct list_head *list,
 			  char *bpf_file_name,
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 1e43e6839278..34915b81a7f1 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -613,8 +613,8 @@ tracepoint_name opt_event_config
 	if (error)
 		error->idx = @1.first_column;
 
-	err = parse_events_add_tracepoint(parse_state, list, $1.sys, $1.event,
-					error, $2);
+	err = parse_state->ops->add_tracepoint(parse_state, list, $1.sys, $1.event,
+					       error, $2);
 
 	parse_events_terms__delete($2);
 	free($1.sys);
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 50/59] perf tools: Add add_bpf callback to struct parse_events_ops
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (47 preceding siblings ...)
  2021-11-08 13:37 ` [PATCH 49/59] perf tools: Add add_tracepoint " Jiri Olsa
@ 2021-11-08 13:37 ` Jiri Olsa
  2021-11-08 13:37 ` [PATCH 51/59] perf tools: Add add_tool " Jiri Olsa
                   ` (9 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:37 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Adding add_bpf callback to struct parse_events_ops,
to allow custom bpf parsing code.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/parse-events.h | 6 ++++++
 tools/perf/util/parse-events.c                 | 2 ++
 tools/perf/util/parse-events.h                 | 5 -----
 tools/perf/util/parse-events.y                 | 5 +++--
 4 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index f06c86630fda..3f57cd8a935a 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -123,6 +123,12 @@ struct parse_events_ops {
 			      const char *sys, const char *event,
 			      struct parse_events_error *err,
 			      struct list_head *head_config);
+
+	int (*add_bpf)(struct parse_events_state *parse_state,
+		       struct list_head *list,
+		       char *bpf_file_name,
+		       bool source,
+		       struct list_head *head_config);
 };
 
 struct parse_events_state {
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index ad2bec6e6b37..21eb101d24af 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -779,6 +779,7 @@ split_bpf_config_terms(struct list_head *evt_head_config,
 			list_move_tail(&term->list, obj_head_config);
 }
 
+static
 int parse_events_load_bpf(struct parse_events_state *parse_state,
 			  struct list_head *list,
 			  char *bpf_file_name,
@@ -2918,4 +2919,5 @@ static struct parse_events_ops parse_state_ops = {
 	.add_cache          = parse_events_add_cache,
 	.add_breakpoint     = parse_events_add_breakpoint,
 	.add_tracepoint     = parse_events_add_tracepoint,
+	.add_bpf            = parse_events_load_bpf,
 };
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 328612945503..ec94c8541698 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -63,11 +63,6 @@ struct perf_pmu_event_symbol {
 
 void parse_events__shrink_config_terms(void);
 void parse_events__clear_array(struct parse_events_array *a);
-int parse_events_load_bpf(struct parse_events_state *parse_state,
-			  struct list_head *list,
-			  char *bpf_file_name,
-			  bool source,
-			  struct list_head *head_config);
 /* Provide this function for perf test */
 struct bpf_object;
 int parse_events_load_bpf_obj(struct parse_events_state *parse_state,
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 34915b81a7f1..1c55b9fdc79e 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -690,7 +690,7 @@ PE_BPF_OBJECT opt_event_config
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	err = parse_events_load_bpf(parse_state, list, $1, false, $2);
+	err = parse_state->ops->add_bpf(parse_state, list, $1, false, $2);
 	parse_events_terms__delete($2);
 	free($1);
 	if (err) {
@@ -702,12 +702,13 @@ PE_BPF_OBJECT opt_event_config
 |
 PE_BPF_SOURCE opt_event_config
 {
+	struct parse_events_state *parse_state = _parse_state;
 	struct list_head *list;
 	int err;
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	err = parse_events_load_bpf(_parse_state, list, $1, true, $2);
+	err = parse_state->ops->add_bpf(parse_state, list, $1, true, $2);
 	parse_events_terms__delete($2);
 	if (err) {
 		free(list);
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 51/59] perf tools: Add add_tool callback to struct parse_events_ops
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (48 preceding siblings ...)
  2021-11-08 13:37 ` [PATCH 50/59] perf tools: Add add_bpf " Jiri Olsa
@ 2021-11-08 13:37 ` Jiri Olsa
  2021-11-08 13:37 ` [PATCH 52/59] perf tools: Add set_leader " Jiri Olsa
                   ` (8 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:37 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Adding add_tool callback to struct parse_events_ops,
to allow custom tool parsing code.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/parse-events.h | 4 ++++
 tools/perf/util/parse-events.c                 | 2 ++
 tools/perf/util/parse-events.h                 | 3 ---
 tools/perf/util/parse-events.y                 | 3 ++-
 4 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index 3f57cd8a935a..8a5e3f7d5719 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -129,6 +129,10 @@ struct parse_events_ops {
 		       char *bpf_file_name,
 		       bool source,
 		       struct list_head *head_config);
+
+	int (*add_tool)(struct parse_events_state *parse_state,
+			struct list_head *list,
+			int tool_event);
 };
 
 struct parse_events_state {
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 21eb101d24af..c1ebb114dd41 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1356,6 +1356,7 @@ int parse_events_add_numeric(struct parse_events_state *parse_state,
 	return ret;
 }
 
+static
 int parse_events_add_tool(struct parse_events_state *parse_state,
 			  struct list_head *list,
 			  int tool_event)
@@ -2920,4 +2921,5 @@ static struct parse_events_ops parse_state_ops = {
 	.add_breakpoint     = parse_events_add_breakpoint,
 	.add_tracepoint     = parse_events_add_tracepoint,
 	.add_bpf            = parse_events_load_bpf,
+	.add_tool           = parse_events_add_tool,
 };
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index ec94c8541698..95fc6f4cd187 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -69,9 +69,6 @@ int parse_events_load_bpf_obj(struct parse_events_state *parse_state,
 			      struct list_head *list,
 			      struct bpf_object *obj,
 			      struct list_head *head_config);
-int parse_events_add_tool(struct parse_events_state *parse_state,
-			  struct list_head *list,
-			  int tool_event);
 
 struct evsel *parse_events__add_event(struct parse_events_state *parse_state,
 				      struct perf_event_attr *attr,
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 1c55b9fdc79e..1d9410605c9f 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -468,11 +468,12 @@ value_sym sep_slash_slash_dc
 |
 PE_VALUE_SYM_TOOL sep_slash_slash_dc
 {
+	struct parse_events_state *parse_state = _parse_state;
 	struct list_head *list;
 
 	list = alloc_list();
 	ABORT_ON(!list);
-	ABORT_ON(parse_events_add_tool(_parse_state, list, $1));
+	ABORT_ON(parse_state->ops->add_tool(_parse_state, list, $1));
 	$$ = list;
 }
 
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 52/59] perf tools: Add set_leader callback to struct parse_events_ops
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (49 preceding siblings ...)
  2021-11-08 13:37 ` [PATCH 51/59] perf tools: Add add_tool " Jiri Olsa
@ 2021-11-08 13:37 ` Jiri Olsa
  2021-11-08 13:37 ` [PATCH 53/59] perf tools: Add parse_check " Jiri Olsa
                   ` (7 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:37 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Adding add_numeric callback to struct parse_events_ops,
to allow custom leader setting in parsing code.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/parse-events.h | 3 +++
 tools/perf/util/parse-events.c                 | 6 ++++--
 tools/perf/util/parse-events.h                 | 2 --
 tools/perf/util/parse-events.y                 | 6 ++++--
 4 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index 8a5e3f7d5719..8eb9487a2519 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -133,6 +133,9 @@ struct parse_events_ops {
 	int (*add_tool)(struct parse_events_state *parse_state,
 			struct list_head *list,
 			int tool_event);
+
+	void (*set_leader)(char *name, struct list_head *list,
+			   struct parse_events_state *parse_state);
 };
 
 struct parse_events_state {
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index c1ebb114dd41..2c1bc9644c42 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1756,8 +1756,9 @@ parse_events__set_leader_for_uncore_aliase(char *name, struct list_head *list,
 	return ret;
 }
 
-void parse_events__set_leader(char *name, struct list_head *list,
-			      struct parse_events_state *parse_state)
+static
+void parse_events_set_leader(char *name, struct list_head *list,
+			     struct parse_events_state *parse_state)
 {
 	struct evsel *leader;
 
@@ -2922,4 +2923,5 @@ static struct parse_events_ops parse_state_ops = {
 	.add_tracepoint     = parse_events_add_tracepoint,
 	.add_bpf            = parse_events_load_bpf,
 	.add_tool           = parse_events_add_tool,
+	.set_leader         = parse_events_set_leader,
 };
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 95fc6f4cd187..c62a2e3a1f34 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -77,8 +77,6 @@ struct evsel *parse_events__add_event(struct parse_events_state *parse_state,
 
 enum perf_pmu_event_symbol_type
 perf_pmu__parse_check(const char *name);
-void parse_events__set_leader(char *name, struct list_head *list,
-			      struct parse_events_state *parse_state);
 
 void print_events(const char *event_glob, bool name_only, bool quiet,
 		  bool long_desc, bool details_flag, bool deprecated,
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index 1d9410605c9f..38d29946fa07 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -227,20 +227,22 @@ group_def
 group_def:
 PE_NAME '{' events '}'
 {
+	struct parse_events_state *parse_state = _parse_state;
 	struct list_head *list = $3;
 
 	inc_group_count(list, _parse_state);
-	parse_events__set_leader($1, list, _parse_state);
+	parse_state->ops->set_leader($1, list, parse_state);
 	free($1);
 	$$ = list;
 }
 |
 '{' events '}'
 {
+	struct parse_events_state *parse_state = _parse_state;
 	struct list_head *list = $2;
 
 	inc_group_count(list, _parse_state);
-	parse_events__set_leader(NULL, list, _parse_state);
+	parse_state->ops->set_leader(NULL, list, parse_state);
 	$$ = list;
 }
 
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 53/59] perf tools: Add parse_check callback to struct parse_events_ops
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (50 preceding siblings ...)
  2021-11-08 13:37 ` [PATCH 52/59] perf tools: Add set_leader " Jiri Olsa
@ 2021-11-08 13:37 ` Jiri Olsa
  2021-11-08 13:37 ` [PATCH 54/59] perf tools: Move PE_* enums in parse_events__scanner Jiri Olsa
                   ` (6 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:37 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Adding parse_check callback to struct parse_events_ops,
to allow custom parse_check method in tracing flexer code.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/internal/parse-events.h |  9 +++++++++
 tools/perf/util/parse-events.c                 |  3 ++-
 tools/perf/util/parse-events.h                 | 10 ----------
 tools/perf/util/parse-events.l                 | 12 ++++++------
 4 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index 8eb9487a2519..0a8a61219885 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -46,6 +46,13 @@ enum {
 	__PARSE_EVENTS__TERM_TYPE_NR,
 };
 
+enum perf_pmu_event_symbol_type {
+	PMU_EVENT_SYMBOL_ERR,		/* not a PMU EVENT */
+	PMU_EVENT_SYMBOL,		/* normal style PMU event */
+	PMU_EVENT_SYMBOL_PREFIX,	/* prefix of pre-suf style event */
+	PMU_EVENT_SYMBOL_SUFFIX,	/* suffix of pre-suf style event */
+};
+
 struct parse_events_array {
 	size_t nr_ranges;
 	struct {
@@ -136,6 +143,8 @@ struct parse_events_ops {
 
 	void (*set_leader)(char *name, struct list_head *list,
 			   struct parse_events_state *parse_state);
+
+	enum perf_pmu_event_symbol_type (*parse_check)(const char *name);
 };
 
 struct parse_events_state {
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 2c1bc9644c42..aa79ce2f2d44 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1889,7 +1889,7 @@ int perf_pmu__test_parse_init(void)
 	return 0;
 }
 
-enum perf_pmu_event_symbol_type
+static enum perf_pmu_event_symbol_type
 perf_pmu__parse_check(const char *name)
 {
 	struct perf_pmu_event_symbol p, *r;
@@ -2924,4 +2924,5 @@ static struct parse_events_ops parse_state_ops = {
 	.add_bpf            = parse_events_load_bpf,
 	.add_tool           = parse_events_add_tool,
 	.set_leader         = parse_events_set_leader,
+	.parse_check        = perf_pmu__parse_check,
 };
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index c62a2e3a1f34..7ab06ae8355f 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -49,13 +49,6 @@ int exclude_perf(const struct option *opt, const char *arg, int unset);
 
 #define EVENTS_HELP_MAX (128*1024)
 
-enum perf_pmu_event_symbol_type {
-	PMU_EVENT_SYMBOL_ERR,		/* not a PMU EVENT */
-	PMU_EVENT_SYMBOL,		/* normal style PMU event */
-	PMU_EVENT_SYMBOL_PREFIX,	/* prefix of pre-suf style event */
-	PMU_EVENT_SYMBOL_SUFFIX,	/* suffix of pre-suf style event */
-};
-
 struct perf_pmu_event_symbol {
 	char	*symbol;
 	enum perf_pmu_event_symbol_type	type;
@@ -75,9 +68,6 @@ struct evsel *parse_events__add_event(struct parse_events_state *parse_state,
 				      const char *name, const char *metric_id,
 				      struct perf_pmu *pmu);
 
-enum perf_pmu_event_symbol_type
-perf_pmu__parse_check(const char *name);
-
 void print_events(const char *event_glob, bool name_only, bool quiet,
 		  bool long_desc, bool details_flag, bool deprecated,
 		  const char *pmu_name);
diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l
index 4efe9872c667..1cebd5fcdb5d 100644
--- a/tools/perf/util/parse-events.l
+++ b/tools/perf/util/parse-events.l
@@ -63,12 +63,12 @@ static int str(yyscan_t scanner, int token)
 	return token;
 }
 
-static int raw(yyscan_t scanner)
+static int raw(yyscan_t scanner, struct parse_events_state *parse_state)
 {
 	YYSTYPE *yylval = parse_events_get_lval(scanner);
 	char *text = parse_events_get_text(scanner);
 
-	if (perf_pmu__parse_check(text) == PMU_EVENT_SYMBOL)
+	if (parse_state->ops->parse_check(text) == PMU_EVENT_SYMBOL)
 		return str(scanner, PE_NAME);
 
 	return __value(yylval, text + 1, 16, PE_RAW);
@@ -144,7 +144,7 @@ static int pmu_str_check(yyscan_t scanner, struct parse_events_state *parse_stat
 	 * parse check can't be trusted so we return PE_PMU_EVENT_FAKE unless
 	 * an '!' is present in which case the text can't be a PMU name.
 	 */
-	switch (perf_pmu__parse_check(text)) {
+	switch (parse_state->ops->parse_check(text)) {
 		case PMU_EVENT_SYMBOL_PREFIX:
 			return PE_PMU_EVENT_PRE;
 		case PMU_EVENT_SYMBOL_SUFFIX:
@@ -300,8 +300,8 @@ percore			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_PERCORE); }
 aux-output		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT); }
 aux-sample-size		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE); }
 metric-id		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_METRIC_ID); }
-r{num_raw_hex}		{ return raw(yyscanner); }
-r0x{num_raw_hex}	{ return raw(yyscanner); }
+r{num_raw_hex}		{ return raw(yyscanner, _parse_state); }
+r0x{num_raw_hex}	{ return raw(yyscanner, _parse_state); }
 ,			{ return ','; }
 "/"			{ BEGIN(INITIAL); return '/'; }
 {name_minus}		{ return str(yyscanner, PE_NAME); }
@@ -384,7 +384,7 @@ refs|Reference|ops|access		|
 misses|miss				{ return str(yyscanner, PE_NAME_CACHE_OP_RESULT); }
 
 mem:			{ BEGIN(mem); return PE_PREFIX_MEM; }
-r{num_raw_hex}		{ return raw(yyscanner); }
+r{num_raw_hex}		{ return raw(yyscanner, _parse_state); }
 {num_dec}		{ return value(yyscanner, 10); }
 {num_hex}		{ return value(yyscanner, 16); }
 
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 54/59] perf tools: Move PE_* enums in parse_events__scanner
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (51 preceding siblings ...)
  2021-11-08 13:37 ` [PATCH 53/59] perf tools: Add parse_check " Jiri Olsa
@ 2021-11-08 13:37 ` Jiri Olsa
  2021-11-08 13:37 ` [PATCH 55/59] libperf: Move in parse-events flex/bison parser Jiri Olsa
                   ` (5 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:37 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving PE_* enums in parse_events__scanner. The function will
be moved to libperf in next commit.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/parse-events.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index aa79ce2f2d44..7b171252083c 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1914,12 +1914,18 @@ perf_pmu__parse_check(const char *name)
 }
 
 static int parse_events__scanner(const char *str,
-				 struct parse_events_state *parse_state)
+				 struct parse_events_state *parse_state,
+				 bool terms)
 {
 	YY_BUFFER_STATE buffer;
 	void *scanner;
 	int ret;
 
+	if (terms)
+		parse_state->stoken = PE_START_TERMS;
+	else
+		parse_state->stoken = PE_START_EVENTS;
+
 	ret = parse_events_lex_init_extra(parse_state, &scanner);
 	if (ret)
 		return ret;
@@ -1946,12 +1952,11 @@ int parse_events_terms(struct list_head *terms, const char *str)
 	struct parse_events_state parse_state = {
 		.ops     = &parse_state_ops,
 		.terms   = NULL,
-		.stoken  = PE_START_TERMS,
 		.guest   = perf_guest,
 	};
 	int ret;
 
-	ret = parse_events__scanner(str, &parse_state);
+	ret = parse_events__scanner(str, &parse_state, true);
 	perf_pmu__parse_cleanup();
 
 	if (!ret) {
@@ -1970,7 +1975,6 @@ static int parse_events__with_hybrid_pmu(struct parse_events_state *parse_state,
 {
 	struct parse_events_state ps = {
 		.list            = LIST_HEAD_INIT(ps.list),
-		.stoken          = PE_START_EVENTS,
 		.hybrid_pmu_name = pmu_name,
 		.idx             = parse_state->idx,
 		.ops             = &parse_state_ops,
@@ -1978,7 +1982,7 @@ static int parse_events__with_hybrid_pmu(struct parse_events_state *parse_state,
 	};
 	int ret;
 
-	ret = parse_events__scanner(str, &ps);
+	ret = parse_events__scanner(str, &ps, false);
 	perf_pmu__parse_cleanup();
 
 	if (!ret) {
@@ -2001,14 +2005,13 @@ int __parse_events(struct evlist *evlist, const char *str,
 		.idx	  = evlist->core.nr_entries,
 		.error	  = err,
 		.evlist	  = &evlist->core,
-		.stoken	  = PE_START_EVENTS,
 		.fake_pmu = fake_pmu,
 		.ops	  = &parse_state_ops,
 		.guest    = perf_guest,
 	};
 	int ret;
 
-	ret = parse_events__scanner(str, &parse_state);
+	ret = parse_events__scanner(str, &parse_state, false);
 	perf_pmu__parse_cleanup();
 
 	if (!ret && list_empty(&parse_state.list)) {
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 55/59] libperf: Move in parse-events flex/bison parser
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (52 preceding siblings ...)
  2021-11-08 13:37 ` [PATCH 54/59] perf tools: Move PE_* enums in parse_events__scanner Jiri Olsa
@ 2021-11-08 13:37 ` Jiri Olsa
  2021-11-08 13:37 ` [PATCH 56/59] libperf: Move in parse_events_add_breakpoint function Jiri Olsa
                   ` (4 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:37 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving parse-events flex/bison parser in libperf.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/Build                          |  23 +
 .../lib/perf/include/internal/parse-events.h  |   3 +
 tools/lib/perf/parse-events.c                 |  38 +
 tools/lib/perf/parse-events.l                 | 411 ++++++++
 tools/lib/perf/parse-events.y                 | 992 ++++++++++++++++++
 tools/perf/util/Build                         |  15 -
 tools/perf/util/parse-events.c                |  38 -
 tools/perf/util/parse-events.l                | 411 --------
 tools/perf/util/parse-events.y                | 992 ------------------
 9 files changed, 1467 insertions(+), 1456 deletions(-)
 create mode 100644 tools/lib/perf/parse-events.l
 create mode 100644 tools/lib/perf/parse-events.y
 delete mode 100644 tools/perf/util/parse-events.l
 delete mode 100644 tools/perf/util/parse-events.y

diff --git a/tools/lib/perf/Build b/tools/lib/perf/Build
index af4663e4421f..3e29d173e0ec 100644
--- a/tools/lib/perf/Build
+++ b/tools/lib/perf/Build
@@ -12,6 +12,8 @@ libperf-y += pmu-bison.o
 libperf-y += pmu.o
 libperf-y += pmu-hybrid.o
 libperf-y += parse-events.o
+libperf-y += parse-events-flex.o
+libperf-y += parse-events-bison.o
 
 $(OUTPUT)zalloc.o: ../../lib/zalloc.c FORCE
 	$(call rule_mkdir)
@@ -19,6 +21,15 @@ $(OUTPUT)zalloc.o: ../../lib/zalloc.c FORCE
 
 tests-y += tests/
 
+$(OUTPUT)parse-events-flex.c $(OUTPUT)parse-events-flex.h: parse-events.l $(OUTPUT)parse-events-bison.c
+	$(call rule_mkdir)
+	$(Q)$(call echo-cmd,flex)$(FLEX) -o $(OUTPUT)parse-events-flex.c \
+		--header-file=$(OUTPUT)parse-events-flex.h $(PARSER_DEBUG_FLEX) $<
+
+$(OUTPUT)parse-events-bison.c $(OUTPUT)parse-events-bison.h: parse-events.y
+	$(call rule_mkdir)
+	$(Q)$(call echo-cmd,bison)$(BISON) -v $< -d $(PARSER_DEBUG_BISON) $(BISON_FILE_PREFIX_MAP) \
+		-o $(OUTPUT)parse-events-bison.c -p parse_events_
 
 $(OUTPUT)pmu-flex.c $(OUTPUT)pmu-flex.h: pmu.l $(OUTPUT)pmu-bison.c
 	$(call rule_mkdir)
@@ -41,7 +52,19 @@ else
   flex_flags := -w
 endif
 
+bison_flags := -DYYENABLE_NLS=0
+BISON_GE_35 := $(shell expr $(shell $(BISON) --version | grep bison | sed -e 's/.\+ \([0-9]\+\).\([0-9]\+\)/\1\2/g') \>\= 35)
+ifeq ($(BISON_GE_35),1)
+  bison_flags += -Wno-unused-parameter -Wno-nested-externs -Wno-implicit-function-declaration -Wno-switch-enum
+else
+  bison_flags += -w
+endif
+
 CFLAGS_pmu-flex.o  += $(flex_flags)
 CFLAGS_pmu-bison.o += -DYYLTYPE_IS_TRIVIAL=0 $(bison_flags)
 
+CFLAGS_parse-events-flex.o  += $(flex_flags)
+CFLAGS_parse-events-bison.o += $(bison_flags)
+
 $(OUTPUT)pmu.o: $(OUTPUT)pmu-flex.c $(OUTPUT)pmu-bison.c
+$(OUTPUT)parse-events.o: $(OUTPUT)parse-events-flex.c $(OUTPUT)parse-events-bison.c
diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index 0a8a61219885..5020a1b2bff2 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -194,4 +194,7 @@ void parse_events__handle_error(struct parse_events_error *err, int idx,
 void parse_events_evlist_error(struct parse_events_state *parse_state,
 			       int idx, const char *str);
 int parse_events_name(struct list_head *list, const char *name);
+int parse_events__scanner(const char *str,
+			  struct parse_events_state *parse_state,
+			  bool terms);
 #endif /* __LIBPERF_PARSE_EVENTS_H */
diff --git a/tools/lib/perf/parse-events.c b/tools/lib/perf/parse-events.c
index 6efc2bb73cdf..da684023b273 100644
--- a/tools/lib/perf/parse-events.c
+++ b/tools/lib/perf/parse-events.c
@@ -13,6 +13,13 @@
 #include <errno.h>
 #include <asm/bug.h>
 #include "internal.h"
+#include "parse-events-bison.h"
+#define YY_EXTRA_TYPE void*
+#include "parse-events-flex.h"
+
+#ifdef PARSER_DEBUG
+extern int parse_events_debug;
+#endif
 
 struct event_symbol event_symbols_hw[PERF_COUNT_HW_MAX] = {
 	[PERF_COUNT_HW_CPU_CYCLES] = {
@@ -592,3 +599,34 @@ int parse_events_name(struct list_head *list, const char *name)
 
 	return 0;
 }
+
+int parse_events__scanner(const char *str,
+			  struct parse_events_state *parse_state,
+			  bool terms)
+{
+	YY_BUFFER_STATE buffer;
+	void *scanner;
+	int ret;
+
+	if (terms)
+		parse_state->stoken = PE_START_TERMS;
+	else
+		parse_state->stoken = PE_START_EVENTS;
+
+	ret = parse_events_lex_init_extra(parse_state, &scanner);
+	if (ret)
+		return ret;
+
+	buffer = parse_events__scan_string(str, scanner);
+
+#ifdef PARSER_DEBUG
+	parse_events_debug = 1;
+	parse_events_set_debug(1, scanner);
+#endif
+	ret = parse_events_parse(parse_state, scanner);
+
+	parse_events__flush_buffer(buffer, scanner);
+	parse_events__delete_buffer(buffer, scanner);
+	parse_events_lex_destroy(scanner);
+	return ret;
+}
diff --git a/tools/lib/perf/parse-events.l b/tools/lib/perf/parse-events.l
new file mode 100644
index 000000000000..1d4e0aa5ee31
--- /dev/null
+++ b/tools/lib/perf/parse-events.l
@@ -0,0 +1,411 @@
+
+%option reentrant
+%option bison-bridge
+%option prefix="parse_events_"
+%option stack
+%option bison-locations
+%option yylineno
+%option reject
+
+%{
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <internal/parse-events.h>
+#include "parse-events-bison.h"
+#include <internal/evsel.h>
+
+char *parse_events_get_text(yyscan_t yyscanner);
+YYSTYPE *parse_events_get_lval(yyscan_t yyscanner);
+
+static int __value(YYSTYPE *yylval, char *str, int base, int token)
+{
+	u64 num;
+
+	errno = 0;
+	num = strtoull(str, NULL, base);
+	if (errno)
+		return PE_ERROR;
+
+	yylval->num = num;
+	return token;
+}
+
+static int value(yyscan_t scanner, int base)
+{
+	YYSTYPE *yylval = parse_events_get_lval(scanner);
+	char *text = parse_events_get_text(scanner);
+
+	return __value(yylval, text, base, PE_VALUE);
+}
+
+static int str(yyscan_t scanner, int token)
+{
+	YYSTYPE *yylval = parse_events_get_lval(scanner);
+	char *text = parse_events_get_text(scanner);
+
+	if (text[0] != '\'') {
+		yylval->str = strdup(text);
+	} else {
+		/*
+		 * If a text tag specified on the command line
+		 * contains opening single quite ' then it is
+		 * expected that the tag ends with single quote
+		 * as well, like this:
+		 *     name=\'CPU_CLK_UNHALTED.THREAD:cmask=1\'
+		 * quotes need to be escaped to bypass shell
+		 * processing.
+		 */
+		yylval->str = strndup(&text[1], strlen(text) - 2);
+	}
+
+	return token;
+}
+
+static int raw(yyscan_t scanner, struct parse_events_state *parse_state)
+{
+	YYSTYPE *yylval = parse_events_get_lval(scanner);
+	char *text = parse_events_get_text(scanner);
+
+	if (parse_state->ops->parse_check(text) == PMU_EVENT_SYMBOL)
+		return str(scanner, PE_NAME);
+
+	return __value(yylval, text + 1, 16, PE_RAW);
+}
+
+static bool isbpf_suffix(char *text)
+{
+	int len = strlen(text);
+
+	if (len < 2)
+		return false;
+	if ((text[len - 1] == 'c' || text[len - 1] == 'o') &&
+	    text[len - 2] == '.')
+		return true;
+	if (len > 4 && !strcmp(text + len - 4, ".obj"))
+		return true;
+	return false;
+}
+
+static bool isbpf(yyscan_t scanner)
+{
+	char *text = parse_events_get_text(scanner);
+	struct stat st;
+
+	if (!isbpf_suffix(text))
+		return false;
+
+	return stat(text, &st) == 0;
+}
+
+/*
+ * This function is called when the parser gets two kind of input:
+ *
+ * 	@cfg1 or @cfg2=config
+ *
+ * The leading '@' is stripped off before 'cfg1' and 'cfg2=config' are given to
+ * bison.  In the latter case it is necessary to keep the string intact so that
+ * the PMU kernel driver can determine what configurable is associated to
+ * 'config'.
+ */
+static int drv_str(yyscan_t scanner, int token)
+{
+	YYSTYPE *yylval = parse_events_get_lval(scanner);
+	char *text = parse_events_get_text(scanner);
+
+	/* Strip off the '@' */
+	yylval->str = strdup(text + 1);
+	return token;
+}
+
+#define REWIND(__alloc)				\
+do {								\
+	YYSTYPE *__yylval = parse_events_get_lval(yyscanner);	\
+	char *text = parse_events_get_text(yyscanner);		\
+								\
+	if (__alloc)						\
+		__yylval->str = strdup(text);			\
+								\
+	yycolumn -= strlen(text);				\
+	yyless(0);						\
+} while (0)
+
+static int pmu_str_check(yyscan_t scanner, struct parse_events_state *parse_state)
+{
+	YYSTYPE *yylval = parse_events_get_lval(scanner);
+	char *text = parse_events_get_text(scanner);
+
+	yylval->str = strdup(text);
+
+	/*
+	 * If we're not testing then parse check determines the PMU event type
+	 * which if it isn't a PMU returns PE_NAME. When testing the result of
+	 * parse check can't be trusted so we return PE_PMU_EVENT_FAKE unless
+	 * an '!' is present in which case the text can't be a PMU name.
+	 */
+	switch (parse_state->ops->parse_check(text)) {
+		case PMU_EVENT_SYMBOL_PREFIX:
+			return PE_PMU_EVENT_PRE;
+		case PMU_EVENT_SYMBOL_SUFFIX:
+			return PE_PMU_EVENT_SUF;
+		case PMU_EVENT_SYMBOL:
+			return parse_state->fake_pmu
+				? PE_PMU_EVENT_FAKE : PE_KERNEL_PMU_EVENT;
+		default:
+			return parse_state->fake_pmu && !strchr(text,'!')
+				? PE_PMU_EVENT_FAKE : PE_NAME;
+	}
+}
+
+static int sym(yyscan_t scanner, int type, int config)
+{
+	YYSTYPE *yylval = parse_events_get_lval(scanner);
+
+	yylval->num = (type << 16) + config;
+	return type == PERF_TYPE_HARDWARE ? PE_VALUE_SYM_HW : PE_VALUE_SYM_SW;
+}
+
+static int tool(yyscan_t scanner, enum perf_tool_event event)
+{
+	YYSTYPE *yylval = parse_events_get_lval(scanner);
+
+	yylval->num = event;
+	return PE_VALUE_SYM_TOOL;
+}
+
+static int term(yyscan_t scanner, int type)
+{
+	YYSTYPE *yylval = parse_events_get_lval(scanner);
+
+	yylval->num = type;
+	return PE_TERM;
+}
+
+#define YY_USER_ACTION					\
+do {							\
+	yylloc->last_column  = yylloc->first_column;	\
+	yylloc->first_column = yycolumn;		\
+	yycolumn += yyleng;				\
+} while (0);
+
+#define USER_REJECT		\
+	yycolumn -= yyleng;	\
+	REJECT
+
+%}
+
+%x mem
+%s config
+%x event
+%x array
+
+group		[^,{}/]*[{][^}]*[}][^,{}/]*
+event_pmu	[^,{}/]+[/][^/]*[/][^,{}/]*
+event		[^,{}/]+
+bpf_object	[^,{}]+\.(o|bpf)[a-zA-Z0-9._]*
+bpf_source	[^,{}]+\.c[a-zA-Z0-9._]*
+
+num_dec		[0-9]+
+num_hex		0x[a-fA-F0-9]+
+num_raw_hex	[a-fA-F0-9]+
+name		[a-zA-Z_*?\[\]][a-zA-Z0-9_*?.\[\]!]*
+name_tag	[\'][a-zA-Z_*?\[\]][a-zA-Z0-9_*?\-,\.\[\]:=]*[\']
+name_minus	[a-zA-Z_*?][a-zA-Z0-9\-_*?.:]*
+drv_cfg_term	[a-zA-Z0-9_\.]+(=[a-zA-Z0-9_*?\.:]+)?
+/* If you add a modifier you need to update check_modifier() */
+modifier_event	[ukhpPGHSDIWeb]+
+modifier_bp	[rwx]{1,3}
+
+%%
+
+%{
+	struct parse_events_state *_parse_state = parse_events_get_extra(yyscanner);
+
+	{
+		int start_token = _parse_state->stoken;
+
+		if (start_token == PE_START_TERMS)
+			BEGIN(config);
+		else if (start_token == PE_START_EVENTS)
+			BEGIN(event);
+
+		if (start_token) {
+			_parse_state->stoken = 0;
+			/*
+			 * The flex parser does not init locations variable
+			 * via the scan_string interface, so we need do the
+			 * init in here.
+			 */
+			yycolumn = 0;
+			return start_token;
+		}
+         }
+%}
+
+<event>{
+
+{group}		{
+			BEGIN(INITIAL);
+			REWIND(0);
+		}
+
+{event_pmu}	|
+{bpf_object}	|
+{bpf_source}	|
+{event}		{
+			BEGIN(INITIAL);
+			REWIND(1);
+			return PE_EVENT_NAME;
+		}
+
+<<EOF>>		{
+			BEGIN(INITIAL);
+			REWIND(0);
+		}
+,		{
+			return ',';
+		}
+}
+
+<array>{
+"]"			{ BEGIN(config); return ']'; }
+{num_dec}		{ return value(yyscanner, 10); }
+{num_hex}		{ return value(yyscanner, 16); }
+,			{ return ','; }
+"\.\.\."		{ return PE_ARRAY_RANGE; }
+}
+
+<config>{
+	/*
+	 * Please update config_term_names when new static term is added.
+	 */
+config			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG); }
+config1			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG1); }
+config2			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG2); }
+name			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NAME); }
+period			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); }
+freq			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ); }
+branch_type		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); }
+time			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_TIME); }
+call-graph		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CALLGRAPH); }
+stack-size		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_STACKSIZE); }
+max-stack		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_MAX_STACK); }
+nr			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_MAX_EVENTS); }
+inherit			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_INHERIT); }
+no-inherit		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NOINHERIT); }
+overwrite		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_OVERWRITE); }
+no-overwrite		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NOOVERWRITE); }
+percore			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_PERCORE); }
+aux-output		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT); }
+aux-sample-size		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE); }
+metric-id		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_METRIC_ID); }
+r{num_raw_hex}		{ return raw(yyscanner, _parse_state); }
+r0x{num_raw_hex}	{ return raw(yyscanner, _parse_state); }
+,			{ return ','; }
+"/"			{ BEGIN(INITIAL); return '/'; }
+{name_minus}		{ return str(yyscanner, PE_NAME); }
+\[all\]			{ return PE_ARRAY_ALL; }
+"["			{ BEGIN(array); return '['; }
+@{drv_cfg_term}		{ return drv_str(yyscanner, PE_DRV_CFG_TERM); }
+}
+
+<mem>{
+{modifier_bp}		{ return str(yyscanner, PE_MODIFIER_BP); }
+:			{ return ':'; }
+"/"			{ return '/'; }
+{num_dec}		{ return value(yyscanner, 10); }
+{num_hex}		{ return value(yyscanner, 16); }
+	/*
+	 * We need to separate 'mem:' scanner part, in order to get specific
+	 * modifier bits parsed out. Otherwise we would need to handle PE_NAME
+	 * and we'd need to parse it manually. During the escape from <mem>
+	 * state we need to put the escaping char back, so we dont miss it.
+	 */
+.			{ unput(*yytext); BEGIN(INITIAL); }
+	/*
+	 * We destroy the scanner after reaching EOF,
+	 * but anyway just to be sure get back to INIT state.
+	 */
+<<EOF>>			{ BEGIN(INITIAL); }
+}
+
+cpu-cycles|cycles				{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); }
+stalled-cycles-frontend|idle-cycles-frontend	{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }
+stalled-cycles-backend|idle-cycles-backend	{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); }
+instructions					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS); }
+cache-references				{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_REFERENCES); }
+cache-misses					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_MISSES); }
+branch-instructions|branches			{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); }
+branch-misses					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_MISSES); }
+bus-cycles					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BUS_CYCLES); }
+ref-cycles					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_REF_CPU_CYCLES); }
+cpu-clock					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK); }
+task-clock					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_TASK_CLOCK); }
+page-faults|faults				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS); }
+minor-faults					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MIN); }
+major-faults					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MAJ); }
+context-switches|cs				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES); }
+cpu-migrations|migrations			{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS); }
+alignment-faults				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); }
+emulation-faults				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); }
+dummy						{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); }
+duration_time					{ return tool(yyscanner, PERF_TOOL_DURATION_TIME); }
+bpf-output					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_BPF_OUTPUT); }
+cgroup-switches					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CGROUP_SWITCHES); }
+
+	/*
+	 * We have to handle the kernel PMU event cycles-ct/cycles-t/mem-loads/mem-stores separately.
+	 * Because the prefix cycles is mixed up with cpu-cycles.
+	 * loads and stores are mixed up with cache event
+	 */
+cycles-ct				|
+cycles-t				|
+mem-loads				|
+mem-loads-aux				|
+mem-stores				|
+topdown-[a-z-]+				|
+tx-capacity-[a-z-]+			|
+el-capacity-[a-z-]+			{ return str(yyscanner, PE_KERNEL_PMU_EVENT); }
+
+L1-dcache|l1-d|l1d|L1-data		|
+L1-icache|l1-i|l1i|L1-instruction	|
+LLC|L2					|
+dTLB|d-tlb|Data-TLB			|
+iTLB|i-tlb|Instruction-TLB		|
+branch|branches|bpu|btb|bpc		|
+node					{ return str(yyscanner, PE_NAME_CACHE_TYPE); }
+
+load|loads|read				|
+store|stores|write			|
+prefetch|prefetches			|
+speculative-read|speculative-load	|
+refs|Reference|ops|access		|
+misses|miss				{ return str(yyscanner, PE_NAME_CACHE_OP_RESULT); }
+
+mem:			{ BEGIN(mem); return PE_PREFIX_MEM; }
+r{num_raw_hex}		{ return raw(yyscanner, _parse_state); }
+{num_dec}		{ return value(yyscanner, 10); }
+{num_hex}		{ return value(yyscanner, 16); }
+
+{modifier_event}	{ return str(yyscanner, PE_MODIFIER_EVENT); }
+{bpf_object}		{ if (!isbpf(yyscanner)) { USER_REJECT }; return str(yyscanner, PE_BPF_OBJECT); }
+{bpf_source}		{ if (!isbpf(yyscanner)) { USER_REJECT }; return str(yyscanner, PE_BPF_SOURCE); }
+{name}			{ return pmu_str_check(yyscanner, _parse_state); }
+{name_tag}		{ return str(yyscanner, PE_NAME); }
+"/"			{ BEGIN(config); return '/'; }
+-			{ return '-'; }
+,			{ BEGIN(event); return ','; }
+:			{ return ':'; }
+"{"			{ BEGIN(event); return '{'; }
+"}"			{ return '}'; }
+=			{ return '='; }
+\n			{ }
+.			{ }
+
+%%
+
+int parse_events_wrap(void *scanner __maybe_unused)
+{
+	return 1;
+}
diff --git a/tools/lib/perf/parse-events.y b/tools/lib/perf/parse-events.y
new file mode 100644
index 000000000000..5ed21a4509e5
--- /dev/null
+++ b/tools/lib/perf/parse-events.y
@@ -0,0 +1,992 @@
+%define api.pure full
+%parse-param {void *_parse_state}
+%parse-param {void *scanner}
+%lex-param {void* scanner}
+%locations
+
+%{
+
+#define YYDEBUG 1
+
+#include <fnmatch.h>
+#include <stdio.h>
+#include <linux/compiler.h>
+#include <linux/types.h>
+#include <linux/zalloc.h>
+#include <internal/pmu.h>
+#include <internal/evsel.h>
+#include <internal/parse-events.h>
+#include "parse-events-bison.h"
+
+void parse_events_error(YYLTYPE *loc, void *parse_state, void *scanner, char const *msg);
+
+#define ABORT_ON(val) \
+do { \
+	if (val) \
+		YYABORT; \
+} while (0)
+
+static struct list_head* alloc_list(void)
+{
+	struct list_head *list;
+
+	list = malloc(sizeof(*list));
+	if (!list)
+		return NULL;
+
+	INIT_LIST_HEAD(list);
+	return list;
+}
+
+static void free_list_evsel(struct parse_events_state *parse_state,
+			    struct list_head* list_evsel)
+{
+	struct perf_evsel *evsel, *tmp;
+
+	list_for_each_entry_safe(evsel, tmp, list_evsel, node) {
+		list_del_init(&evsel->node);
+		parse_state->ops->perf_evsel__delete(evsel);
+	}
+	free(list_evsel);
+}
+
+/* list_event is assumed to point to malloc'ed memory */
+static void update_lists(struct list_head *list_event,
+			 struct list_head *list_all)
+{
+	/*
+	 * Called for single event definition. Update the
+	 * 'all event' list, and reinit the 'single event'
+	 * list, for next event definition.
+	 */
+	list_splice_tail(list_event, list_all);
+	free(list_event);
+}
+
+static void inc_group_count(struct list_head *list,
+		       struct parse_events_state *parse_state)
+{
+	/* Count groups only have more than 1 members */
+	if (!list_is_last(list->next, list))
+		parse_state->nr_groups++;
+}
+
+static int loc_term(void *loc_term_)
+{
+	YYLTYPE *loc_term = loc_term_;
+
+	return loc_term ? loc_term->first_column : 0;
+}
+
+static int loc_val(void *loc_val_)
+{
+	YYLTYPE *loc_val = loc_val_;
+
+	return loc_val ? loc_val->first_column  : 0;
+}
+
+%}
+
+%token PE_START_EVENTS PE_START_TERMS
+%token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_RAW PE_TERM
+%token PE_VALUE_SYM_TOOL
+%token PE_EVENT_NAME
+%token PE_NAME
+%token PE_BPF_OBJECT PE_BPF_SOURCE
+%token PE_MODIFIER_EVENT PE_MODIFIER_BP
+%token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT
+%token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP
+%token PE_ERROR
+%token PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT PE_PMU_EVENT_FAKE
+%token PE_ARRAY_ALL PE_ARRAY_RANGE
+%token PE_DRV_CFG_TERM
+%type <num> PE_VALUE
+%type <num> PE_VALUE_SYM_HW
+%type <num> PE_VALUE_SYM_SW
+%type <num> PE_VALUE_SYM_TOOL
+%type <num> PE_RAW
+%type <num> PE_TERM
+%type <num> value_sym
+%type <str> PE_NAME
+%type <str> PE_BPF_OBJECT
+%type <str> PE_BPF_SOURCE
+%type <str> PE_NAME_CACHE_TYPE
+%type <str> PE_NAME_CACHE_OP_RESULT
+%type <str> PE_MODIFIER_EVENT
+%type <str> PE_MODIFIER_BP
+%type <str> PE_EVENT_NAME
+%type <str> PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT PE_PMU_EVENT_FAKE
+%type <str> PE_DRV_CFG_TERM
+%type <str> event_pmu_name
+%destructor { free ($$); } <str>
+%type <term> event_term
+%destructor { parse_events_term__delete ($$); } <term>
+%type <list_terms> event_config
+%type <list_terms> opt_event_config
+%type <list_terms> opt_pmu_config
+%destructor { parse_events_terms__delete ($$); } <list_terms>
+%type <list_evsel> event_pmu
+%type <list_evsel> event_legacy_symbol
+%type <list_evsel> event_legacy_cache
+%type <list_evsel> event_legacy_mem
+%type <list_evsel> event_legacy_tracepoint
+%type <list_evsel> event_legacy_numeric
+%type <list_evsel> event_legacy_raw
+%type <list_evsel> event_bpf_file
+%type <list_evsel> event_def
+%type <list_evsel> event_mod
+%type <list_evsel> event_name
+%type <list_evsel> event
+%type <list_evsel> events
+%type <list_evsel> group_def
+%type <list_evsel> group
+%type <list_evsel> groups
+%destructor { free_list_evsel (_parse_state, $$); } <list_evsel>
+%type <tracepoint_name> tracepoint_name
+%destructor { free ($$.sys); free ($$.event); } <tracepoint_name>
+%type <array> array
+%type <array> array_term
+%type <array> array_terms
+%destructor { free ($$.ranges); } <array>
+
+%union
+{
+	char *str;
+	u64 num;
+	struct list_head *list_evsel;
+	struct list_head *list_terms;
+	struct parse_events_term *term;
+	struct tracepoint_name {
+		char *sys;
+		char *event;
+	} tracepoint_name;
+	struct parse_events_array array;
+}
+%%
+
+start:
+PE_START_EVENTS start_events
+|
+PE_START_TERMS  start_terms
+
+start_events: groups
+{
+	struct parse_events_state *parse_state = _parse_state;
+
+	/* frees $1 */
+	update_lists($1, &parse_state->list);
+}
+
+groups:
+groups ',' group
+{
+	struct list_head *list  = $1;
+	struct list_head *group = $3;
+
+	/* frees $3 */
+	update_lists(group, list);
+	$$ = list;
+}
+|
+groups ',' event
+{
+	struct list_head *list  = $1;
+	struct list_head *event = $3;
+
+	/* frees $3 */
+	update_lists(event, list);
+	$$ = list;
+}
+|
+group
+|
+event
+
+group:
+group_def ':' PE_MODIFIER_EVENT
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list = $1;
+	int err;
+
+	err = parse_events__modifier_group(list, $3, parse_state->guest);
+	free($3);
+	if (err) {
+		struct parse_events_error *error = parse_state->error;
+
+		parse_events__handle_error(error, @3.first_column,
+					   strdup("Bad modifier"), NULL);
+		free_list_evsel(parse_state, list);
+		YYABORT;
+	}
+	$$ = list;
+}
+|
+group_def
+
+group_def:
+PE_NAME '{' events '}'
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list = $3;
+
+	inc_group_count(list, _parse_state);
+	parse_state->ops->set_leader($1, list, parse_state);
+	free($1);
+	$$ = list;
+}
+|
+'{' events '}'
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list = $2;
+
+	inc_group_count(list, _parse_state);
+	parse_state->ops->set_leader(NULL, list, parse_state);
+	$$ = list;
+}
+
+events:
+events ',' event
+{
+	struct list_head *event = $3;
+	struct list_head *list  = $1;
+
+	/* frees $3 */
+	update_lists(event, list);
+	$$ = list;
+}
+|
+event
+
+event: event_mod
+
+event_mod:
+event_name PE_MODIFIER_EVENT
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list = $1;
+	int err;
+
+	/*
+	 * Apply modifier on all events added by single event definition
+	 * (there could be more events added for multiple tracepoint
+	 * definitions via '*?'.
+	 */
+	err = parse_events__modifier_event(list, $2, false, parse_state->guest);
+	free($2);
+	if (err) {
+		struct parse_events_error *error = parse_state->error;
+
+		parse_events__handle_error(error, @2.first_column,
+					   strdup("Bad modifier"), NULL);
+		free_list_evsel(parse_state, list);
+		YYABORT;
+	}
+	$$ = list;
+}
+|
+event_name
+
+event_name:
+PE_EVENT_NAME event_def
+{
+	int err;
+
+	err = parse_events_name($2, $1);
+	free($1);
+	if (err) {
+		free_list_evsel(_parse_state, $2);
+		YYABORT;
+	}
+	$$ = $2;
+}
+|
+event_def
+
+event_def: event_pmu |
+	   event_legacy_symbol |
+	   event_legacy_cache sep_dc |
+	   event_legacy_mem |
+	   event_legacy_tracepoint sep_dc |
+	   event_legacy_numeric sep_dc |
+	   event_legacy_raw sep_dc |
+	   event_bpf_file
+
+event_pmu_name:
+PE_NAME | PE_PMU_EVENT_PRE
+
+event_pmu:
+event_pmu_name opt_pmu_config
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct parse_events_error *error = parse_state->error;
+	struct list_head *list = NULL, *orig_terms = NULL;
+
+#define CLEANUP_YYABORT					\
+	do {						\
+		parse_events_terms__delete($2);		\
+		parse_events_terms__delete(orig_terms);	\
+		free(list);				\
+		free($1);				\
+		YYABORT;				\
+	} while(0)
+
+	if (parse_events_copy_term_list($2, &orig_terms))
+		CLEANUP_YYABORT;
+
+	if (error)
+		error->idx = @1.first_column;
+
+	list = alloc_list();
+	if (!list)
+		CLEANUP_YYABORT;
+	if (parse_state->ops->add_pmu(parse_state, list, $1, $2, orig_terms, false, false))
+		CLEANUP_YYABORT;
+	parse_events_terms__delete($2);
+	parse_events_terms__delete(orig_terms);
+	free($1);
+	$$ = list;
+#undef CLEANUP_YYABORT
+}
+|
+PE_KERNEL_PMU_EVENT sep_dc
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list;
+	int err;
+
+	err = parse_state->ops->add_pmu_multi(parse_state, $1, NULL, &list);
+	free($1);
+	if (err < 0)
+		YYABORT;
+	$$ = list;
+}
+|
+PE_KERNEL_PMU_EVENT opt_pmu_config
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list;
+	int err;
+
+	/* frees $2 */
+	err = parse_state->ops->add_pmu_multi(_parse_state, $1, $2, &list);
+	free($1);
+	if (err < 0)
+		YYABORT;
+	$$ = list;
+}
+|
+PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list;
+	char pmu_name[128];
+
+	snprintf(pmu_name, sizeof(pmu_name), "%s-%s", $1, $3);
+	free($1);
+	free($3);
+	if (parse_state->ops->add_pmu_multi(_parse_state, pmu_name, NULL, &list) < 0)
+		YYABORT;
+	$$ = list;
+}
+|
+PE_PMU_EVENT_FAKE sep_dc
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list;
+	int err;
+
+	list = alloc_list();
+	if (!list)
+		YYABORT;
+
+	err = parse_state->ops->add_pmu(parse_state, list, $1, NULL, NULL, false, false);
+	free($1);
+	if (err < 0) {
+		free(list);
+		YYABORT;
+	}
+	$$ = list;
+}
+|
+PE_PMU_EVENT_FAKE opt_pmu_config
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list;
+	int err;
+
+	list = alloc_list();
+	if (!list)
+		YYABORT;
+
+	err = parse_state->ops->add_pmu(parse_state, list, $1, $2, NULL, false, false);
+	free($1);
+	parse_events_terms__delete($2);
+	if (err < 0) {
+		free(list);
+		YYABORT;
+	}
+	$$ = list;
+}
+
+value_sym:
+PE_VALUE_SYM_HW
+|
+PE_VALUE_SYM_SW
+
+event_legacy_symbol:
+value_sym '/' event_config '/'
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list;
+	int type = $1 >> 16;
+	int config = $1 & 255;
+	int err;
+
+	list = alloc_list();
+	ABORT_ON(!list);
+	err = parse_state->ops->add_numeric(parse_state, list, type, config, $3);
+	parse_events_terms__delete($3);
+	if (err) {
+		free_list_evsel(_parse_state, list);
+		YYABORT;
+	}
+	$$ = list;
+}
+|
+value_sym sep_slash_slash_dc
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list;
+	int type = $1 >> 16;
+	int config = $1 & 255;
+
+	list = alloc_list();
+	ABORT_ON(!list);
+	ABORT_ON(parse_state->ops->add_numeric(parse_state, list, type, config, NULL));
+	$$ = list;
+}
+|
+PE_VALUE_SYM_TOOL sep_slash_slash_dc
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list;
+
+	list = alloc_list();
+	ABORT_ON(!list);
+	ABORT_ON(parse_state->ops->add_tool(_parse_state, list, $1));
+	$$ = list;
+}
+
+event_legacy_cache:
+PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT opt_event_config
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct parse_events_error *error = parse_state->error;
+	struct list_head *list;
+	int err;
+
+	list = alloc_list();
+	ABORT_ON(!list);
+	err = parse_state->ops->add_cache(parse_state, list, $1, $3, $5, error, $6);
+	parse_events_terms__delete($6);
+	free($1);
+	free($3);
+	free($5);
+	if (err) {
+		free_list_evsel(parse_state, list);
+		YYABORT;
+	}
+	$$ = list;
+}
+|
+PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT opt_event_config
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct parse_events_error *error = parse_state->error;
+	struct list_head *list;
+	int err;
+
+	list = alloc_list();
+	ABORT_ON(!list);
+	err = parse_state->ops->add_cache(parse_state, list, $1, $3, NULL, error, $4);
+	parse_events_terms__delete($4);
+	free($1);
+	free($3);
+	if (err) {
+		free_list_evsel(parse_state, list);
+		YYABORT;
+	}
+	$$ = list;
+}
+|
+PE_NAME_CACHE_TYPE opt_event_config
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct parse_events_error *error = parse_state->error;
+	struct list_head *list;
+	int err;
+
+	list = alloc_list();
+	ABORT_ON(!list);
+	err = parse_state->ops->add_cache(parse_state, list, $1, NULL, NULL, error, $2);
+	parse_events_terms__delete($2);
+	free($1);
+	if (err) {
+		free_list_evsel(parse_state, list);
+		YYABORT;
+	}
+	$$ = list;
+}
+
+event_legacy_mem:
+PE_PREFIX_MEM PE_VALUE '/' PE_VALUE ':' PE_MODIFIER_BP sep_dc
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list;
+	int err;
+
+	list = alloc_list();
+	ABORT_ON(!list);
+	err = parse_state->ops->add_breakpoint(parse_state, list, $2, $6, $4);
+	free($6);
+	if (err) {
+		free(list);
+		YYABORT;
+	}
+	$$ = list;
+}
+|
+PE_PREFIX_MEM PE_VALUE '/' PE_VALUE sep_dc
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list;
+
+	list = alloc_list();
+	ABORT_ON(!list);
+	if (parse_state->ops->add_breakpoint(parse_state, list, $2, NULL, $4)) {
+		free(list);
+		YYABORT;
+	}
+	$$ = list;
+}
+|
+PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list;
+	int err;
+
+	list = alloc_list();
+	ABORT_ON(!list);
+	err = parse_state->ops->add_breakpoint(parse_state, list, $2, $4, 0);
+	free($4);
+	if (err) {
+		free(list);
+		YYABORT;
+	}
+	$$ = list;
+}
+|
+PE_PREFIX_MEM PE_VALUE sep_dc
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list;
+
+	list = alloc_list();
+	ABORT_ON(!list);
+	if (parse_state->ops->add_breakpoint(parse_state, list, $2, NULL, 0)) {
+		free(list);
+		YYABORT;
+	}
+	$$ = list;
+}
+
+event_legacy_tracepoint:
+tracepoint_name opt_event_config
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct parse_events_error *error = parse_state->error;
+	struct list_head *list;
+	int err;
+
+	list = alloc_list();
+	ABORT_ON(!list);
+	if (error)
+		error->idx = @1.first_column;
+
+	err = parse_state->ops->add_tracepoint(parse_state, list, $1.sys, $1.event,
+					       error, $2);
+
+	parse_events_terms__delete($2);
+	free($1.sys);
+	free($1.event);
+	if (err) {
+		free(list);
+		YYABORT;
+	}
+	$$ = list;
+}
+
+tracepoint_name:
+PE_NAME '-' PE_NAME ':' PE_NAME
+{
+	struct tracepoint_name tracepoint;
+
+	ABORT_ON(asprintf(&tracepoint.sys, "%s-%s", $1, $3) < 0);
+	tracepoint.event = $5;
+	free($1);
+	free($3);
+	$$ = tracepoint;
+}
+|
+PE_NAME ':' PE_NAME
+{
+	struct tracepoint_name tracepoint = {$1, $3};
+
+	$$ = tracepoint;
+}
+
+event_legacy_numeric:
+PE_VALUE ':' PE_VALUE opt_event_config
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list;
+	int err;
+
+	list = alloc_list();
+	ABORT_ON(!list);
+	err = parse_state->ops->add_numeric(_parse_state, list, (u32)$1, $3, $4);
+	parse_events_terms__delete($4);
+	if (err) {
+		free(list);
+		YYABORT;
+	}
+	$$ = list;
+}
+
+event_legacy_raw:
+PE_RAW opt_event_config
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list;
+	int err;
+
+	list = alloc_list();
+	ABORT_ON(!list);
+	err = parse_state->ops->add_numeric(_parse_state, list, PERF_TYPE_RAW, $1, $2);
+	parse_events_terms__delete($2);
+	if (err) {
+		free(list);
+		YYABORT;
+	}
+	$$ = list;
+}
+
+event_bpf_file:
+PE_BPF_OBJECT opt_event_config
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list;
+	int err;
+
+	list = alloc_list();
+	ABORT_ON(!list);
+	err = parse_state->ops->add_bpf(parse_state, list, $1, false, $2);
+	parse_events_terms__delete($2);
+	free($1);
+	if (err) {
+		free(list);
+		YYABORT;
+	}
+	$$ = list;
+}
+|
+PE_BPF_SOURCE opt_event_config
+{
+	struct parse_events_state *parse_state = _parse_state;
+	struct list_head *list;
+	int err;
+
+	list = alloc_list();
+	ABORT_ON(!list);
+	err = parse_state->ops->add_bpf(parse_state, list, $1, true, $2);
+	parse_events_terms__delete($2);
+	if (err) {
+		free(list);
+		YYABORT;
+	}
+	$$ = list;
+}
+
+opt_event_config:
+'/' event_config '/'
+{
+	$$ = $2;
+}
+|
+'/' '/'
+{
+	$$ = NULL;
+}
+|
+{
+	$$ = NULL;
+}
+
+opt_pmu_config:
+'/' event_config '/'
+{
+	$$ = $2;
+}
+|
+'/' '/'
+{
+	$$ = NULL;
+}
+
+start_terms: event_config
+{
+	struct parse_events_state *parse_state = _parse_state;
+	if (parse_state->terms) {
+		parse_events_terms__delete ($1);
+		YYABORT;
+	}
+	parse_state->terms = $1;
+}
+
+event_config:
+event_config ',' event_term
+{
+	struct list_head *head = $1;
+	struct parse_events_term *term = $3;
+
+	if (!head) {
+		parse_events_term__delete(term);
+		YYABORT;
+	}
+	list_add_tail(&term->list, head);
+	$$ = $1;
+}
+|
+event_term
+{
+	struct list_head *head = malloc(sizeof(*head));
+	struct parse_events_term *term = $1;
+
+	ABORT_ON(!head);
+	INIT_LIST_HEAD(head);
+	list_add_tail(&term->list, head);
+	$$ = head;
+}
+
+event_term:
+PE_RAW
+{
+	struct parse_events_term *term;
+
+	ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_CONFIG,
+					NULL, $1, false, loc_term(&@1), 0));
+	$$ = term;
+}
+|
+PE_NAME '=' PE_NAME
+{
+	struct parse_events_term *term;
+
+	if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
+					$1, $3, loc_term(&@1), loc_val(&@3))) {
+		free($1);
+		free($3);
+		YYABORT;
+	}
+	$$ = term;
+}
+|
+PE_NAME '=' PE_VALUE
+{
+	struct parse_events_term *term;
+
+	if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
+					$1, $3, false, loc_term(&@1), loc_val(&@3))) {
+		free($1);
+		YYABORT;
+	}
+	$$ = term;
+}
+|
+PE_NAME '=' PE_VALUE_SYM_HW
+{
+	struct parse_events_term *term;
+	int config = $3 & 255;
+
+	if (parse_events_term__sym_hw(&term, $1, config)) {
+		free($1);
+		YYABORT;
+	}
+	$$ = term;
+}
+|
+PE_NAME
+{
+	struct parse_events_term *term;
+
+	if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
+					$1, 1, true, loc_term(&@1), 0)) {
+		free($1);
+		YYABORT;
+	}
+	$$ = term;
+}
+|
+PE_VALUE_SYM_HW
+{
+	struct parse_events_term *term;
+	int config = $1 & 255;
+
+	ABORT_ON(parse_events_term__sym_hw(&term, NULL, config));
+	$$ = term;
+}
+|
+PE_TERM '=' PE_NAME
+{
+	struct parse_events_term *term;
+
+	if (parse_events_term__str(&term, (int)$1, NULL, $3,
+				   loc_term(&@1), loc_val(&@3))) {
+		free($3);
+		YYABORT;
+	}
+	$$ = term;
+}
+|
+PE_TERM '=' PE_VALUE
+{
+	struct parse_events_term *term;
+
+	ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3, false,
+					loc_term(&@1), loc_val(&@3)));
+	$$ = term;
+}
+|
+PE_TERM
+{
+	struct parse_events_term *term;
+
+	ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1, true, loc_term(&@1), 0));
+	$$ = term;
+}
+|
+PE_NAME array '=' PE_NAME
+{
+	struct parse_events_term *term;
+
+	if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
+					$1, $4, loc_term(&@1), loc_val(&@4))) {
+		free($1);
+		free($4);
+		free($2.ranges);
+		YYABORT;
+	}
+	term->array = $2;
+	$$ = term;
+}
+|
+PE_NAME array '=' PE_VALUE
+{
+	struct parse_events_term *term;
+
+	if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
+					$1, $4, false, loc_term(&@1), loc_val(&@4))) {
+		free($1);
+		free($2.ranges);
+		YYABORT;
+	}
+	term->array = $2;
+	$$ = term;
+}
+|
+PE_DRV_CFG_TERM
+{
+	struct parse_events_term *term;
+	char *config = strdup($1);
+
+	ABORT_ON(!config);
+	if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_DRV_CFG,
+					config, $1, loc_term(&@1), 0)) {
+		free($1);
+		free(config);
+		YYABORT;
+	}
+	$$ = term;
+}
+
+array:
+'[' array_terms ']'
+{
+	$$ = $2;
+}
+|
+PE_ARRAY_ALL
+{
+	$$.nr_ranges = 0;
+	$$.ranges = NULL;
+}
+
+array_terms:
+array_terms ',' array_term
+{
+	struct parse_events_array new_array;
+
+	new_array.nr_ranges = $1.nr_ranges + $3.nr_ranges;
+	new_array.ranges = realloc($1.ranges,
+				sizeof(new_array.ranges[0]) *
+				new_array.nr_ranges);
+	ABORT_ON(!new_array.ranges);
+	memcpy(&new_array.ranges[$1.nr_ranges], $3.ranges,
+	       $3.nr_ranges * sizeof(new_array.ranges[0]));
+	free($3.ranges);
+	$$ = new_array;
+}
+|
+array_term
+
+array_term:
+PE_VALUE
+{
+	struct parse_events_array array;
+
+	array.nr_ranges = 1;
+	array.ranges = malloc(sizeof(array.ranges[0]));
+	ABORT_ON(!array.ranges);
+	array.ranges[0].start = $1;
+	array.ranges[0].length = 1;
+	$$ = array;
+}
+|
+PE_VALUE PE_ARRAY_RANGE PE_VALUE
+{
+	struct parse_events_array array;
+
+	ABORT_ON($3 < $1);
+	array.nr_ranges = 1;
+	array.ranges = malloc(sizeof(array.ranges[0]));
+	ABORT_ON(!array.ranges);
+	array.ranges[0].start = $1;
+	array.ranges[0].length = $3 - $1 + 1;
+	$$ = array;
+}
+
+sep_dc: ':' |
+
+sep_slash_slash_dc: '/' '/' | ':' |
+
+%%
+
+void parse_events_error(YYLTYPE *loc, void *parse_state,
+			void *scanner __maybe_unused,
+			char const *msg __maybe_unused)
+{
+	parse_events_evlist_error(parse_state, loc->last_column, "parser error");
+}
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 1d697cecf4ea..ad9e2de899da 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -66,8 +66,6 @@ perf-y += comm.o
 perf-y += thread.o
 perf-y += thread_map.o
 perf-y += trace-event-parse.o
-perf-y += parse-events-flex.o
-perf-y += parse-events-bison.o
 perf-y += pmu.o
 perf-y += trace-event-read.o
 perf-y += trace-event-info.o
@@ -209,16 +207,6 @@ CFLAGS_llvm-utils.o += -DPERF_INCLUDE_DIR="BUILD_STR($(perf_include_dir_SQ))"
 # avoid compiler warnings in 32-bit mode
 CFLAGS_genelf_debug.o  += -Wno-packed
 
-$(OUTPUT)util/parse-events-flex.c $(OUTPUT)util/parse-events-flex.h: util/parse-events.l $(OUTPUT)util/parse-events-bison.c
-	$(call rule_mkdir)
-	$(Q)$(call echo-cmd,flex)$(FLEX) -o $(OUTPUT)util/parse-events-flex.c \
-		--header-file=$(OUTPUT)util/parse-events-flex.h $(PARSER_DEBUG_FLEX) $<
-
-$(OUTPUT)util/parse-events-bison.c $(OUTPUT)util/parse-events-bison.h: util/parse-events.y
-	$(call rule_mkdir)
-	$(Q)$(call echo-cmd,bison)$(BISON) -v $< -d $(PARSER_DEBUG_BISON) $(BISON_FILE_PREFIX_MAP) \
-		-o $(OUTPUT)util/parse-events-bison.c -p parse_events_
-
 $(OUTPUT)util/expr-flex.c $(OUTPUT)util/expr-flex.h: util/expr.l $(OUTPUT)util/expr-bison.c
 	$(call rule_mkdir)
 	$(Q)$(call echo-cmd,flex)$(FLEX) -o $(OUTPUT)util/expr-flex.c \
@@ -239,7 +227,6 @@ ifeq ($(FLEX_GE_26),1)
 else
   flex_flags := -w
 endif
-CFLAGS_parse-events-flex.o  += $(flex_flags)
 CFLAGS_expr-flex.o          += $(flex_flags)
 
 bison_flags := -DYYENABLE_NLS=0
@@ -249,10 +236,8 @@ ifeq ($(BISON_GE_35),1)
 else
   bison_flags += -w
 endif
-CFLAGS_parse-events-bison.o += $(bison_flags)
 CFLAGS_expr-bison.o         += -DYYLTYPE_IS_TRIVIAL=0 $(bison_flags)
 
-$(OUTPUT)util/parse-events.o: $(OUTPUT)util/parse-events-flex.c $(OUTPUT)util/parse-events-bison.c
 $(OUTPUT)util/expr.o: $(OUTPUT)util/expr-flex.c $(OUTPUT)util/expr-bison.c
 
 CFLAGS_bitmap.o        += -Wno-unused-parameter -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))"
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 7b171252083c..44980b34e367 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -23,9 +23,6 @@
 #include "debug.h"
 #include <api/fs/tracing_path.h>
 #include <perf/cpumap.h>
-#include "parse-events-bison.h"
-#define YY_EXTRA_TYPE void*
-#include "parse-events-flex.h"
 #include "pmu.h"
 #include "thread_map.h"
 #include "probe-file.h"
@@ -41,10 +38,6 @@
 
 #define MAX_NAME_LEN 100
 
-#ifdef PARSER_DEBUG
-extern int parse_events_debug;
-#endif
-int parse_events_parse(void *parse_state, void *scanner);
 static int get_config_terms(struct list_head *head_config,
 			    struct list_head *head_terms __maybe_unused);
 static int parse_events__with_hybrid_pmu(struct parse_events_state *parse_state,
@@ -1913,37 +1906,6 @@ perf_pmu__parse_check(const char *name)
 	return r ? r->type : PMU_EVENT_SYMBOL_ERR;
 }
 
-static int parse_events__scanner(const char *str,
-				 struct parse_events_state *parse_state,
-				 bool terms)
-{
-	YY_BUFFER_STATE buffer;
-	void *scanner;
-	int ret;
-
-	if (terms)
-		parse_state->stoken = PE_START_TERMS;
-	else
-		parse_state->stoken = PE_START_EVENTS;
-
-	ret = parse_events_lex_init_extra(parse_state, &scanner);
-	if (ret)
-		return ret;
-
-	buffer = parse_events__scan_string(str, scanner);
-
-#ifdef PARSER_DEBUG
-	parse_events_debug = 1;
-	parse_events_set_debug(1, scanner);
-#endif
-	ret = parse_events_parse(parse_state, scanner);
-
-	parse_events__flush_buffer(buffer, scanner);
-	parse_events__delete_buffer(buffer, scanner);
-	parse_events_lex_destroy(scanner);
-	return ret;
-}
-
 /*
  * parse event config string, return a list of event terms.
  */
diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l
deleted file mode 100644
index 1cebd5fcdb5d..000000000000
--- a/tools/perf/util/parse-events.l
+++ /dev/null
@@ -1,411 +0,0 @@
-
-%option reentrant
-%option bison-bridge
-%option prefix="parse_events_"
-%option stack
-%option bison-locations
-%option yylineno
-%option reject
-
-%{
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include "parse-events.h"
-#include "parse-events-bison.h"
-#include "evsel.h"
-
-char *parse_events_get_text(yyscan_t yyscanner);
-YYSTYPE *parse_events_get_lval(yyscan_t yyscanner);
-
-static int __value(YYSTYPE *yylval, char *str, int base, int token)
-{
-	u64 num;
-
-	errno = 0;
-	num = strtoull(str, NULL, base);
-	if (errno)
-		return PE_ERROR;
-
-	yylval->num = num;
-	return token;
-}
-
-static int value(yyscan_t scanner, int base)
-{
-	YYSTYPE *yylval = parse_events_get_lval(scanner);
-	char *text = parse_events_get_text(scanner);
-
-	return __value(yylval, text, base, PE_VALUE);
-}
-
-static int str(yyscan_t scanner, int token)
-{
-	YYSTYPE *yylval = parse_events_get_lval(scanner);
-	char *text = parse_events_get_text(scanner);
-
-	if (text[0] != '\'') {
-		yylval->str = strdup(text);
-	} else {
-		/*
-		 * If a text tag specified on the command line
-		 * contains opening single quite ' then it is
-		 * expected that the tag ends with single quote
-		 * as well, like this:
-		 *     name=\'CPU_CLK_UNHALTED.THREAD:cmask=1\'
-		 * quotes need to be escaped to bypass shell
-		 * processing.
-		 */
-		yylval->str = strndup(&text[1], strlen(text) - 2);
-	}
-
-	return token;
-}
-
-static int raw(yyscan_t scanner, struct parse_events_state *parse_state)
-{
-	YYSTYPE *yylval = parse_events_get_lval(scanner);
-	char *text = parse_events_get_text(scanner);
-
-	if (parse_state->ops->parse_check(text) == PMU_EVENT_SYMBOL)
-		return str(scanner, PE_NAME);
-
-	return __value(yylval, text + 1, 16, PE_RAW);
-}
-
-static bool isbpf_suffix(char *text)
-{
-	int len = strlen(text);
-
-	if (len < 2)
-		return false;
-	if ((text[len - 1] == 'c' || text[len - 1] == 'o') &&
-	    text[len - 2] == '.')
-		return true;
-	if (len > 4 && !strcmp(text + len - 4, ".obj"))
-		return true;
-	return false;
-}
-
-static bool isbpf(yyscan_t scanner)
-{
-	char *text = parse_events_get_text(scanner);
-	struct stat st;
-
-	if (!isbpf_suffix(text))
-		return false;
-
-	return stat(text, &st) == 0;
-}
-
-/*
- * This function is called when the parser gets two kind of input:
- *
- * 	@cfg1 or @cfg2=config
- *
- * The leading '@' is stripped off before 'cfg1' and 'cfg2=config' are given to
- * bison.  In the latter case it is necessary to keep the string intact so that
- * the PMU kernel driver can determine what configurable is associated to
- * 'config'.
- */
-static int drv_str(yyscan_t scanner, int token)
-{
-	YYSTYPE *yylval = parse_events_get_lval(scanner);
-	char *text = parse_events_get_text(scanner);
-
-	/* Strip off the '@' */
-	yylval->str = strdup(text + 1);
-	return token;
-}
-
-#define REWIND(__alloc)				\
-do {								\
-	YYSTYPE *__yylval = parse_events_get_lval(yyscanner);	\
-	char *text = parse_events_get_text(yyscanner);		\
-								\
-	if (__alloc)						\
-		__yylval->str = strdup(text);			\
-								\
-	yycolumn -= strlen(text);				\
-	yyless(0);						\
-} while (0)
-
-static int pmu_str_check(yyscan_t scanner, struct parse_events_state *parse_state)
-{
-	YYSTYPE *yylval = parse_events_get_lval(scanner);
-	char *text = parse_events_get_text(scanner);
-
-	yylval->str = strdup(text);
-
-	/*
-	 * If we're not testing then parse check determines the PMU event type
-	 * which if it isn't a PMU returns PE_NAME. When testing the result of
-	 * parse check can't be trusted so we return PE_PMU_EVENT_FAKE unless
-	 * an '!' is present in which case the text can't be a PMU name.
-	 */
-	switch (parse_state->ops->parse_check(text)) {
-		case PMU_EVENT_SYMBOL_PREFIX:
-			return PE_PMU_EVENT_PRE;
-		case PMU_EVENT_SYMBOL_SUFFIX:
-			return PE_PMU_EVENT_SUF;
-		case PMU_EVENT_SYMBOL:
-			return parse_state->fake_pmu
-				? PE_PMU_EVENT_FAKE : PE_KERNEL_PMU_EVENT;
-		default:
-			return parse_state->fake_pmu && !strchr(text,'!')
-				? PE_PMU_EVENT_FAKE : PE_NAME;
-	}
-}
-
-static int sym(yyscan_t scanner, int type, int config)
-{
-	YYSTYPE *yylval = parse_events_get_lval(scanner);
-
-	yylval->num = (type << 16) + config;
-	return type == PERF_TYPE_HARDWARE ? PE_VALUE_SYM_HW : PE_VALUE_SYM_SW;
-}
-
-static int tool(yyscan_t scanner, enum perf_tool_event event)
-{
-	YYSTYPE *yylval = parse_events_get_lval(scanner);
-
-	yylval->num = event;
-	return PE_VALUE_SYM_TOOL;
-}
-
-static int term(yyscan_t scanner, int type)
-{
-	YYSTYPE *yylval = parse_events_get_lval(scanner);
-
-	yylval->num = type;
-	return PE_TERM;
-}
-
-#define YY_USER_ACTION					\
-do {							\
-	yylloc->last_column  = yylloc->first_column;	\
-	yylloc->first_column = yycolumn;		\
-	yycolumn += yyleng;				\
-} while (0);
-
-#define USER_REJECT		\
-	yycolumn -= yyleng;	\
-	REJECT
-
-%}
-
-%x mem
-%s config
-%x event
-%x array
-
-group		[^,{}/]*[{][^}]*[}][^,{}/]*
-event_pmu	[^,{}/]+[/][^/]*[/][^,{}/]*
-event		[^,{}/]+
-bpf_object	[^,{}]+\.(o|bpf)[a-zA-Z0-9._]*
-bpf_source	[^,{}]+\.c[a-zA-Z0-9._]*
-
-num_dec		[0-9]+
-num_hex		0x[a-fA-F0-9]+
-num_raw_hex	[a-fA-F0-9]+
-name		[a-zA-Z_*?\[\]][a-zA-Z0-9_*?.\[\]!]*
-name_tag	[\'][a-zA-Z_*?\[\]][a-zA-Z0-9_*?\-,\.\[\]:=]*[\']
-name_minus	[a-zA-Z_*?][a-zA-Z0-9\-_*?.:]*
-drv_cfg_term	[a-zA-Z0-9_\.]+(=[a-zA-Z0-9_*?\.:]+)?
-/* If you add a modifier you need to update check_modifier() */
-modifier_event	[ukhpPGHSDIWeb]+
-modifier_bp	[rwx]{1,3}
-
-%%
-
-%{
-	struct parse_events_state *_parse_state = parse_events_get_extra(yyscanner);
-
-	{
-		int start_token = _parse_state->stoken;
-
-		if (start_token == PE_START_TERMS)
-			BEGIN(config);
-		else if (start_token == PE_START_EVENTS)
-			BEGIN(event);
-
-		if (start_token) {
-			_parse_state->stoken = 0;
-			/*
-			 * The flex parser does not init locations variable
-			 * via the scan_string interface, so we need do the
-			 * init in here.
-			 */
-			yycolumn = 0;
-			return start_token;
-		}
-         }
-%}
-
-<event>{
-
-{group}		{
-			BEGIN(INITIAL);
-			REWIND(0);
-		}
-
-{event_pmu}	|
-{bpf_object}	|
-{bpf_source}	|
-{event}		{
-			BEGIN(INITIAL);
-			REWIND(1);
-			return PE_EVENT_NAME;
-		}
-
-<<EOF>>		{
-			BEGIN(INITIAL);
-			REWIND(0);
-		}
-,		{
-			return ',';
-		}
-}
-
-<array>{
-"]"			{ BEGIN(config); return ']'; }
-{num_dec}		{ return value(yyscanner, 10); }
-{num_hex}		{ return value(yyscanner, 16); }
-,			{ return ','; }
-"\.\.\."		{ return PE_ARRAY_RANGE; }
-}
-
-<config>{
-	/*
-	 * Please update config_term_names when new static term is added.
-	 */
-config			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG); }
-config1			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG1); }
-config2			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG2); }
-name			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NAME); }
-period			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); }
-freq			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ); }
-branch_type		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); }
-time			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_TIME); }
-call-graph		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CALLGRAPH); }
-stack-size		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_STACKSIZE); }
-max-stack		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_MAX_STACK); }
-nr			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_MAX_EVENTS); }
-inherit			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_INHERIT); }
-no-inherit		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NOINHERIT); }
-overwrite		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_OVERWRITE); }
-no-overwrite		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NOOVERWRITE); }
-percore			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_PERCORE); }
-aux-output		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT); }
-aux-sample-size		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE); }
-metric-id		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_METRIC_ID); }
-r{num_raw_hex}		{ return raw(yyscanner, _parse_state); }
-r0x{num_raw_hex}	{ return raw(yyscanner, _parse_state); }
-,			{ return ','; }
-"/"			{ BEGIN(INITIAL); return '/'; }
-{name_minus}		{ return str(yyscanner, PE_NAME); }
-\[all\]			{ return PE_ARRAY_ALL; }
-"["			{ BEGIN(array); return '['; }
-@{drv_cfg_term}		{ return drv_str(yyscanner, PE_DRV_CFG_TERM); }
-}
-
-<mem>{
-{modifier_bp}		{ return str(yyscanner, PE_MODIFIER_BP); }
-:			{ return ':'; }
-"/"			{ return '/'; }
-{num_dec}		{ return value(yyscanner, 10); }
-{num_hex}		{ return value(yyscanner, 16); }
-	/*
-	 * We need to separate 'mem:' scanner part, in order to get specific
-	 * modifier bits parsed out. Otherwise we would need to handle PE_NAME
-	 * and we'd need to parse it manually. During the escape from <mem>
-	 * state we need to put the escaping char back, so we dont miss it.
-	 */
-.			{ unput(*yytext); BEGIN(INITIAL); }
-	/*
-	 * We destroy the scanner after reaching EOF,
-	 * but anyway just to be sure get back to INIT state.
-	 */
-<<EOF>>			{ BEGIN(INITIAL); }
-}
-
-cpu-cycles|cycles				{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); }
-stalled-cycles-frontend|idle-cycles-frontend	{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }
-stalled-cycles-backend|idle-cycles-backend	{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); }
-instructions					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS); }
-cache-references				{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_REFERENCES); }
-cache-misses					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_MISSES); }
-branch-instructions|branches			{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); }
-branch-misses					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_MISSES); }
-bus-cycles					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BUS_CYCLES); }
-ref-cycles					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_REF_CPU_CYCLES); }
-cpu-clock					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK); }
-task-clock					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_TASK_CLOCK); }
-page-faults|faults				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS); }
-minor-faults					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MIN); }
-major-faults					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MAJ); }
-context-switches|cs				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES); }
-cpu-migrations|migrations			{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS); }
-alignment-faults				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); }
-emulation-faults				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); }
-dummy						{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); }
-duration_time					{ return tool(yyscanner, PERF_TOOL_DURATION_TIME); }
-bpf-output					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_BPF_OUTPUT); }
-cgroup-switches					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CGROUP_SWITCHES); }
-
-	/*
-	 * We have to handle the kernel PMU event cycles-ct/cycles-t/mem-loads/mem-stores separately.
-	 * Because the prefix cycles is mixed up with cpu-cycles.
-	 * loads and stores are mixed up with cache event
-	 */
-cycles-ct				|
-cycles-t				|
-mem-loads				|
-mem-loads-aux				|
-mem-stores				|
-topdown-[a-z-]+				|
-tx-capacity-[a-z-]+			|
-el-capacity-[a-z-]+			{ return str(yyscanner, PE_KERNEL_PMU_EVENT); }
-
-L1-dcache|l1-d|l1d|L1-data		|
-L1-icache|l1-i|l1i|L1-instruction	|
-LLC|L2					|
-dTLB|d-tlb|Data-TLB			|
-iTLB|i-tlb|Instruction-TLB		|
-branch|branches|bpu|btb|bpc		|
-node					{ return str(yyscanner, PE_NAME_CACHE_TYPE); }
-
-load|loads|read				|
-store|stores|write			|
-prefetch|prefetches			|
-speculative-read|speculative-load	|
-refs|Reference|ops|access		|
-misses|miss				{ return str(yyscanner, PE_NAME_CACHE_OP_RESULT); }
-
-mem:			{ BEGIN(mem); return PE_PREFIX_MEM; }
-r{num_raw_hex}		{ return raw(yyscanner, _parse_state); }
-{num_dec}		{ return value(yyscanner, 10); }
-{num_hex}		{ return value(yyscanner, 16); }
-
-{modifier_event}	{ return str(yyscanner, PE_MODIFIER_EVENT); }
-{bpf_object}		{ if (!isbpf(yyscanner)) { USER_REJECT }; return str(yyscanner, PE_BPF_OBJECT); }
-{bpf_source}		{ if (!isbpf(yyscanner)) { USER_REJECT }; return str(yyscanner, PE_BPF_SOURCE); }
-{name}			{ return pmu_str_check(yyscanner, _parse_state); }
-{name_tag}		{ return str(yyscanner, PE_NAME); }
-"/"			{ BEGIN(config); return '/'; }
--			{ return '-'; }
-,			{ BEGIN(event); return ','; }
-:			{ return ':'; }
-"{"			{ BEGIN(event); return '{'; }
-"}"			{ return '}'; }
-=			{ return '='; }
-\n			{ }
-.			{ }
-
-%%
-
-int parse_events_wrap(void *scanner __maybe_unused)
-{
-	return 1;
-}
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
deleted file mode 100644
index 38d29946fa07..000000000000
--- a/tools/perf/util/parse-events.y
+++ /dev/null
@@ -1,992 +0,0 @@
-%define api.pure full
-%parse-param {void *_parse_state}
-%parse-param {void *scanner}
-%lex-param {void* scanner}
-%locations
-
-%{
-
-#define YYDEBUG 1
-
-#include <fnmatch.h>
-#include <stdio.h>
-#include <linux/compiler.h>
-#include <linux/types.h>
-#include <linux/zalloc.h>
-#include "pmu.h"
-#include "evsel.h"
-#include "parse-events.h"
-#include "parse-events-bison.h"
-
-void parse_events_error(YYLTYPE *loc, void *parse_state, void *scanner, char const *msg);
-
-#define ABORT_ON(val) \
-do { \
-	if (val) \
-		YYABORT; \
-} while (0)
-
-static struct list_head* alloc_list(void)
-{
-	struct list_head *list;
-
-	list = malloc(sizeof(*list));
-	if (!list)
-		return NULL;
-
-	INIT_LIST_HEAD(list);
-	return list;
-}
-
-static void free_list_evsel(struct parse_events_state *parse_state,
-			    struct list_head* list_evsel)
-{
-	struct perf_evsel *evsel, *tmp;
-
-	list_for_each_entry_safe(evsel, tmp, list_evsel, node) {
-		list_del_init(&evsel->node);
-		parse_state->ops->perf_evsel__delete(evsel);
-	}
-	free(list_evsel);
-}
-
-/* list_event is assumed to point to malloc'ed memory */
-static void update_lists(struct list_head *list_event,
-			 struct list_head *list_all)
-{
-	/*
-	 * Called for single event definition. Update the
-	 * 'all event' list, and reinit the 'single event'
-	 * list, for next event definition.
-	 */
-	list_splice_tail(list_event, list_all);
-	free(list_event);
-}
-
-static void inc_group_count(struct list_head *list,
-		       struct parse_events_state *parse_state)
-{
-	/* Count groups only have more than 1 members */
-	if (!list_is_last(list->next, list))
-		parse_state->nr_groups++;
-}
-
-static int loc_term(void *loc_term_)
-{
-	YYLTYPE *loc_term = loc_term_;
-
-	return loc_term ? loc_term->first_column : 0;
-}
-
-static int loc_val(void *loc_val_)
-{
-	YYLTYPE *loc_val = loc_val_;
-
-	return loc_val ? loc_val->first_column  : 0;
-}
-
-%}
-
-%token PE_START_EVENTS PE_START_TERMS
-%token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_RAW PE_TERM
-%token PE_VALUE_SYM_TOOL
-%token PE_EVENT_NAME
-%token PE_NAME
-%token PE_BPF_OBJECT PE_BPF_SOURCE
-%token PE_MODIFIER_EVENT PE_MODIFIER_BP
-%token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT
-%token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP
-%token PE_ERROR
-%token PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT PE_PMU_EVENT_FAKE
-%token PE_ARRAY_ALL PE_ARRAY_RANGE
-%token PE_DRV_CFG_TERM
-%type <num> PE_VALUE
-%type <num> PE_VALUE_SYM_HW
-%type <num> PE_VALUE_SYM_SW
-%type <num> PE_VALUE_SYM_TOOL
-%type <num> PE_RAW
-%type <num> PE_TERM
-%type <num> value_sym
-%type <str> PE_NAME
-%type <str> PE_BPF_OBJECT
-%type <str> PE_BPF_SOURCE
-%type <str> PE_NAME_CACHE_TYPE
-%type <str> PE_NAME_CACHE_OP_RESULT
-%type <str> PE_MODIFIER_EVENT
-%type <str> PE_MODIFIER_BP
-%type <str> PE_EVENT_NAME
-%type <str> PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT PE_PMU_EVENT_FAKE
-%type <str> PE_DRV_CFG_TERM
-%type <str> event_pmu_name
-%destructor { free ($$); } <str>
-%type <term> event_term
-%destructor { parse_events_term__delete ($$); } <term>
-%type <list_terms> event_config
-%type <list_terms> opt_event_config
-%type <list_terms> opt_pmu_config
-%destructor { parse_events_terms__delete ($$); } <list_terms>
-%type <list_evsel> event_pmu
-%type <list_evsel> event_legacy_symbol
-%type <list_evsel> event_legacy_cache
-%type <list_evsel> event_legacy_mem
-%type <list_evsel> event_legacy_tracepoint
-%type <list_evsel> event_legacy_numeric
-%type <list_evsel> event_legacy_raw
-%type <list_evsel> event_bpf_file
-%type <list_evsel> event_def
-%type <list_evsel> event_mod
-%type <list_evsel> event_name
-%type <list_evsel> event
-%type <list_evsel> events
-%type <list_evsel> group_def
-%type <list_evsel> group
-%type <list_evsel> groups
-%destructor { free_list_evsel (_parse_state, $$); } <list_evsel>
-%type <tracepoint_name> tracepoint_name
-%destructor { free ($$.sys); free ($$.event); } <tracepoint_name>
-%type <array> array
-%type <array> array_term
-%type <array> array_terms
-%destructor { free ($$.ranges); } <array>
-
-%union
-{
-	char *str;
-	u64 num;
-	struct list_head *list_evsel;
-	struct list_head *list_terms;
-	struct parse_events_term *term;
-	struct tracepoint_name {
-		char *sys;
-		char *event;
-	} tracepoint_name;
-	struct parse_events_array array;
-}
-%%
-
-start:
-PE_START_EVENTS start_events
-|
-PE_START_TERMS  start_terms
-
-start_events: groups
-{
-	struct parse_events_state *parse_state = _parse_state;
-
-	/* frees $1 */
-	update_lists($1, &parse_state->list);
-}
-
-groups:
-groups ',' group
-{
-	struct list_head *list  = $1;
-	struct list_head *group = $3;
-
-	/* frees $3 */
-	update_lists(group, list);
-	$$ = list;
-}
-|
-groups ',' event
-{
-	struct list_head *list  = $1;
-	struct list_head *event = $3;
-
-	/* frees $3 */
-	update_lists(event, list);
-	$$ = list;
-}
-|
-group
-|
-event
-
-group:
-group_def ':' PE_MODIFIER_EVENT
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list = $1;
-	int err;
-
-	err = parse_events__modifier_group(list, $3, parse_state->guest);
-	free($3);
-	if (err) {
-		struct parse_events_error *error = parse_state->error;
-
-		parse_events__handle_error(error, @3.first_column,
-					   strdup("Bad modifier"), NULL);
-		free_list_evsel(parse_state, list);
-		YYABORT;
-	}
-	$$ = list;
-}
-|
-group_def
-
-group_def:
-PE_NAME '{' events '}'
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list = $3;
-
-	inc_group_count(list, _parse_state);
-	parse_state->ops->set_leader($1, list, parse_state);
-	free($1);
-	$$ = list;
-}
-|
-'{' events '}'
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list = $2;
-
-	inc_group_count(list, _parse_state);
-	parse_state->ops->set_leader(NULL, list, parse_state);
-	$$ = list;
-}
-
-events:
-events ',' event
-{
-	struct list_head *event = $3;
-	struct list_head *list  = $1;
-
-	/* frees $3 */
-	update_lists(event, list);
-	$$ = list;
-}
-|
-event
-
-event: event_mod
-
-event_mod:
-event_name PE_MODIFIER_EVENT
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list = $1;
-	int err;
-
-	/*
-	 * Apply modifier on all events added by single event definition
-	 * (there could be more events added for multiple tracepoint
-	 * definitions via '*?'.
-	 */
-	err = parse_events__modifier_event(list, $2, false, parse_state->guest);
-	free($2);
-	if (err) {
-		struct parse_events_error *error = parse_state->error;
-
-		parse_events__handle_error(error, @2.first_column,
-					   strdup("Bad modifier"), NULL);
-		free_list_evsel(parse_state, list);
-		YYABORT;
-	}
-	$$ = list;
-}
-|
-event_name
-
-event_name:
-PE_EVENT_NAME event_def
-{
-	int err;
-
-	err = parse_events_name($2, $1);
-	free($1);
-	if (err) {
-		free_list_evsel(_parse_state, $2);
-		YYABORT;
-	}
-	$$ = $2;
-}
-|
-event_def
-
-event_def: event_pmu |
-	   event_legacy_symbol |
-	   event_legacy_cache sep_dc |
-	   event_legacy_mem |
-	   event_legacy_tracepoint sep_dc |
-	   event_legacy_numeric sep_dc |
-	   event_legacy_raw sep_dc |
-	   event_bpf_file
-
-event_pmu_name:
-PE_NAME | PE_PMU_EVENT_PRE
-
-event_pmu:
-event_pmu_name opt_pmu_config
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct parse_events_error *error = parse_state->error;
-	struct list_head *list = NULL, *orig_terms = NULL;
-
-#define CLEANUP_YYABORT					\
-	do {						\
-		parse_events_terms__delete($2);		\
-		parse_events_terms__delete(orig_terms);	\
-		free(list);				\
-		free($1);				\
-		YYABORT;				\
-	} while(0)
-
-	if (parse_events_copy_term_list($2, &orig_terms))
-		CLEANUP_YYABORT;
-
-	if (error)
-		error->idx = @1.first_column;
-
-	list = alloc_list();
-	if (!list)
-		CLEANUP_YYABORT;
-	if (parse_state->ops->add_pmu(parse_state, list, $1, $2, orig_terms, false, false))
-		CLEANUP_YYABORT;
-	parse_events_terms__delete($2);
-	parse_events_terms__delete(orig_terms);
-	free($1);
-	$$ = list;
-#undef CLEANUP_YYABORT
-}
-|
-PE_KERNEL_PMU_EVENT sep_dc
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list;
-	int err;
-
-	err = parse_state->ops->add_pmu_multi(parse_state, $1, NULL, &list);
-	free($1);
-	if (err < 0)
-		YYABORT;
-	$$ = list;
-}
-|
-PE_KERNEL_PMU_EVENT opt_pmu_config
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list;
-	int err;
-
-	/* frees $2 */
-	err = parse_state->ops->add_pmu_multi(_parse_state, $1, $2, &list);
-	free($1);
-	if (err < 0)
-		YYABORT;
-	$$ = list;
-}
-|
-PE_PMU_EVENT_PRE '-' PE_PMU_EVENT_SUF sep_dc
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list;
-	char pmu_name[128];
-
-	snprintf(pmu_name, sizeof(pmu_name), "%s-%s", $1, $3);
-	free($1);
-	free($3);
-	if (parse_state->ops->add_pmu_multi(_parse_state, pmu_name, NULL, &list) < 0)
-		YYABORT;
-	$$ = list;
-}
-|
-PE_PMU_EVENT_FAKE sep_dc
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list;
-	int err;
-
-	list = alloc_list();
-	if (!list)
-		YYABORT;
-
-	err = parse_state->ops->add_pmu(parse_state, list, $1, NULL, NULL, false, false);
-	free($1);
-	if (err < 0) {
-		free(list);
-		YYABORT;
-	}
-	$$ = list;
-}
-|
-PE_PMU_EVENT_FAKE opt_pmu_config
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list;
-	int err;
-
-	list = alloc_list();
-	if (!list)
-		YYABORT;
-
-	err = parse_state->ops->add_pmu(parse_state, list, $1, $2, NULL, false, false);
-	free($1);
-	parse_events_terms__delete($2);
-	if (err < 0) {
-		free(list);
-		YYABORT;
-	}
-	$$ = list;
-}
-
-value_sym:
-PE_VALUE_SYM_HW
-|
-PE_VALUE_SYM_SW
-
-event_legacy_symbol:
-value_sym '/' event_config '/'
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list;
-	int type = $1 >> 16;
-	int config = $1 & 255;
-	int err;
-
-	list = alloc_list();
-	ABORT_ON(!list);
-	err = parse_state->ops->add_numeric(parse_state, list, type, config, $3);
-	parse_events_terms__delete($3);
-	if (err) {
-		free_list_evsel(_parse_state, list);
-		YYABORT;
-	}
-	$$ = list;
-}
-|
-value_sym sep_slash_slash_dc
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list;
-	int type = $1 >> 16;
-	int config = $1 & 255;
-
-	list = alloc_list();
-	ABORT_ON(!list);
-	ABORT_ON(parse_state->ops->add_numeric(parse_state, list, type, config, NULL));
-	$$ = list;
-}
-|
-PE_VALUE_SYM_TOOL sep_slash_slash_dc
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list;
-
-	list = alloc_list();
-	ABORT_ON(!list);
-	ABORT_ON(parse_state->ops->add_tool(_parse_state, list, $1));
-	$$ = list;
-}
-
-event_legacy_cache:
-PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT opt_event_config
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct parse_events_error *error = parse_state->error;
-	struct list_head *list;
-	int err;
-
-	list = alloc_list();
-	ABORT_ON(!list);
-	err = parse_state->ops->add_cache(parse_state, list, $1, $3, $5, error, $6);
-	parse_events_terms__delete($6);
-	free($1);
-	free($3);
-	free($5);
-	if (err) {
-		free_list_evsel(parse_state, list);
-		YYABORT;
-	}
-	$$ = list;
-}
-|
-PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT opt_event_config
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct parse_events_error *error = parse_state->error;
-	struct list_head *list;
-	int err;
-
-	list = alloc_list();
-	ABORT_ON(!list);
-	err = parse_state->ops->add_cache(parse_state, list, $1, $3, NULL, error, $4);
-	parse_events_terms__delete($4);
-	free($1);
-	free($3);
-	if (err) {
-		free_list_evsel(parse_state, list);
-		YYABORT;
-	}
-	$$ = list;
-}
-|
-PE_NAME_CACHE_TYPE opt_event_config
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct parse_events_error *error = parse_state->error;
-	struct list_head *list;
-	int err;
-
-	list = alloc_list();
-	ABORT_ON(!list);
-	err = parse_state->ops->add_cache(parse_state, list, $1, NULL, NULL, error, $2);
-	parse_events_terms__delete($2);
-	free($1);
-	if (err) {
-		free_list_evsel(parse_state, list);
-		YYABORT;
-	}
-	$$ = list;
-}
-
-event_legacy_mem:
-PE_PREFIX_MEM PE_VALUE '/' PE_VALUE ':' PE_MODIFIER_BP sep_dc
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list;
-	int err;
-
-	list = alloc_list();
-	ABORT_ON(!list);
-	err = parse_state->ops->add_breakpoint(parse_state, list, $2, $6, $4);
-	free($6);
-	if (err) {
-		free(list);
-		YYABORT;
-	}
-	$$ = list;
-}
-|
-PE_PREFIX_MEM PE_VALUE '/' PE_VALUE sep_dc
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list;
-
-	list = alloc_list();
-	ABORT_ON(!list);
-	if (parse_state->ops->add_breakpoint(parse_state, list, $2, NULL, $4)) {
-		free(list);
-		YYABORT;
-	}
-	$$ = list;
-}
-|
-PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list;
-	int err;
-
-	list = alloc_list();
-	ABORT_ON(!list);
-	err = parse_state->ops->add_breakpoint(parse_state, list, $2, $4, 0);
-	free($4);
-	if (err) {
-		free(list);
-		YYABORT;
-	}
-	$$ = list;
-}
-|
-PE_PREFIX_MEM PE_VALUE sep_dc
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list;
-
-	list = alloc_list();
-	ABORT_ON(!list);
-	if (parse_state->ops->add_breakpoint(parse_state, list, $2, NULL, 0)) {
-		free(list);
-		YYABORT;
-	}
-	$$ = list;
-}
-
-event_legacy_tracepoint:
-tracepoint_name opt_event_config
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct parse_events_error *error = parse_state->error;
-	struct list_head *list;
-	int err;
-
-	list = alloc_list();
-	ABORT_ON(!list);
-	if (error)
-		error->idx = @1.first_column;
-
-	err = parse_state->ops->add_tracepoint(parse_state, list, $1.sys, $1.event,
-					       error, $2);
-
-	parse_events_terms__delete($2);
-	free($1.sys);
-	free($1.event);
-	if (err) {
-		free(list);
-		YYABORT;
-	}
-	$$ = list;
-}
-
-tracepoint_name:
-PE_NAME '-' PE_NAME ':' PE_NAME
-{
-	struct tracepoint_name tracepoint;
-
-	ABORT_ON(asprintf(&tracepoint.sys, "%s-%s", $1, $3) < 0);
-	tracepoint.event = $5;
-	free($1);
-	free($3);
-	$$ = tracepoint;
-}
-|
-PE_NAME ':' PE_NAME
-{
-	struct tracepoint_name tracepoint = {$1, $3};
-
-	$$ = tracepoint;
-}
-
-event_legacy_numeric:
-PE_VALUE ':' PE_VALUE opt_event_config
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list;
-	int err;
-
-	list = alloc_list();
-	ABORT_ON(!list);
-	err = parse_state->ops->add_numeric(_parse_state, list, (u32)$1, $3, $4);
-	parse_events_terms__delete($4);
-	if (err) {
-		free(list);
-		YYABORT;
-	}
-	$$ = list;
-}
-
-event_legacy_raw:
-PE_RAW opt_event_config
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list;
-	int err;
-
-	list = alloc_list();
-	ABORT_ON(!list);
-	err = parse_state->ops->add_numeric(_parse_state, list, PERF_TYPE_RAW, $1, $2);
-	parse_events_terms__delete($2);
-	if (err) {
-		free(list);
-		YYABORT;
-	}
-	$$ = list;
-}
-
-event_bpf_file:
-PE_BPF_OBJECT opt_event_config
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list;
-	int err;
-
-	list = alloc_list();
-	ABORT_ON(!list);
-	err = parse_state->ops->add_bpf(parse_state, list, $1, false, $2);
-	parse_events_terms__delete($2);
-	free($1);
-	if (err) {
-		free(list);
-		YYABORT;
-	}
-	$$ = list;
-}
-|
-PE_BPF_SOURCE opt_event_config
-{
-	struct parse_events_state *parse_state = _parse_state;
-	struct list_head *list;
-	int err;
-
-	list = alloc_list();
-	ABORT_ON(!list);
-	err = parse_state->ops->add_bpf(parse_state, list, $1, true, $2);
-	parse_events_terms__delete($2);
-	if (err) {
-		free(list);
-		YYABORT;
-	}
-	$$ = list;
-}
-
-opt_event_config:
-'/' event_config '/'
-{
-	$$ = $2;
-}
-|
-'/' '/'
-{
-	$$ = NULL;
-}
-|
-{
-	$$ = NULL;
-}
-
-opt_pmu_config:
-'/' event_config '/'
-{
-	$$ = $2;
-}
-|
-'/' '/'
-{
-	$$ = NULL;
-}
-
-start_terms: event_config
-{
-	struct parse_events_state *parse_state = _parse_state;
-	if (parse_state->terms) {
-		parse_events_terms__delete ($1);
-		YYABORT;
-	}
-	parse_state->terms = $1;
-}
-
-event_config:
-event_config ',' event_term
-{
-	struct list_head *head = $1;
-	struct parse_events_term *term = $3;
-
-	if (!head) {
-		parse_events_term__delete(term);
-		YYABORT;
-	}
-	list_add_tail(&term->list, head);
-	$$ = $1;
-}
-|
-event_term
-{
-	struct list_head *head = malloc(sizeof(*head));
-	struct parse_events_term *term = $1;
-
-	ABORT_ON(!head);
-	INIT_LIST_HEAD(head);
-	list_add_tail(&term->list, head);
-	$$ = head;
-}
-
-event_term:
-PE_RAW
-{
-	struct parse_events_term *term;
-
-	ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_CONFIG,
-					NULL, $1, false, loc_term(&@1), 0));
-	$$ = term;
-}
-|
-PE_NAME '=' PE_NAME
-{
-	struct parse_events_term *term;
-
-	if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
-					$1, $3, loc_term(&@1), loc_val(&@3))) {
-		free($1);
-		free($3);
-		YYABORT;
-	}
-	$$ = term;
-}
-|
-PE_NAME '=' PE_VALUE
-{
-	struct parse_events_term *term;
-
-	if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
-					$1, $3, false, loc_term(&@1), loc_val(&@3))) {
-		free($1);
-		YYABORT;
-	}
-	$$ = term;
-}
-|
-PE_NAME '=' PE_VALUE_SYM_HW
-{
-	struct parse_events_term *term;
-	int config = $3 & 255;
-
-	if (parse_events_term__sym_hw(&term, $1, config)) {
-		free($1);
-		YYABORT;
-	}
-	$$ = term;
-}
-|
-PE_NAME
-{
-	struct parse_events_term *term;
-
-	if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
-					$1, 1, true, loc_term(&@1), 0)) {
-		free($1);
-		YYABORT;
-	}
-	$$ = term;
-}
-|
-PE_VALUE_SYM_HW
-{
-	struct parse_events_term *term;
-	int config = $1 & 255;
-
-	ABORT_ON(parse_events_term__sym_hw(&term, NULL, config));
-	$$ = term;
-}
-|
-PE_TERM '=' PE_NAME
-{
-	struct parse_events_term *term;
-
-	if (parse_events_term__str(&term, (int)$1, NULL, $3,
-				   loc_term(&@1), loc_val(&@3))) {
-		free($3);
-		YYABORT;
-	}
-	$$ = term;
-}
-|
-PE_TERM '=' PE_VALUE
-{
-	struct parse_events_term *term;
-
-	ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3, false,
-					loc_term(&@1), loc_val(&@3)));
-	$$ = term;
-}
-|
-PE_TERM
-{
-	struct parse_events_term *term;
-
-	ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1, true, loc_term(&@1), 0));
-	$$ = term;
-}
-|
-PE_NAME array '=' PE_NAME
-{
-	struct parse_events_term *term;
-
-	if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
-					$1, $4, loc_term(&@1), loc_val(&@4))) {
-		free($1);
-		free($4);
-		free($2.ranges);
-		YYABORT;
-	}
-	term->array = $2;
-	$$ = term;
-}
-|
-PE_NAME array '=' PE_VALUE
-{
-	struct parse_events_term *term;
-
-	if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
-					$1, $4, false, loc_term(&@1), loc_val(&@4))) {
-		free($1);
-		free($2.ranges);
-		YYABORT;
-	}
-	term->array = $2;
-	$$ = term;
-}
-|
-PE_DRV_CFG_TERM
-{
-	struct parse_events_term *term;
-	char *config = strdup($1);
-
-	ABORT_ON(!config);
-	if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_DRV_CFG,
-					config, $1, loc_term(&@1), 0)) {
-		free($1);
-		free(config);
-		YYABORT;
-	}
-	$$ = term;
-}
-
-array:
-'[' array_terms ']'
-{
-	$$ = $2;
-}
-|
-PE_ARRAY_ALL
-{
-	$$.nr_ranges = 0;
-	$$.ranges = NULL;
-}
-
-array_terms:
-array_terms ',' array_term
-{
-	struct parse_events_array new_array;
-
-	new_array.nr_ranges = $1.nr_ranges + $3.nr_ranges;
-	new_array.ranges = realloc($1.ranges,
-				sizeof(new_array.ranges[0]) *
-				new_array.nr_ranges);
-	ABORT_ON(!new_array.ranges);
-	memcpy(&new_array.ranges[$1.nr_ranges], $3.ranges,
-	       $3.nr_ranges * sizeof(new_array.ranges[0]));
-	free($3.ranges);
-	$$ = new_array;
-}
-|
-array_term
-
-array_term:
-PE_VALUE
-{
-	struct parse_events_array array;
-
-	array.nr_ranges = 1;
-	array.ranges = malloc(sizeof(array.ranges[0]));
-	ABORT_ON(!array.ranges);
-	array.ranges[0].start = $1;
-	array.ranges[0].length = 1;
-	$$ = array;
-}
-|
-PE_VALUE PE_ARRAY_RANGE PE_VALUE
-{
-	struct parse_events_array array;
-
-	ABORT_ON($3 < $1);
-	array.nr_ranges = 1;
-	array.ranges = malloc(sizeof(array.ranges[0]));
-	ABORT_ON(!array.ranges);
-	array.ranges[0].start = $1;
-	array.ranges[0].length = $3 - $1 + 1;
-	$$ = array;
-}
-
-sep_dc: ':' |
-
-sep_slash_slash_dc: '/' '/' | ':' |
-
-%%
-
-void parse_events_error(YYLTYPE *loc, void *parse_state,
-			void *scanner __maybe_unused,
-			char const *msg __maybe_unused)
-{
-	parse_events_evlist_error(parse_state, loc->last_column, "parser error");
-}
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 56/59] libperf: Move in parse_events_add_breakpoint function
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (53 preceding siblings ...)
  2021-11-08 13:37 ` [PATCH 55/59] libperf: Move in parse-events flex/bison parser Jiri Olsa
@ 2021-11-08 13:37 ` Jiri Olsa
  2021-11-08 13:37 ` [PATCH 57/59] libperf: Move in some lib objects from perf Jiri Olsa
                   ` (3 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:37 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Moving parse_events_add_breakpoint function to libperf.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 .../lib/perf/include/internal/parse-events.h  |  3 +
 tools/lib/perf/parse-events.c                 | 72 +++++++++++++++++++
 tools/perf/util/parse-events.c                | 70 ------------------
 3 files changed, 75 insertions(+), 70 deletions(-)

diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
index 5020a1b2bff2..e6af1ad6e7ac 100644
--- a/tools/lib/perf/include/internal/parse-events.h
+++ b/tools/lib/perf/include/internal/parse-events.h
@@ -197,4 +197,7 @@ int parse_events_name(struct list_head *list, const char *name);
 int parse_events__scanner(const char *str,
 			  struct parse_events_state *parse_state,
 			  bool terms);
+int parse_events_add_breakpoint(struct parse_events_state *parse_state,
+				struct list_head *list,
+				u64 addr, char *type, u64 len);
 #endif /* __LIBPERF_PARSE_EVENTS_H */
diff --git a/tools/lib/perf/parse-events.c b/tools/lib/perf/parse-events.c
index da684023b273..1c1fbbeb7182 100644
--- a/tools/lib/perf/parse-events.c
+++ b/tools/lib/perf/parse-events.c
@@ -2,6 +2,7 @@
 
 #include <internal/parse-events.h>
 #include <linux/perf_event.h>
+#include <linux/hw_breakpoint.h>
 #include <linux/zalloc.h>
 #include <string.h>
 #include <internal/parse-events.h>
@@ -630,3 +631,74 @@ int parse_events__scanner(const char *str,
 	parse_events_lex_destroy(scanner);
 	return ret;
 }
+
+static int
+parse_breakpoint_type(const char *type, struct perf_event_attr *attr)
+{
+	int i;
+
+	for (i = 0; i < 3; i++) {
+		if (!type || !type[i])
+			break;
+
+#define CHECK_SET_TYPE(bit)		\
+do {					\
+	if (attr->bp_type & bit)	\
+		return -EINVAL;		\
+	else				\
+		attr->bp_type |= bit;	\
+} while (0)
+
+		switch (type[i]) {
+		case 'r':
+			CHECK_SET_TYPE(HW_BREAKPOINT_R);
+			break;
+		case 'w':
+			CHECK_SET_TYPE(HW_BREAKPOINT_W);
+			break;
+		case 'x':
+			CHECK_SET_TYPE(HW_BREAKPOINT_X);
+			break;
+		default:
+			return -EINVAL;
+		}
+	}
+
+#undef CHECK_SET_TYPE
+
+	if (!attr->bp_type) /* Default */
+		attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W;
+
+	return 0;
+}
+
+int parse_events_add_breakpoint(struct parse_events_state *parse_state,
+				struct list_head *list,
+				u64 addr, char *type, u64 len)
+{
+	struct perf_event_attr attr;
+
+	memset(&attr, 0, sizeof(attr));
+	attr.bp_addr = addr;
+
+	if (parse_breakpoint_type(type, &attr))
+		return -EINVAL;
+
+	/* Provide some defaults if len is not specified */
+	if (!len) {
+		if (attr.bp_type == HW_BREAKPOINT_X)
+			len = sizeof(long);
+		else
+			len = HW_BREAKPOINT_LEN_4;
+	}
+
+	attr.bp_len = len;
+
+	attr.type = PERF_TYPE_BREAKPOINT;
+	attr.sample_period = 1;
+
+	return perf_evsel__add_event(parse_state, list, &attr,
+				     /*init_attr*/true, /*name=*/NULL, /*mertic_id=*/NULL,
+				     /*pmu=*/NULL, /*config_terms=*/NULL,
+				     /*auto_merge_stats=*/false, /*cpu_list=*/NULL) ? 0 : -ENOENT;
+}
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 44980b34e367..02f46689f483 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -844,76 +844,6 @@ int parse_events_load_bpf(struct parse_events_state *parse_state,
 }
 #endif // HAVE_LIBBPF_SUPPORT
 
-static int
-parse_breakpoint_type(const char *type, struct perf_event_attr *attr)
-{
-	int i;
-
-	for (i = 0; i < 3; i++) {
-		if (!type || !type[i])
-			break;
-
-#define CHECK_SET_TYPE(bit)		\
-do {					\
-	if (attr->bp_type & bit)	\
-		return -EINVAL;		\
-	else				\
-		attr->bp_type |= bit;	\
-} while (0)
-
-		switch (type[i]) {
-		case 'r':
-			CHECK_SET_TYPE(HW_BREAKPOINT_R);
-			break;
-		case 'w':
-			CHECK_SET_TYPE(HW_BREAKPOINT_W);
-			break;
-		case 'x':
-			CHECK_SET_TYPE(HW_BREAKPOINT_X);
-			break;
-		default:
-			return -EINVAL;
-		}
-	}
-
-#undef CHECK_SET_TYPE
-
-	if (!attr->bp_type) /* Default */
-		attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W;
-
-	return 0;
-}
-
-static
-int parse_events_add_breakpoint(struct parse_events_state *parse_state,
-				struct list_head *list,
-				u64 addr, char *type, u64 len)
-{
-	struct perf_event_attr attr;
-
-	memset(&attr, 0, sizeof(attr));
-	attr.bp_addr = addr;
-
-	if (parse_breakpoint_type(type, &attr))
-		return -EINVAL;
-
-	/* Provide some defaults if len is not specified */
-	if (!len) {
-		if (attr.bp_type == HW_BREAKPOINT_X)
-			len = sizeof(long);
-		else
-			len = HW_BREAKPOINT_LEN_4;
-	}
-
-	attr.bp_len = len;
-
-	attr.type = PERF_TYPE_BREAKPOINT;
-	attr.sample_period = 1;
-
-	return add_event(parse_state, list, &attr, /*name=*/NULL, /*mertic_id=*/NULL,
-			 /*config_terms=*/NULL);
-}
-
 static int check_type_val(struct parse_events_term *term,
 			  struct parse_events_error *err,
 			  int type)
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 57/59] libperf: Move in some lib objects from perf
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (54 preceding siblings ...)
  2021-11-08 13:37 ` [PATCH 56/59] libperf: Move in parse_events_add_breakpoint function Jiri Olsa
@ 2021-11-08 13:37 ` Jiri Olsa
  2021-11-08 13:37 ` [PATCH 58/59] libperf: Add libperf_parse_events function Jiri Olsa
                   ` (2 subsequent siblings)
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:37 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

New libperf code needs several libapi objects,
moving them from perf in libperf.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/Build  | 24 ++++++++++++++++++++++++
 tools/perf/util/Build | 23 -----------------------
 2 files changed, 24 insertions(+), 23 deletions(-)

diff --git a/tools/lib/perf/Build b/tools/lib/perf/Build
index 3e29d173e0ec..06ea39ee84ac 100644
--- a/tools/lib/perf/Build
+++ b/tools/lib/perf/Build
@@ -14,11 +14,35 @@ libperf-y += pmu-hybrid.o
 libperf-y += parse-events.o
 libperf-y += parse-events-flex.o
 libperf-y += parse-events-bison.o
+libperf-y += bitmap.o
+libperf-y += find_bit.o
+libperf-y += vsprintf.o
+libperf-y += hweight.o
 
 $(OUTPUT)zalloc.o: ../../lib/zalloc.c FORCE
 	$(call rule_mkdir)
 	$(call if_changed_dep,cc_o_c)
 
+$(OUTPUT)bitmap.o: ../../lib/bitmap.c FORCE
+	$(call rule_mkdir)
+	$(call if_changed_dep,cc_o_c)
+
+$(OUTPUT)find_bit.o: ../../lib/find_bit.c FORCE
+	$(call rule_mkdir)
+	$(call if_changed_dep,cc_o_c)
+
+$(OUTPUT)vsprintf.o: ../../lib/vsprintf.c FORCE
+	$(call rule_mkdir)
+	$(call if_changed_dep,cc_o_c)
+
+$(OUTPUT)hweight.o: ../../lib/hweight.c FORCE
+	$(call rule_mkdir)
+	$(call if_changed_dep,cc_o_c)
+
+CFLAGS_bitmap.o   += -Wno-unused-parameter
+CFLAGS_find_bit.o += -Wno-unused-parameter
+CFLAGS_hweight.o  += -Wno-unused-parameter
+
 tests-y += tests/
 
 $(OUTPUT)parse-events-flex.c $(OUTPUT)parse-events-flex.h: parse-events.l $(OUTPUT)parse-events-bison.c
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index ad9e2de899da..fdafde48dad1 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -16,7 +16,6 @@ perf-y += evsel.o
 perf-y += evsel_fprintf.o
 perf-y += perf_event_attr_fprintf.o
 perf-y += evswitch.o
-perf-y += find_bit.o
 perf-y += get_current_dir_name.o
 perf-y += kallsyms.o
 perf-y += levenshtein.o
@@ -32,8 +31,6 @@ perf-y += rlimit.o
 perf-y += argv_split.o
 perf-y += rbtree.o
 perf-y += libstring.o
-perf-y += bitmap.o
-perf-y += hweight.o
 perf-y += smt.o
 perf-y += strbuf.o
 perf-y += string.o
@@ -123,7 +120,6 @@ perf-y += term.o
 perf-y += help-unknown-cmd.o
 perf-y += dlfilter.o
 perf-y += mem-events.o
-perf-y += vsprintf.o
 perf-y += units.o
 perf-y += time-utils.o
 perf-y += expr-flex.o
@@ -240,11 +236,8 @@ CFLAGS_expr-bison.o         += -DYYLTYPE_IS_TRIVIAL=0 $(bison_flags)
 
 $(OUTPUT)util/expr.o: $(OUTPUT)util/expr-flex.c $(OUTPUT)util/expr-bison.c
 
-CFLAGS_bitmap.o        += -Wno-unused-parameter -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))"
-CFLAGS_find_bit.o      += -Wno-unused-parameter -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))"
 CFLAGS_rbtree.o        += -Wno-unused-parameter -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))"
 CFLAGS_libstring.o     += -Wno-unused-parameter -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))"
-CFLAGS_hweight.o       += -Wno-unused-parameter -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))"
 CFLAGS_parse-events.o  += -Wno-redundant-decls
 CFLAGS_expr.o          += -Wno-redundant-decls
 CFLAGS_header.o        += -include $(OUTPUT)PERF-VERSION-FILE
@@ -257,18 +250,10 @@ $(OUTPUT)util/argv_split.o: ../lib/argv_split.c FORCE
 	$(call rule_mkdir)
 	$(call if_changed_dep,cc_o_c)
 
-$(OUTPUT)util/bitmap.o: ../lib/bitmap.c FORCE
-	$(call rule_mkdir)
-	$(call if_changed_dep,cc_o_c)
-
 $(OUTPUT)util/ctype.o: ../lib/ctype.c FORCE
 	$(call rule_mkdir)
 	$(call if_changed_dep,cc_o_c)
 
-$(OUTPUT)util/find_bit.o: ../lib/find_bit.c FORCE
-	$(call rule_mkdir)
-	$(call if_changed_dep,cc_o_c)
-
 $(OUTPUT)util/rbtree.o: ../lib/rbtree.c FORCE
 	$(call rule_mkdir)
 	$(call if_changed_dep,cc_o_c)
@@ -277,14 +262,6 @@ $(OUTPUT)util/libstring.o: ../lib/string.c FORCE
 	$(call rule_mkdir)
 	$(call if_changed_dep,cc_o_c)
 
-$(OUTPUT)util/hweight.o: ../lib/hweight.c FORCE
-	$(call rule_mkdir)
-	$(call if_changed_dep,cc_o_c)
-
-$(OUTPUT)util/vsprintf.o: ../lib/vsprintf.c FORCE
-	$(call rule_mkdir)
-	$(call if_changed_dep,cc_o_c)
-
 $(OUTPUT)util/list_sort.o: ../lib/list_sort.c FORCE
 	$(call rule_mkdir)
 	$(call if_changed_dep,cc_o_c)
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 58/59] libperf: Add libperf_parse_events function
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (55 preceding siblings ...)
  2021-11-08 13:37 ` [PATCH 57/59] libperf: Move in some lib objects from perf Jiri Olsa
@ 2021-11-08 13:37 ` Jiri Olsa
  2021-11-08 13:37 ` [PATCH 59/59] libperf: Add parse-events test Jiri Olsa
  2021-11-08 18:50 ` [RFC 00/59] libperf: Move in event parse code Ian Rogers
  58 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:37 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Adding libperf_parse_events function.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/include/perf/evlist.h |   2 +
 tools/lib/perf/libperf.map           |   1 +
 tools/lib/perf/parse-events.c        | 171 +++++++++++++++++++++++++++
 3 files changed, 174 insertions(+)

diff --git a/tools/lib/perf/include/perf/evlist.h b/tools/lib/perf/include/perf/evlist.h
index 9ca399d49bb4..360443dd4135 100644
--- a/tools/lib/perf/include/perf/evlist.h
+++ b/tools/lib/perf/include/perf/evlist.h
@@ -47,4 +47,6 @@ LIBPERF_API struct perf_mmap *perf_evlist__next_mmap(struct perf_evlist *evlist,
 	     (pos) = perf_evlist__next_mmap((evlist), (pos), overwrite))
 
 LIBPERF_API void perf_evlist__set_leader(struct perf_evlist *evlist);
+
+LIBPERF_API int libperf_parse_events(struct perf_evlist *evlist, const char *str);
 #endif /* __LIBPERF_EVLIST_H */
diff --git a/tools/lib/perf/libperf.map b/tools/lib/perf/libperf.map
index 71468606e8a7..8971431071f2 100644
--- a/tools/lib/perf/libperf.map
+++ b/tools/lib/perf/libperf.map
@@ -50,6 +50,7 @@ LIBPERF_0.0.1 {
 		perf_mmap__read_init;
 		perf_mmap__read_done;
 		perf_mmap__read_event;
+		libperf_parse_events;
 	local:
 		*;
 };
diff --git a/tools/lib/perf/parse-events.c b/tools/lib/perf/parse-events.c
index 1c1fbbeb7182..d165c33fed83 100644
--- a/tools/lib/perf/parse-events.c
+++ b/tools/lib/perf/parse-events.c
@@ -10,6 +10,8 @@
 #include <internal/evlist.h>
 #include <internal/evsel.h>
 #include <perf/cpumap.h>
+#include <perf/evlist.h>
+#include <perf/evsel.h>
 #include <stdlib.h>
 #include <errno.h>
 #include <asm/bug.h>
@@ -702,3 +704,172 @@ int parse_events_add_breakpoint(struct parse_events_state *parse_state,
 				     /*pmu=*/NULL, /*config_terms=*/NULL,
 				     /*auto_merge_stats=*/false, /*cpu_list=*/NULL) ? 0 : -ENOENT;
 }
+
+static struct perf_evsel*
+perf_evsel__new_idx(struct perf_event_attr *attr, int idx, bool init_attr __maybe_unused)
+{
+	struct perf_evsel *evsel = perf_evsel__new(attr);
+
+	if (evsel)
+		perf_evsel__init(evsel, attr, idx);
+	return evsel;
+}
+
+static struct perf_evsel*
+perf_evsel__newtp_idx(const char *sys __maybe_unused, const char *name __maybe_unused,
+		      int idx __maybe_unused)
+{
+	return NULL;
+}
+
+static void perf_evsel__delete_helper(struct perf_evsel *evsel)
+{
+	perf_evsel__delete(evsel);
+}
+
+static
+int parse_events_add_pmu(struct parse_events_state *parse_state __maybe_unused,
+			 struct list_head *list __maybe_unused,
+			 char *pmu_name __maybe_unused,
+			 struct list_head *head_config __maybe_unused,
+			 struct list_head *orig_terms __maybe_unused,
+			 bool auto_merge_stats __maybe_unused,
+			 bool use_alias __maybe_unused)
+{
+	return -ENOTSUP;
+}
+
+static int
+parse_events_multi_pmu_add(struct parse_events_state *parse_state __maybe_unused,
+			   char *str __maybe_unused,
+			   struct list_head *head __maybe_unused,
+			   struct list_head **listp __maybe_unused)
+{
+	return -ENOTSUP;
+}
+
+static int
+parse_events_add_numeric(struct parse_events_state *parse_state __maybe_unused,
+			 struct list_head *list __maybe_unused,
+			 u32 type __maybe_unused, u64 config __maybe_unused,
+			 struct list_head *head_config __maybe_unused)
+{
+	return -ENOTSUP;
+}
+
+static int
+parse_events_add_cache(struct parse_events_state *parse_state __maybe_unused,
+		       struct list_head *list __maybe_unused,
+		       char *type __maybe_unused, char *op_result1 __maybe_unused,
+		       char *op_result2 __maybe_unused,
+		       struct parse_events_error *err __maybe_unused,
+		       struct list_head *head_config __maybe_unused)
+{
+	return -ENOTSUP;
+}
+
+static int
+parse_events_add_tracepoint(struct parse_events_state *parse_state __maybe_unused,
+			    struct list_head *list __maybe_unused,
+			    const char *sys __maybe_unused, const char *event __maybe_unused,
+			    struct parse_events_error *err __maybe_unused,
+			    struct list_head *head_config __maybe_unused)
+{
+	return -ENOTSUP;
+}
+
+static int
+parse_events_load_bpf(struct parse_events_state *parse_state __maybe_unused,
+		      struct list_head *list __maybe_unused,
+		      char *bpf_file_name __maybe_unused,
+		      bool source __maybe_unused,
+		      struct list_head *head_config __maybe_unused)
+{
+	return -ENOTSUP;
+}
+
+static void
+parse_events_set_leader(char *name, struct list_head *list,
+			struct parse_events_state *parse_state)
+{
+	struct perf_evsel *leader;
+
+	if (list_empty(list))
+                return;
+
+	__perf_evlist__set_leader(list);
+	leader = list_entry(list->next, struct perf_evsel, node);
+	leader->group_name = name ? strdup(name) : NULL;
+}
+
+static enum perf_pmu_event_symbol_type
+perf_pmu__parse_check(const char *name __maybe_unused)
+{
+	return PMU_EVENT_SYMBOL_ERR;
+}
+
+static struct parse_events_ops parse_state_ops = {
+	.perf_evsel__new    = perf_evsel__new_idx,
+	.perf_evsel__new_tp = perf_evsel__newtp_idx,
+	.perf_evsel__delete = perf_evsel__delete_helper,
+	.add_pmu            = parse_events_add_pmu,
+	.add_pmu_multi      = parse_events_multi_pmu_add,
+	.add_numeric        = parse_events_add_numeric,
+	.add_cache          = parse_events_add_cache,
+	.add_breakpoint     = parse_events_add_breakpoint,
+	.add_tracepoint     = parse_events_add_tracepoint,
+	.add_bpf            = parse_events_load_bpf,
+	.set_leader         = parse_events_set_leader,
+	.parse_check        = perf_pmu__parse_check,
+};
+
+static bool perf_evsel__has_leader(struct perf_evsel *evsel, struct perf_evsel *leader)
+{
+	return evsel->leader == leader;
+}
+
+static void perf_evlist__splice_list_tail(struct perf_evlist *evlist, struct list_head *list)
+{
+	while (!list_empty(list)) {
+		struct perf_evsel *evsel, *temp, *leader = NULL;
+
+		__perf_evlist__for_each_entry_safe(list, temp, evsel) {
+			list_del_init(&evsel->node);
+			perf_evlist__add(evlist, evsel);
+			leader = evsel;
+			break;
+		}
+
+		__perf_evlist__for_each_entry_safe(list, temp, evsel) {
+			if (perf_evsel__has_leader(evsel, leader)) {
+				list_del_init(&evsel->node);
+				perf_evlist__add(evlist, evsel);
+			}
+		}
+	}
+}
+
+int libperf_parse_events(struct perf_evlist *evlist, const char *str)
+{
+	struct parse_events_state parse_state = {
+		.list     = LIST_HEAD_INIT(parse_state.list),
+		.idx      = evlist->nr_entries,
+		.evlist   = evlist,
+		.ops      = &parse_state_ops,
+	};
+	int err;
+
+	err = parse_events__scanner(str, &parse_state, false);
+
+	if (!err && list_empty(&parse_state.list)) {
+		WARN_ONCE(true, "WARNING: event parser found nothing\n");
+		return -1;
+	}
+
+	perf_evlist__splice_list_tail(evlist, &parse_state.list);
+
+	if (!err)
+		evlist->nr_groups += parse_state.nr_groups;
+
+	return err;
+}
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* [PATCH 59/59] libperf: Add parse-events test
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (56 preceding siblings ...)
  2021-11-08 13:37 ` [PATCH 58/59] libperf: Add libperf_parse_events function Jiri Olsa
@ 2021-11-08 13:37 ` Jiri Olsa
  2021-11-08 18:32   ` Ian Rogers
  2021-11-08 18:50 ` [RFC 00/59] libperf: Move in event parse code Ian Rogers
  58 siblings, 1 reply; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 13:37 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo; +Cc: Namhyung Kim, Ian Rogers, linux-perf-users

Adding parse-events test.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/lib/perf/tests/Build               |  1 +
 tools/lib/perf/tests/main.c              |  1 +
 tools/lib/perf/tests/test-evlist.c       |  2 ++
 tools/lib/perf/tests/test-parse-events.c | 41 ++++++++++++++++++++++++
 tools/lib/perf/tests/tests.h             |  1 +
 5 files changed, 46 insertions(+)
 create mode 100644 tools/lib/perf/tests/test-parse-events.c

diff --git a/tools/lib/perf/tests/Build b/tools/lib/perf/tests/Build
index 56e81378d443..f1d1133d8dae 100644
--- a/tools/lib/perf/tests/Build
+++ b/tools/lib/perf/tests/Build
@@ -3,3 +3,4 @@ tests-y += test-evsel.o
 tests-y += test-evlist.o
 tests-y += test-cpumap.o
 tests-y += test-threadmap.o
+tests-y += test-parse-events.o
diff --git a/tools/lib/perf/tests/main.c b/tools/lib/perf/tests/main.c
index 56423fd4db19..bfa8ba05c422 100644
--- a/tools/lib/perf/tests/main.c
+++ b/tools/lib/perf/tests/main.c
@@ -7,6 +7,7 @@ int tests_verbose;
 
 int main(int argc, char **argv)
 {
+	__T("test parse_events", !test_parse_events(argc, argv));
 	__T("test cpumap", !test_cpumap(argc, argv));
 	__T("test threadmap", !test_threadmap(argc, argv));
 	__T("test evlist", !test_evlist(argc, argv));
diff --git a/tools/lib/perf/tests/test-evlist.c b/tools/lib/perf/tests/test-evlist.c
index ce91a582f0e4..199451a605a1 100644
--- a/tools/lib/perf/tests/test-evlist.c
+++ b/tools/lib/perf/tests/test-evlist.c
@@ -1,5 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
+#ifndef _GNU_SOURCE
 #define _GNU_SOURCE // needed for sched.h to get sched_[gs]etaffinity and CPU_(ZERO,SET)
+#endif
 #include <sched.h>
 #include <stdio.h>
 #include <stdarg.h>
diff --git a/tools/lib/perf/tests/test-parse-events.c b/tools/lib/perf/tests/test-parse-events.c
new file mode 100644
index 000000000000..5f913f82de7f
--- /dev/null
+++ b/tools/lib/perf/tests/test-parse-events.c
@@ -0,0 +1,41 @@
+#include <stdio.h>
+#include <linux/perf_event.h>
+#include <linux/hw_breakpoint.h>
+#include <perf/evlist.h>
+#include <perf/evsel.h>
+#include <internal/evlist.h>
+#include <internal/tests.h>
+#include "tests.h"
+
+static int libperf_print(enum libperf_print_level level,
+			 const char *fmt, va_list ap)
+{
+	return vfprintf(stderr, fmt, ap);
+}
+
+int test_parse_events(int argc, char **argv)
+{
+	struct perf_evlist *evlist;
+	struct perf_evsel *evsel;
+	int err;
+
+	__T_START;
+
+	libperf_init(libperf_print);
+
+	evlist = perf_evlist__new();
+	__T("failed to create evlist", evlist);
+
+	err = libperf_parse_events(evlist, "mem:0:rw");
+	__T("failed to parse events", !err);
+
+	evsel = perf_evlist__first(evlist);
+
+	__T("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
+	__T("wrong config", 0 == evsel->attr.config);
+	__T("wrong bp_type", (HW_BREAKPOINT_R|HW_BREAKPOINT_W) == evsel->attr.bp_type);
+	__T("wrong bp_len", HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
+
+	__T_END;
+	return tests_failed == 0 ? 0 : -1;
+}
diff --git a/tools/lib/perf/tests/tests.h b/tools/lib/perf/tests/tests.h
index 604838f21b2b..b4f27fc9c46d 100644
--- a/tools/lib/perf/tests/tests.h
+++ b/tools/lib/perf/tests/tests.h
@@ -6,5 +6,6 @@ int test_cpumap(int argc, char **argv);
 int test_threadmap(int argc, char **argv);
 int test_evlist(int argc, char **argv);
 int test_evsel(int argc, char **argv);
+int test_parse_events(int argc, char **argv);
 
 #endif /* TESTS_H */
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 78+ messages in thread

* Re: [PATCH 05/59] tools api fs: Move in the fncache from perf
  2021-11-08 13:36 ` [PATCH 05/59] tools api fs: Move in the fncache from perf Jiri Olsa
@ 2021-11-08 17:46   ` Ian Rogers
  2021-11-08 21:15     ` Jiri Olsa
  0 siblings, 1 reply; 78+ messages in thread
From: Ian Rogers @ 2021-11-08 17:46 UTC (permalink / raw)
  To: Jiri Olsa; +Cc: Arnaldo Carvalho de Melo, Namhyung Kim, linux-perf-users

On Mon, Nov 8, 2021 at 5:37 AM Jiri Olsa <jolsa@redhat.com> wrote:
>
> Moving fncache from perf under libapi.
>
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
>  tools/lib/api/fs/Build             |  1 +
>  tools/lib/api/fs/fncache.c         | 63 ++++++++++++++++++++++++++++++
>  tools/lib/api/fs/fs.h              |  2 +
>  tools/perf/arch/x86/util/pmu.c     |  1 -
>  tools/perf/tests/parse-events.c    |  1 -
>  tools/perf/util/Build              |  1 -
>  tools/perf/util/fncache.c          | 63 ------------------------------
>  tools/perf/util/fncache.h          |  7 ----

This change looks like it could be independent. Could this code be
simplified to just using a hashmap now that we have one?

Thanks,
Ian

>  tools/perf/util/pmu-hybrid.c       |  1 -
>  tools/perf/util/pmu.c              |  1 -
>  tools/perf/util/python-ext-sources |  1 -
>  tools/perf/util/srccode.c          | 10 ++++-
>  12 files changed, 75 insertions(+), 77 deletions(-)
>  create mode 100644 tools/lib/api/fs/fncache.c
>  delete mode 100644 tools/perf/util/fncache.c
>  delete mode 100644 tools/perf/util/fncache.h
>
> diff --git a/tools/lib/api/fs/Build b/tools/lib/api/fs/Build
> index 0f75b28654de..3af4b5265a5f 100644
> --- a/tools/lib/api/fs/Build
> +++ b/tools/lib/api/fs/Build
> @@ -1,3 +1,4 @@
>  libapi-y += fs.o
>  libapi-y += tracing_path.o
>  libapi-y += cgroup.o
> +libapi-y += fncache.o
> diff --git a/tools/lib/api/fs/fncache.c b/tools/lib/api/fs/fncache.c
> new file mode 100644
> index 000000000000..7fb4586c341a
> --- /dev/null
> +++ b/tools/lib/api/fs/fncache.c
> @@ -0,0 +1,63 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/* Manage a cache of file names' existence */
> +#include <stdlib.h>
> +#include <unistd.h>
> +#include <string.h>
> +#include <linux/list.h>
> +#include "fs.h"
> +
> +struct fncache {
> +       struct hlist_node nd;
> +       bool res;
> +       char name[];
> +};
> +
> +#define FNHSIZE 61
> +
> +static struct hlist_head fncache_hash[FNHSIZE];
> +
> +static unsigned shash(const unsigned char *s)
> +{
> +       unsigned h = 0;
> +       while (*s)
> +               h = 65599 * h + *s++;
> +       return h ^ (h >> 16);
> +}
> +
> +static bool lookup_fncache(const char *name, bool *res)
> +{
> +       int h = shash((const unsigned char *)name) % FNHSIZE;
> +       struct fncache *n;
> +
> +       hlist_for_each_entry(n, &fncache_hash[h], nd) {
> +               if (!strcmp(n->name, name)) {
> +                       *res = n->res;
> +                       return true;
> +               }
> +       }
> +       return false;
> +}
> +
> +static void update_fncache(const char *name, bool res)
> +{
> +       struct fncache *n = malloc(sizeof(struct fncache) + strlen(name) + 1);
> +       int h = shash((const unsigned char *)name) % FNHSIZE;
> +
> +       if (!n)
> +               return;
> +       strcpy(n->name, name);
> +       n->res = res;
> +       hlist_add_head(&n->nd, &fncache_hash[h]);
> +}
> +
> +/* No LRU, only use when bounded in some other way. */
> +bool file_available(const char *name)
> +{
> +       bool res;
> +
> +       if (lookup_fncache(name, &res))
> +               return res;
> +       res = access(name, R_OK) == 0;
> +       update_fncache(name, res);
> +       return res;
> +}
> diff --git a/tools/lib/api/fs/fs.h b/tools/lib/api/fs/fs.h
> index aa222ca30311..c42d4ff30ca7 100644
> --- a/tools/lib/api/fs/fs.h
> +++ b/tools/lib/api/fs/fs.h
> @@ -59,4 +59,6 @@ int sysfs__read_str(const char *entry, char **buf, size_t *sizep);
>  int sysfs__read_bool(const char *entry, bool *value);
>
>  int sysfs__write_int(const char *entry, int value);
> +
> +bool file_available(const char *name);
>  #endif /* __API_FS__ */
> diff --git a/tools/perf/arch/x86/util/pmu.c b/tools/perf/arch/x86/util/pmu.c
> index 74d69db1ea99..c875dded65bb 100644
> --- a/tools/perf/arch/x86/util/pmu.c
> +++ b/tools/perf/arch/x86/util/pmu.c
> @@ -13,7 +13,6 @@
>  #include "../../../util/intel-pt.h"
>  #include "../../../util/intel-bts.h"
>  #include "../../../util/pmu.h"
> -#include "../../../util/fncache.h"
>
>  #define TEMPLATE_ALIAS "%s/bus/event_source/devices/%s/alias"
>
> diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
> index 8875e388563e..69381fe1655d 100644
> --- a/tools/perf/tests/parse-events.c
> +++ b/tools/perf/tests/parse-events.c
> @@ -9,7 +9,6 @@
>  #include "pmu-hybrid.h"
>  #include <dirent.h>
>  #include <errno.h>
> -#include "fncache.h"
>  #include <sys/types.h>
>  #include <sys/stat.h>
>  #include <unistd.h>
> diff --git a/tools/perf/util/Build b/tools/perf/util/Build
> index 03d5d6ed7fe4..b93828aacc27 100644
> --- a/tools/perf/util/Build
> +++ b/tools/perf/util/Build
> @@ -52,7 +52,6 @@ perf-y += header.o
>  perf-y += callchain.o
>  perf-y += values.o
>  perf-y += debug.o
> -perf-y += fncache.o
>  perf-y += machine.o
>  perf-y += map.o
>  perf-y += pstack.o
> diff --git a/tools/perf/util/fncache.c b/tools/perf/util/fncache.c
> deleted file mode 100644
> index 6225cbc52310..000000000000
> --- a/tools/perf/util/fncache.c
> +++ /dev/null
> @@ -1,63 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-only
> -/* Manage a cache of file names' existence */
> -#include <stdlib.h>
> -#include <unistd.h>
> -#include <string.h>
> -#include <linux/list.h>
> -#include "fncache.h"
> -
> -struct fncache {
> -       struct hlist_node nd;
> -       bool res;
> -       char name[];
> -};
> -
> -#define FNHSIZE 61
> -
> -static struct hlist_head fncache_hash[FNHSIZE];
> -
> -unsigned shash(const unsigned char *s)
> -{
> -       unsigned h = 0;
> -       while (*s)
> -               h = 65599 * h + *s++;
> -       return h ^ (h >> 16);
> -}
> -
> -static bool lookup_fncache(const char *name, bool *res)
> -{
> -       int h = shash((const unsigned char *)name) % FNHSIZE;
> -       struct fncache *n;
> -
> -       hlist_for_each_entry(n, &fncache_hash[h], nd) {
> -               if (!strcmp(n->name, name)) {
> -                       *res = n->res;
> -                       return true;
> -               }
> -       }
> -       return false;
> -}
> -
> -static void update_fncache(const char *name, bool res)
> -{
> -       struct fncache *n = malloc(sizeof(struct fncache) + strlen(name) + 1);
> -       int h = shash((const unsigned char *)name) % FNHSIZE;
> -
> -       if (!n)
> -               return;
> -       strcpy(n->name, name);
> -       n->res = res;
> -       hlist_add_head(&n->nd, &fncache_hash[h]);
> -}
> -
> -/* No LRU, only use when bounded in some other way. */
> -bool file_available(const char *name)
> -{
> -       bool res;
> -
> -       if (lookup_fncache(name, &res))
> -               return res;
> -       res = access(name, R_OK) == 0;
> -       update_fncache(name, res);
> -       return res;
> -}
> diff --git a/tools/perf/util/fncache.h b/tools/perf/util/fncache.h
> deleted file mode 100644
> index fe020beaefb1..000000000000
> --- a/tools/perf/util/fncache.h
> +++ /dev/null
> @@ -1,7 +0,0 @@
> -#ifndef _FCACHE_H
> -#define _FCACHE_H 1
> -
> -unsigned shash(const unsigned char *s);
> -bool file_available(const char *name);
> -
> -#endif
> diff --git a/tools/perf/util/pmu-hybrid.c b/tools/perf/util/pmu-hybrid.c
> index f51ccaac60ee..65fdce81a384 100644
> --- a/tools/perf/util/pmu-hybrid.c
> +++ b/tools/perf/util/pmu-hybrid.c
> @@ -13,7 +13,6 @@
>  #include <stdarg.h>
>  #include <locale.h>
>  #include <api/fs/fs.h>
> -#include "fncache.h"
>  #include "pmu-hybrid.h"
>
>  LIST_HEAD(perf_pmu__hybrid_pmus);
> diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
> index 55d834160428..13e1835955e0 100644
> --- a/tools/perf/util/pmu.c
> +++ b/tools/perf/util/pmu.c
> @@ -26,7 +26,6 @@
>  #include "header.h"
>  #include "string2.h"
>  #include "strbuf.h"
> -#include "fncache.h"
>  #include "pmu-hybrid.h"
>
>  struct perf_pmu perf_pmu__fake;
> diff --git a/tools/perf/util/python-ext-sources b/tools/perf/util/python-ext-sources
> index a685d20165f7..992a76c2af01 100644
> --- a/tools/perf/util/python-ext-sources
> +++ b/tools/perf/util/python-ext-sources
> @@ -39,4 +39,3 @@ util/affinity.c
>  util/rwsem.c
>  util/hashmap.c
>  util/pmu-hybrid.c
> -util/fncache.c
> diff --git a/tools/perf/util/srccode.c b/tools/perf/util/srccode.c
> index 476e99896d5e..5c1ff87eb98c 100644
> --- a/tools/perf/util/srccode.c
> +++ b/tools/perf/util/srccode.c
> @@ -16,7 +16,7 @@
>  #include "srccode.h"
>  #include "debug.h"
>  #include <internal/lib.h> // page_size
> -#include "fncache.h"
> +#include <api/fs/fs.h>
>
>  #define MAXSRCCACHE (32*1024*1024)
>  #define MAXSRCFILES     64
> @@ -86,6 +86,14 @@ static void free_srcfile(struct srcfile *sf)
>         num_srcfiles--;
>  }
>
> +static unsigned shash(const unsigned char *s)
> +{
> +       unsigned h = 0;
> +       while (*s)
> +               h = 65599 * h + *s++;
> +       return h ^ (h >> 16);
> +}
> +
>  static struct srcfile *find_srcfile(char *fn)
>  {
>         struct stat st;
> --
> 2.31.1
>

^ permalink raw reply	[flat|nested] 78+ messages in thread

* Re: [PATCH 13/59] libperf: Move exclude_GH to perf_evsel
  2021-11-08 13:36 ` [PATCH 13/59] libperf: Move exclude_GH " Jiri Olsa
@ 2021-11-08 17:53   ` Ian Rogers
  2021-11-08 21:16     ` Jiri Olsa
  0 siblings, 1 reply; 78+ messages in thread
From: Ian Rogers @ 2021-11-08 17:53 UTC (permalink / raw)
  To: Jiri Olsa; +Cc: Arnaldo Carvalho de Melo, Namhyung Kim, linux-perf-users

On Mon, Nov 8, 2021 at 5:38 AM Jiri Olsa <jolsa@redhat.com> wrote:
>
> Moving exclude_GH to perf_evsel struct.
>
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
>  tools/lib/perf/include/internal/evsel.h | 1 +
>  tools/perf/util/evsel.c                 | 2 +-
>  tools/perf/util/evsel.h                 | 1 -
>  tools/perf/util/parse-events.c          | 4 ++--
>  4 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
> index b96c9f4808ca..7f3ee73c5aa5 100644
> --- a/tools/lib/perf/include/internal/evsel.h
> +++ b/tools/lib/perf/include/internal/evsel.h
> @@ -69,6 +69,7 @@ struct perf_evsel {
>                 const char              *metric_id;
>                 enum perf_tool_event    tool_event;
>                 const char              *unit;
> +               int                     exclude_GH;

I think it'd be pretty awesome if when these things get moved around
we added a comment here to explain what the variable means. Perhaps
even put an example :-) In this case it could explain why this is an
int and not a bool. This is a while you are here request rather than a
criticism of the changes which I find fine.

Thanks,
Ian

>         };
>  };
>
> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> index 133b571e1190..802c7de9e8e3 100644
> --- a/tools/perf/util/evsel.c
> +++ b/tools/perf/util/evsel.c
> @@ -431,7 +431,7 @@ struct evsel *evsel__clone(struct evsel *orig)
>         evsel->use_uncore_alias = orig->use_uncore_alias;
>         evsel->is_libpfm_event = orig->is_libpfm_event;
>
> -       evsel->exclude_GH = orig->exclude_GH;
> +       evsel->core.exclude_GH = orig->core.exclude_GH;
>         evsel->sample_read = orig->sample_read;
>         evsel->core.auto_merge_stats = orig->core.auto_merge_stats;
>         evsel->collect_stat = orig->collect_stat;
> diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
> index f6cc1e78903f..6c3634ed169a 100644
> --- a/tools/perf/util/evsel.h
> +++ b/tools/perf/util/evsel.h
> @@ -62,7 +62,6 @@ struct evsel {
>                 double                  scale;
>                 struct cgroup           *cgrp;
>                 /* parse modifier helper */
> -               int                     exclude_GH;
>                 int                     sample_read;
>                 bool                    snapshot;
>                 bool                    per_pkg;
> diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> index 1878ea1310d3..89787ebc23ef 100644
> --- a/tools/perf/util/parse-events.c
> +++ b/tools/perf/util/parse-events.c
> @@ -1918,7 +1918,7 @@ static int get_event_modifier(struct event_modifier *mod, char *str,
>         int exclusive = evsel ? evsel->core.attr.exclusive : 0;
>
>         int exclude = eu | ek | eh;
> -       int exclude_GH = evsel ? evsel->exclude_GH : 0;
> +       int exclude_GH = evsel ? evsel->core.exclude_GH : 0;
>         int weak = 0;
>         int bpf_counter = 0;
>
> @@ -2049,7 +2049,7 @@ int parse_events__modifier_event(struct list_head *list, char *str, bool add)
>                 evsel->core.attr.exclude_host   = mod.eH;
>                 evsel->core.attr.exclude_guest  = mod.eG;
>                 evsel->core.attr.exclude_idle   = mod.eI;
> -               evsel->exclude_GH          = mod.exclude_GH;
> +               evsel->core.exclude_GH          = mod.exclude_GH;
>                 evsel->sample_read         = mod.sample_read;
>                 evsel->precise_max         = mod.precise_max;
>                 evsel->weak_group          = mod.weak;
> --
> 2.31.1
>

^ permalink raw reply	[flat|nested] 78+ messages in thread

* Re: [PATCH 18/59] libperf: Move group_name to perf_evsel
  2021-11-08 13:36 ` [PATCH 18/59] libperf: Move group_name " Jiri Olsa
@ 2021-11-08 17:58   ` Ian Rogers
  2021-11-08 18:07     ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 78+ messages in thread
From: Ian Rogers @ 2021-11-08 17:58 UTC (permalink / raw)
  To: Jiri Olsa; +Cc: Arnaldo Carvalho de Melo, Namhyung Kim, linux-perf-users

On Mon, Nov 8, 2021 at 5:39 AM Jiri Olsa <jolsa@redhat.com> wrote:
>
> Moving group_name to perf_evsel struct.
>
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
>  tools/lib/perf/include/internal/evsel.h |  1 +
>  tools/perf/tests/parse-events.c         | 32 ++++++++++++-------------
>  tools/perf/util/auxtrace.c              |  6 ++---
>  tools/perf/util/evsel.c                 | 10 ++++----
>  tools/perf/util/evsel.h                 |  1 -
>  tools/perf/util/evsel_fprintf.c         |  2 +-
>  tools/perf/util/header.c                |  6 ++---
>  tools/perf/util/parse-events.c          |  4 ++--
>  8 files changed, 31 insertions(+), 31 deletions(-)
>
> diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
> index 81df282fa008..befcd180ef3d 100644
> --- a/tools/lib/perf/include/internal/evsel.h
> +++ b/tools/lib/perf/include/internal/evsel.h
> @@ -64,6 +64,7 @@ struct perf_evsel {
>          */
>          struct {
>                  char                   *name;
> +               const char              *group_name;

I like the constification here. But why constify group_name and not
name as well?

Thanks,
Ian

>                 bool                    auto_merge_stats;
>                 struct list_head        config_terms;
>                 const char              *metric_id;
> diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
> index 15d6d3d907b7..50746bb524f0 100644
> --- a/tools/perf/tests/parse-events.c
> +++ b/tools/perf/tests/parse-events.c
> @@ -782,7 +782,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
>         TEST_ASSERT_VAL("wrong group name",
> -               !strcmp(leader->group_name, "group1"));
> +               !strcmp(leader->core.group_name, "group1"));
>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
>         TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
> @@ -800,7 +800,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
>         TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 3);
>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
>         TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
>
> @@ -817,7 +817,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
>         TEST_ASSERT_VAL("wrong group name",
> -               !strcmp(leader->group_name, "group2"));
> +               !strcmp(leader->core.group_name, "group2"));
>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
>         TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
> @@ -872,7 +872,7 @@ static int test__group4(struct evlist *evlist __maybe_unused)
>         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
>         TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 1);
> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
> @@ -915,7 +915,7 @@ static int test__group5(struct evlist *evlist __maybe_unused)
>         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
>         TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
> @@ -947,7 +947,7 @@ static int test__group5(struct evlist *evlist __maybe_unused)
>         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
>         TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
> @@ -1001,7 +1001,7 @@ static int test__group_gh1(struct evlist *evlist)
>         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
> @@ -1041,7 +1041,7 @@ static int test__group_gh2(struct evlist *evlist)
>         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
>         TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
> @@ -1081,7 +1081,7 @@ static int test__group_gh3(struct evlist *evlist)
>         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
>         TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
> @@ -1121,7 +1121,7 @@ static int test__group_gh4(struct evlist *evlist)
>         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
>         TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
> @@ -1160,7 +1160,7 @@ static int test__leader_sample1(struct evlist *evlist)
>         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
>         TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
>
> @@ -1189,7 +1189,7 @@ static int test__leader_sample1(struct evlist *evlist)
>         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
>         TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
>
> @@ -1213,7 +1213,7 @@ static int test__leader_sample2(struct evlist *evlist __maybe_unused)
>         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
>         TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
>
> @@ -1228,7 +1228,7 @@ static int test__leader_sample2(struct evlist *evlist __maybe_unused)
>         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
>         TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
>
> @@ -1259,7 +1259,7 @@ static int test__pinned_group(struct evlist *evlist)
>         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
>         TEST_ASSERT_VAL("wrong config",
>                         PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
>         TEST_ASSERT_VAL("wrong pinned", evsel->core.attr.pinned);
>
> @@ -1303,7 +1303,7 @@ static int test__exclusive_group(struct evlist *evlist)
>         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
>         TEST_ASSERT_VAL("wrong config",
>                         PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
>         TEST_ASSERT_VAL("wrong exclusive", evsel->core.attr.exclusive);
>
> diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
> index c679394b898d..a882bc81e0fb 100644
> --- a/tools/perf/util/auxtrace.c
> +++ b/tools/perf/util/auxtrace.c
> @@ -1235,9 +1235,9 @@ static void unleader_evsel(struct evlist *evlist, struct evsel *leader)
>
>         /* Update group information */
>         if (new_leader) {
> -               zfree(&new_leader->group_name);
> -               new_leader->group_name = leader->group_name;
> -               leader->group_name = NULL;
> +               zfree(&new_leader->core.group_name);
> +               new_leader->core.group_name = leader->core.group_name;
> +               leader->core.group_name = NULL;
>
>                 new_leader->core.nr_members = leader->core.nr_members - 1;
>                 leader->core.nr_members = 1;
> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> index aafd91805870..7621eddc8e58 100644
> --- a/tools/perf/util/evsel.c
> +++ b/tools/perf/util/evsel.c
> @@ -395,9 +395,9 @@ struct evsel *evsel__clone(struct evsel *orig)
>                 if (evsel->core.name == NULL)
>                         goto out_err;
>         }
> -       if (orig->group_name) {
> -               evsel->group_name = strdup(orig->group_name);
> -               if (evsel->group_name == NULL)
> +       if (orig->core.group_name) {
> +               evsel->core.group_name = strdup(orig->core.group_name);
> +               if (evsel->core.group_name == NULL)
>                         goto out_err;
>         }
>         if (orig->pmu_name) {
> @@ -797,7 +797,7 @@ const char *evsel__metric_id(const struct evsel *evsel)
>
>  const char *evsel__group_name(struct evsel *evsel)
>  {
> -       return evsel->group_name ?: "anon group";
> +       return evsel->core.group_name ?: "anon group";
>  }
>
>  /*
> @@ -1436,7 +1436,7 @@ void evsel__exit(struct evsel *evsel)
>         perf_cpu_map__put(evsel->core.cpus);
>         perf_cpu_map__put(evsel->core.own_cpus);
>         perf_thread_map__put(evsel->core.threads);
> -       zfree(&evsel->group_name);
> +       zfree(&evsel->core.group_name);
>         zfree(&evsel->core.name);
>         zfree(&evsel->pmu_name);
>         zfree(&evsel->core.metric_id);
> diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
> index c09bbddd5da0..e06d171baba3 100644
> --- a/tools/perf/util/evsel.h
> +++ b/tools/perf/util/evsel.h
> @@ -54,7 +54,6 @@ struct evsel {
>          * they can be released properly.
>          */
>         struct {
> -               char                    *group_name;
>                 const char              *pmu_name;
>                 struct tep_event        *tp_format;
>                 char                    *filter;
> diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprintf.c
> index 8c2ea8001329..4670d1e745b2 100644
> --- a/tools/perf/util/evsel_fprintf.c
> +++ b/tools/perf/util/evsel_fprintf.c
> @@ -48,7 +48,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
>                         return 0;
>
>                 if (evsel->core.nr_members > 1)
> -                       printed += fprintf(fp, "%s{", evsel->group_name ?: "");
> +                       printed += fprintf(fp, "%s{", evsel->core.group_name ?: "");
>
>                 printed += fprintf(fp, "%s", evsel__name(evsel));
>                 for_each_group_member(pos, evsel)
> diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
> index 4610b23fed28..a14b690a6025 100644
> --- a/tools/perf/util/header.c
> +++ b/tools/perf/util/header.c
> @@ -788,7 +788,7 @@ static int write_group_desc(struct feat_fd *ff,
>
>         evlist__for_each_entry(evlist, evsel) {
>                 if (evsel__is_group_leader(evsel) && evsel->core.nr_members > 1) {
> -                       const char *name = evsel->group_name ?: "{anon_group}";
> +                       const char *name = evsel->core.group_name ?: "{anon_group}";
>                         u32 leader_idx = evsel->core.idx;
>                         u32 nr_members = evsel->core.nr_members;
>
> @@ -2094,7 +2094,7 @@ static void print_group_desc(struct feat_fd *ff, FILE *fp)
>
>         evlist__for_each_entry(session->evlist, evsel) {
>                 if (evsel__is_group_leader(evsel) && evsel->core.nr_members > 1) {
> -                       fprintf(fp, "# group: %s{%s", evsel->group_name ?: "", evsel__name(evsel));
> +                       fprintf(fp, "# group: %s{%s", evsel->core.group_name ?: "", evsel__name(evsel));
>
>                         nr = evsel->core.nr_members - 1;
>                 } else if (nr) {
> @@ -2743,7 +2743,7 @@ static int process_group_desc(struct feat_fd *ff, void *data __maybe_unused)
>                         evsel__set_leader(evsel, evsel);
>                         /* {anon_group} is a dummy name */
>                         if (strcmp(desc[i].name, "{anon_group}")) {
> -                               evsel->group_name = desc[i].name;
> +                               evsel->core.group_name = desc[i].name;
>                                 desc[i].name = NULL;
>                         }
>                         evsel->core.nr_members = desc[i].nr_members;
> diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> index 24d01b768078..05a96b0f7b41 100644
> --- a/tools/perf/util/parse-events.c
> +++ b/tools/perf/util/parse-events.c
> @@ -1841,7 +1841,7 @@ parse_events__set_leader_for_uncore_aliase(char *name, struct list_head *list,
>         for (i = 0; i < nr_pmu; i++) {
>                 evsel = (struct evsel *) leaders[i];
>                 evsel->core.nr_members = total_members / nr_pmu;
> -               evsel->group_name = name ? strdup(name) : NULL;
> +               evsel->core.group_name = name ? strdup(name) : NULL;
>         }
>
>         /* Take the new small groups into account */
> @@ -1869,7 +1869,7 @@ void parse_events__set_leader(char *name, struct list_head *list,
>
>         __perf_evlist__set_leader(list);
>         leader = list_entry(list->next, struct evsel, core.node);
> -       leader->group_name = name ? strdup(name) : NULL;
> +       leader->core.group_name = name ? strdup(name) : NULL;
>  }
>
>  /* list_event is assumed to point to malloc'ed memory */
> --
> 2.31.1
>

^ permalink raw reply	[flat|nested] 78+ messages in thread

* Re: [PATCH 18/59] libperf: Move group_name to perf_evsel
  2021-11-08 17:58   ` Ian Rogers
@ 2021-11-08 18:07     ` Arnaldo Carvalho de Melo
  2021-11-08 21:19       ` Jiri Olsa
  0 siblings, 1 reply; 78+ messages in thread
From: Arnaldo Carvalho de Melo @ 2021-11-08 18:07 UTC (permalink / raw)
  To: Ian Rogers, Jiri Olsa
  Cc: Arnaldo Carvalho de Melo, Namhyung Kim, linux-perf-users



On November 8, 2021 2:58:39 PM GMT-03:00, Ian Rogers <irogers@google.com> wrote:
>On Mon, Nov 8, 2021 at 5:39 AM Jiri Olsa <jolsa@redhat.com> wrote:
>>
>> Moving group_name to perf_evsel struct.
>>
>> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
>> ---
>>  tools/lib/perf/include/internal/evsel.h |  1 +
>>  tools/perf/tests/parse-events.c         | 32 ++++++++++++-------------
>>  tools/perf/util/auxtrace.c              |  6 ++---
>>  tools/perf/util/evsel.c                 | 10 ++++----
>>  tools/perf/util/evsel.h                 |  1 -
>>  tools/perf/util/evsel_fprintf.c         |  2 +-
>>  tools/perf/util/header.c                |  6 ++---
>>  tools/perf/util/parse-events.c          |  4 ++--
>>  8 files changed, 31 insertions(+), 31 deletions(-)
>>
>> diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
>> index 81df282fa008..befcd180ef3d 100644
>> --- a/tools/lib/perf/include/internal/evsel.h
>> +++ b/tools/lib/perf/include/internal/evsel.h
>> @@ -64,6 +64,7 @@ struct perf_evsel {
>>          */
>>          struct {
>>                  char                   *name;
>> +               const char              *group_name;
>
>I like the constification here. But why constify group_name and not
>name as well?


Can be done in a separate patch, in other series, no?

I understand that he probably is taking advantage of this move do constify 'group_name', but then, looks unrelated too this move to libperf as well.

- Arnaldo



>
>Thanks,
>Ian
>
>>                 bool                    auto_merge_stats;
>>                 struct list_head        config_terms;
>>                 const char              *metric_id;
>> diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
>> index 15d6d3d907b7..50746bb524f0 100644
>> --- a/tools/perf/tests/parse-events.c
>> +++ b/tools/perf/tests/parse-events.c
>> @@ -782,7 +782,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
>>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
>>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
>>         TEST_ASSERT_VAL("wrong group name",
>> -               !strcmp(leader->group_name, "group1"));
>> +               !strcmp(leader->core.group_name, "group1"));
>>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
>>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
>>         TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
>> @@ -800,7 +800,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
>>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
>>         TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 3);
>>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
>> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
>> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
>>         TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
>>
>> @@ -817,7 +817,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
>>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
>>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
>>         TEST_ASSERT_VAL("wrong group name",
>> -               !strcmp(leader->group_name, "group2"));
>> +               !strcmp(leader->core.group_name, "group2"));
>>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
>>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
>>         TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
>> @@ -872,7 +872,7 @@ static int test__group4(struct evlist *evlist __maybe_unused)
>>         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
>>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
>>         TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 1);
>> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
>> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
>>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
>>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
>> @@ -915,7 +915,7 @@ static int test__group5(struct evlist *evlist __maybe_unused)
>>         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
>>         TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
>>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
>> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
>> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
>>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
>>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
>> @@ -947,7 +947,7 @@ static int test__group5(struct evlist *evlist __maybe_unused)
>>         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
>>         TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
>>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
>> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
>> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
>>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
>>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
>> @@ -1001,7 +1001,7 @@ static int test__group_gh1(struct evlist *evlist)
>>         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
>>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
>>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
>> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
>> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
>>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
>>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
>> @@ -1041,7 +1041,7 @@ static int test__group_gh2(struct evlist *evlist)
>>         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
>>         TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
>>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
>> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
>> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
>>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
>>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
>> @@ -1081,7 +1081,7 @@ static int test__group_gh3(struct evlist *evlist)
>>         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
>>         TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
>>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
>> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
>> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
>>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
>>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
>> @@ -1121,7 +1121,7 @@ static int test__group_gh4(struct evlist *evlist)
>>         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
>>         TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
>>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
>> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
>> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
>>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
>>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
>> @@ -1160,7 +1160,7 @@ static int test__leader_sample1(struct evlist *evlist)
>>         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
>>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
>>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
>> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
>> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
>>         TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
>>
>> @@ -1189,7 +1189,7 @@ static int test__leader_sample1(struct evlist *evlist)
>>         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
>>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
>>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
>> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
>> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
>>         TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
>>
>> @@ -1213,7 +1213,7 @@ static int test__leader_sample2(struct evlist *evlist __maybe_unused)
>>         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
>>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
>>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
>> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
>> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
>>         TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
>>
>> @@ -1228,7 +1228,7 @@ static int test__leader_sample2(struct evlist *evlist __maybe_unused)
>>         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
>>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
>>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
>> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
>> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
>>         TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
>>
>> @@ -1259,7 +1259,7 @@ static int test__pinned_group(struct evlist *evlist)
>>         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
>>         TEST_ASSERT_VAL("wrong config",
>>                         PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
>> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
>> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
>>         TEST_ASSERT_VAL("wrong pinned", evsel->core.attr.pinned);
>>
>> @@ -1303,7 +1303,7 @@ static int test__exclusive_group(struct evlist *evlist)
>>         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
>>         TEST_ASSERT_VAL("wrong config",
>>                         PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
>> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
>> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
>>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
>>         TEST_ASSERT_VAL("wrong exclusive", evsel->core.attr.exclusive);
>>
>> diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
>> index c679394b898d..a882bc81e0fb 100644
>> --- a/tools/perf/util/auxtrace.c
>> +++ b/tools/perf/util/auxtrace.c
>> @@ -1235,9 +1235,9 @@ static void unleader_evsel(struct evlist *evlist, struct evsel *leader)
>>
>>         /* Update group information */
>>         if (new_leader) {
>> -               zfree(&new_leader->group_name);
>> -               new_leader->group_name = leader->group_name;
>> -               leader->group_name = NULL;
>> +               zfree(&new_leader->core.group_name);
>> +               new_leader->core.group_name = leader->core.group_name;
>> +               leader->core.group_name = NULL;
>>
>>                 new_leader->core.nr_members = leader->core.nr_members - 1;
>>                 leader->core.nr_members = 1;
>> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
>> index aafd91805870..7621eddc8e58 100644
>> --- a/tools/perf/util/evsel.c
>> +++ b/tools/perf/util/evsel.c
>> @@ -395,9 +395,9 @@ struct evsel *evsel__clone(struct evsel *orig)
>>                 if (evsel->core.name == NULL)
>>                         goto out_err;
>>         }
>> -       if (orig->group_name) {
>> -               evsel->group_name = strdup(orig->group_name);
>> -               if (evsel->group_name == NULL)
>> +       if (orig->core.group_name) {
>> +               evsel->core.group_name = strdup(orig->core.group_name);
>> +               if (evsel->core.group_name == NULL)
>>                         goto out_err;
>>         }
>>         if (orig->pmu_name) {
>> @@ -797,7 +797,7 @@ const char *evsel__metric_id(const struct evsel *evsel)
>>
>>  const char *evsel__group_name(struct evsel *evsel)
>>  {
>> -       return evsel->group_name ?: "anon group";
>> +       return evsel->core.group_name ?: "anon group";
>>  }
>>
>>  /*
>> @@ -1436,7 +1436,7 @@ void evsel__exit(struct evsel *evsel)
>>         perf_cpu_map__put(evsel->core.cpus);
>>         perf_cpu_map__put(evsel->core.own_cpus);
>>         perf_thread_map__put(evsel->core.threads);
>> -       zfree(&evsel->group_name);
>> +       zfree(&evsel->core.group_name);
>>         zfree(&evsel->core.name);
>>         zfree(&evsel->pmu_name);
>>         zfree(&evsel->core.metric_id);
>> diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
>> index c09bbddd5da0..e06d171baba3 100644
>> --- a/tools/perf/util/evsel.h
>> +++ b/tools/perf/util/evsel.h
>> @@ -54,7 +54,6 @@ struct evsel {
>>          * they can be released properly.
>>          */
>>         struct {
>> -               char                    *group_name;
>>                 const char              *pmu_name;
>>                 struct tep_event        *tp_format;
>>                 char                    *filter;
>> diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprintf.c
>> index 8c2ea8001329..4670d1e745b2 100644
>> --- a/tools/perf/util/evsel_fprintf.c
>> +++ b/tools/perf/util/evsel_fprintf.c
>> @@ -48,7 +48,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
>>                         return 0;
>>
>>                 if (evsel->core.nr_members > 1)
>> -                       printed += fprintf(fp, "%s{", evsel->group_name ?: "");
>> +                       printed += fprintf(fp, "%s{", evsel->core.group_name ?: "");
>>
>>                 printed += fprintf(fp, "%s", evsel__name(evsel));
>>                 for_each_group_member(pos, evsel)
>> diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
>> index 4610b23fed28..a14b690a6025 100644
>> --- a/tools/perf/util/header.c
>> +++ b/tools/perf/util/header.c
>> @@ -788,7 +788,7 @@ static int write_group_desc(struct feat_fd *ff,
>>
>>         evlist__for_each_entry(evlist, evsel) {
>>                 if (evsel__is_group_leader(evsel) && evsel->core.nr_members > 1) {
>> -                       const char *name = evsel->group_name ?: "{anon_group}";
>> +                       const char *name = evsel->core.group_name ?: "{anon_group}";
>>                         u32 leader_idx = evsel->core.idx;
>>                         u32 nr_members = evsel->core.nr_members;
>>
>> @@ -2094,7 +2094,7 @@ static void print_group_desc(struct feat_fd *ff, FILE *fp)
>>
>>         evlist__for_each_entry(session->evlist, evsel) {
>>                 if (evsel__is_group_leader(evsel) && evsel->core.nr_members > 1) {
>> -                       fprintf(fp, "# group: %s{%s", evsel->group_name ?: "", evsel__name(evsel));
>> +                       fprintf(fp, "# group: %s{%s", evsel->core.group_name ?: "", evsel__name(evsel));
>>
>>                         nr = evsel->core.nr_members - 1;
>>                 } else if (nr) {
>> @@ -2743,7 +2743,7 @@ static int process_group_desc(struct feat_fd *ff, void *data __maybe_unused)
>>                         evsel__set_leader(evsel, evsel);
>>                         /* {anon_group} is a dummy name */
>>                         if (strcmp(desc[i].name, "{anon_group}")) {
>> -                               evsel->group_name = desc[i].name;
>> +                               evsel->core.group_name = desc[i].name;
>>                                 desc[i].name = NULL;
>>                         }
>>                         evsel->core.nr_members = desc[i].nr_members;
>> diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
>> index 24d01b768078..05a96b0f7b41 100644
>> --- a/tools/perf/util/parse-events.c
>> +++ b/tools/perf/util/parse-events.c
>> @@ -1841,7 +1841,7 @@ parse_events__set_leader_for_uncore_aliase(char *name, struct list_head *list,
>>         for (i = 0; i < nr_pmu; i++) {
>>                 evsel = (struct evsel *) leaders[i];
>>                 evsel->core.nr_members = total_members / nr_pmu;
>> -               evsel->group_name = name ? strdup(name) : NULL;
>> +               evsel->core.group_name = name ? strdup(name) : NULL;
>>         }
>>
>>         /* Take the new small groups into account */
>> @@ -1869,7 +1869,7 @@ void parse_events__set_leader(char *name, struct list_head *list,
>>
>>         __perf_evlist__set_leader(list);
>>         leader = list_entry(list->next, struct evsel, core.node);
>> -       leader->group_name = name ? strdup(name) : NULL;
>> +       leader->core.group_name = name ? strdup(name) : NULL;
>>  }
>>
>>  /* list_event is assumed to point to malloc'ed memory */
>> --
>> 2.31.1
>>

^ permalink raw reply	[flat|nested] 78+ messages in thread

* Re: [PATCH 19/59] perf tools: Fix parse_events_term__num call
  2021-11-08 13:36 ` [PATCH 19/59] perf tools: Fix parse_events_term__num call Jiri Olsa
@ 2021-11-08 18:15   ` Ian Rogers
  2021-11-08 21:21     ` Jiri Olsa
  0 siblings, 1 reply; 78+ messages in thread
From: Ian Rogers @ 2021-11-08 18:15 UTC (permalink / raw)
  To: Jiri Olsa; +Cc: Arnaldo Carvalho de Melo, Namhyung Kim, linux-perf-users

On Mon, Nov 8, 2021 at 5:39 AM Jiri Olsa <jolsa@redhat.com> wrote:
>
> We are wrongly passing &config to parse_events_term__num
> as loc_term_ argument.
>
> Fixes: fb0811535e92 ("perf parse-events: Allow config on kernel PMU events")

I think this shows up on the fix as this change moved the code around,
but it didn't originate the issue. This pattern is common in
parse-events.y, are they also problematic?
https://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git/tree/tools/perf/util/parse-events.y?h=perf/core#n783

Thanks,
Ian

> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
>  tools/perf/util/parse-events.c | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> index 05a96b0f7b41..2bacbab86b09 100644
> --- a/tools/perf/util/parse-events.c
> +++ b/tools/perf/util/parse-events.c
> @@ -1697,8 +1697,7 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
>
>         if (parse_events_term__num(&term,
>                                    PARSE_EVENTS__TERM_TYPE_USER,
> -                                  config, 1, false, &config,
> -                                       NULL) < 0) {
> +                                  config, 1, false, NULL, NULL) < 0) {
>                 free(config);
>                 goto out_err;
>         }
> --
> 2.31.1
>

^ permalink raw reply	[flat|nested] 78+ messages in thread

* Re: [PATCH 30/59] libperf: Move in struct parse_events_state
  2021-11-08 13:36 ` [PATCH 30/59] libperf: Move in struct parse_events_state Jiri Olsa
@ 2021-11-08 18:21   ` Ian Rogers
  2021-11-08 21:24     ` Jiri Olsa
  0 siblings, 1 reply; 78+ messages in thread
From: Ian Rogers @ 2021-11-08 18:21 UTC (permalink / raw)
  To: Jiri Olsa; +Cc: Arnaldo Carvalho de Melo, Namhyung Kim, linux-perf-users

On Mon, Nov 8, 2021 at 5:40 AM Jiri Olsa <jolsa@redhat.com> wrote:
>
> Moving in struct parse_events_state to libperf
> together with related structs.
>
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
>  .../lib/perf/include/internal/parse-events.h  | 29 +++++++++++++++++++
>  tools/perf/util/parse-events.h                | 28 ------------------
>  2 files changed, 29 insertions(+), 28 deletions(-)
>
> diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
> index 46f632efd71b..aff13afa08e1 100644
> --- a/tools/lib/perf/include/internal/parse-events.h
> +++ b/tools/lib/perf/include/internal/parse-events.h
> @@ -5,6 +5,7 @@
>  #include <linux/types.h>
>  #include <linux/list.h>
>  #include <unistd.h>
> +#include <linux/perf_event.h>
>
>  struct event_symbol {
>         const char      *symbol;
> @@ -74,6 +75,34 @@ struct parse_events_term {
>         bool weak;
>  };
>
> +struct parse_events_error {
> +       int   num_errors;       /* number of errors encountered */
> +       int   idx;      /* index in the parsed string */
> +       char *str;      /* string to display at the index */
> +       char *help;     /* optional help string */
> +       int   first_idx;/* as above, but for the first encountered error */
> +       char *first_str;
> +       char *first_help;
> +};

Just to note that this will conflict with the patches in:
https://lore.kernel.org/lkml/YYfyEcPfj5ct7w7Q@kernel.org/
Which may mean a bit larger change.

Thanks,
Ian

> +struct parse_events_ops {
> +       struct perf_evsel* (*perf_evsel__new)(struct perf_event_attr *attr, int idx);
> +       struct perf_evsel* (*perf_evsel__new_tp)(const char *sys, const char *name, int idx);
> +};
> +
> +struct parse_events_state {
> +       struct list_head           list;
> +       int                        idx;
> +       int                        nr_groups;
> +       struct parse_events_error *error;
> +       struct perf_evlist        *evlist;
> +       struct list_head          *terms;
> +       int                        stoken;
> +       struct perf_pmu           *fake_pmu;
> +       char                      *hybrid_pmu_name;
> +       struct parse_events_ops   *ops;
> +};
> +
>  int parse_events_term__num(struct parse_events_term **term,
>                            int type_term, char *config, u64 num,
>                            bool novalue,
> diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
> index 2f75e823124f..057b92778d17 100644
> --- a/tools/perf/util/parse-events.h
> +++ b/tools/perf/util/parse-events.h
> @@ -61,34 +61,6 @@ struct perf_pmu_event_symbol {
>         enum perf_pmu_event_symbol_type type;
>  };
>
> -struct parse_events_error {
> -       int   num_errors;       /* number of errors encountered */
> -       int   idx;      /* index in the parsed string */
> -       char *str;      /* string to display at the index */
> -       char *help;     /* optional help string */
> -       int   first_idx;/* as above, but for the first encountered error */
> -       char *first_str;
> -       char *first_help;
> -};
> -
> -struct parse_events_ops {
> -       struct perf_evsel* (*perf_evsel__new)(struct perf_event_attr *attr, int idx);
> -       struct perf_evsel* (*perf_evsel__new_tp)(const char *sys, const char *name, int idx);
> -};
> -
> -struct parse_events_state {
> -       struct list_head           list;
> -       int                        idx;
> -       int                        nr_groups;
> -       struct parse_events_error *error;
> -       struct perf_evlist        *evlist;
> -       struct list_head          *terms;
> -       int                        stoken;
> -       struct perf_pmu           *fake_pmu;
> -       char                      *hybrid_pmu_name;
> -       struct parse_events_ops   *ops;
> -};
> -
>  void parse_events__handle_error(struct parse_events_error *err, int idx,
>                                 char *str, char *help);
>  void parse_events__shrink_config_terms(void);
> --
> 2.31.1
>

^ permalink raw reply	[flat|nested] 78+ messages in thread

* Re: [PATCH 42/59] libperf: Move in parse_events_name function
  2021-11-08 13:36 ` [PATCH 42/59] libperf: Move in parse_events_name function Jiri Olsa
@ 2021-11-08 18:23   ` Ian Rogers
  2021-11-08 21:24     ` Jiri Olsa
  0 siblings, 1 reply; 78+ messages in thread
From: Ian Rogers @ 2021-11-08 18:23 UTC (permalink / raw)
  To: Jiri Olsa; +Cc: Arnaldo Carvalho de Melo, Namhyung Kim, linux-perf-users

On Mon, Nov 8, 2021 at 5:41 AM Jiri Olsa <jolsa@redhat.com> wrote:
>
> Moving parse_events_name function to libperf.
>
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
>  tools/lib/perf/include/internal/parse-events.h |  1 +
>  tools/lib/perf/parse-events.c                  | 12 ++++++++++++
>  tools/perf/util/parse-events.c                 | 12 ------------
>  tools/perf/util/parse-events.h                 |  1 -
>  4 files changed, 13 insertions(+), 13 deletions(-)
>
> diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
> index 1d7ee03b8a80..11a85a118480 100644
> --- a/tools/lib/perf/include/internal/parse-events.h
> +++ b/tools/lib/perf/include/internal/parse-events.h
> @@ -137,4 +137,5 @@ void parse_events__handle_error(struct parse_events_error *err, int idx,
>                                 char *str, char *help);
>  void parse_events_evlist_error(struct parse_events_state *parse_state,
>                                int idx, const char *str);
> +int parse_events_name(struct list_head *list, const char *name);
>  #endif /* __LIBPERF_PARSE_EVENTS_H */
> diff --git a/tools/lib/perf/parse-events.c b/tools/lib/perf/parse-events.c
> index 07c89a3601b1..6efc2bb73cdf 100644
> --- a/tools/lib/perf/parse-events.c
> +++ b/tools/lib/perf/parse-events.c
> @@ -580,3 +580,15 @@ void parse_events_evlist_error(struct parse_events_state *parse_state,
>
>         parse_events__handle_error(parse_state->error, idx, strdup(str), NULL);
>  }
> +
> +int parse_events_name(struct list_head *list, const char *name)
> +{
> +       struct perf_evsel *evsel;
> +
> +       __perf_evlist__for_each_entry(list, evsel) {
> +               if (!evsel->name)
> +                       evsel->name = strdup(name);

It is a pre-existing problem but there should probably be an ENOMEM check here.

Thanks,
Ian

> +       }
> +
> +       return 0;
> +}
> diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> index 0f2bf2b48888..1469bdf88f2b 100644
> --- a/tools/perf/util/parse-events.c
> +++ b/tools/perf/util/parse-events.c
> @@ -1721,18 +1721,6 @@ void parse_events__set_leader(char *name, struct list_head *list,
>         leader->core.group_name = name ? strdup(name) : NULL;
>  }
>
> -int parse_events_name(struct list_head *list, const char *name)
> -{
> -       struct evsel *evsel;
> -
> -       __evlist__for_each_entry(list, evsel) {
> -               if (!evsel->core.name)
> -                       evsel->core.name = strdup(name);
> -       }
> -
> -       return 0;
> -}
> -
>  static int
>  comp_pmu(const void *p1, const void *p2)
>  {
> diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
> index cc7c6449d423..5530614e7a10 100644
> --- a/tools/perf/util/parse-events.h
> +++ b/tools/perf/util/parse-events.h
> @@ -63,7 +63,6 @@ struct perf_pmu_event_symbol {
>
>  void parse_events__shrink_config_terms(void);
>  void parse_events__clear_array(struct parse_events_array *a);
> -int parse_events_name(struct list_head *list, const char *name);
>  int parse_events_add_tracepoint(struct parse_events_state *parse_state,
>                                 struct list_head *list,
>                                 const char *sys, const char *event,
> --
> 2.31.1
>

^ permalink raw reply	[flat|nested] 78+ messages in thread

* Re: [PATCH 46/59] perf tools: Add add_numeric callback to struct parse_events_ops
  2021-11-08 13:36 ` [PATCH 46/59] perf tools: Add add_numeric " Jiri Olsa
@ 2021-11-08 18:27   ` Ian Rogers
  2021-11-08 21:34     ` Jiri Olsa
  0 siblings, 1 reply; 78+ messages in thread
From: Ian Rogers @ 2021-11-08 18:27 UTC (permalink / raw)
  To: Jiri Olsa; +Cc: Arnaldo Carvalho de Melo, Namhyung Kim, linux-perf-users

On Mon, Nov 8, 2021 at 5:41 AM Jiri Olsa <jolsa@redhat.com> wrote:
>
> Adding add_numeric callback to struct parse_events_ops,
> to allow custom numeric parsing code.
>
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
>  tools/lib/perf/include/internal/parse-events.h |  5 +++++
>  tools/perf/util/parse-events.c                 |  2 ++
>  tools/perf/util/parse-events.h                 |  4 ----
>  tools/perf/util/parse-events.y                 | 12 ++++++++----
>  4 files changed, 15 insertions(+), 8 deletions(-)
>
> diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
> index 78dd3f989346..cbcf799f8969 100644
> --- a/tools/lib/perf/include/internal/parse-events.h
> +++ b/tools/lib/perf/include/internal/parse-events.h
> @@ -102,6 +102,11 @@ struct parse_events_ops {
>         int (*add_pmu_multi)(struct parse_events_state *parse_state,
>                              char *str, struct list_head *head,
>                              struct list_head **listp);
> +
> +       int (*add_numeric)(struct parse_events_state *parse_state,
> +                          struct list_head *list,
> +                          u32 type, u64 config,
> +                          struct list_head *head_config);
>  };
>
>  struct parse_events_state {
> diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> index c67634c9de0d..a05e1bdb4e60 100644
> --- a/tools/perf/util/parse-events.c
> +++ b/tools/perf/util/parse-events.c
> @@ -1306,6 +1306,7 @@ int parse_events_add_tracepoint(struct parse_events_state *parse_state,
>                                             err, head_config);
>  }
>
> +static
>  int parse_events_add_numeric(struct parse_events_state *parse_state,
>                              struct list_head *list,
>                              u32 type, u64 config,
> @@ -2904,4 +2905,5 @@ static struct parse_events_ops parse_state_ops = {
>         .perf_evsel__delete = perf_evsel__delete_helper,
>         .add_pmu            = parse_events_add_pmu,
>         .add_pmu_multi      = parse_events_multi_pmu_add,
> +       .add_numeric        = parse_events_add_numeric,

Some documentation on the ops would be awesome :-) Especially as this
is allowing configuration and it is not immediately clear what that
could mean when changes happen.

Thanks,
Ian

>  };
> diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
> index fa03f8f70f33..40d192cace03 100644
> --- a/tools/perf/util/parse-events.h
> +++ b/tools/perf/util/parse-events.h
> @@ -79,10 +79,6 @@ int parse_events_load_bpf_obj(struct parse_events_state *parse_state,
>                               struct list_head *list,
>                               struct bpf_object *obj,
>                               struct list_head *head_config);
> -int parse_events_add_numeric(struct parse_events_state *parse_state,
> -                            struct list_head *list,
> -                            u32 type, u64 config,
> -                            struct list_head *head_config);
>  int parse_events_add_tool(struct parse_events_state *parse_state,
>                           struct list_head *list,
>                           int tool_event);
> diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
> index f903690b3c8a..b23691397374 100644
> --- a/tools/perf/util/parse-events.y
> +++ b/tools/perf/util/parse-events.y
> @@ -436,6 +436,7 @@ PE_VALUE_SYM_SW
>  event_legacy_symbol:
>  value_sym '/' event_config '/'
>  {
> +       struct parse_events_state *parse_state = _parse_state;
>         struct list_head *list;
>         int type = $1 >> 16;
>         int config = $1 & 255;
> @@ -443,7 +444,7 @@ value_sym '/' event_config '/'
>
>         list = alloc_list();
>         ABORT_ON(!list);
> -       err = parse_events_add_numeric(_parse_state, list, type, config, $3);
> +       err = parse_state->ops->add_numeric(parse_state, list, type, config, $3);
>         parse_events_terms__delete($3);
>         if (err) {
>                 free_list_evsel(_parse_state, list);
> @@ -454,13 +455,14 @@ value_sym '/' event_config '/'
>  |
>  value_sym sep_slash_slash_dc
>  {
> +       struct parse_events_state *parse_state = _parse_state;
>         struct list_head *list;
>         int type = $1 >> 16;
>         int config = $1 & 255;
>
>         list = alloc_list();
>         ABORT_ON(!list);
> -       ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config, NULL));
> +       ABORT_ON(parse_state->ops->add_numeric(parse_state, list, type, config, NULL));
>         $$ = list;
>  }
>  |
> @@ -646,12 +648,13 @@ PE_NAME ':' PE_NAME
>  event_legacy_numeric:
>  PE_VALUE ':' PE_VALUE opt_event_config
>  {
> +       struct parse_events_state *parse_state = _parse_state;
>         struct list_head *list;
>         int err;
>
>         list = alloc_list();
>         ABORT_ON(!list);
> -       err = parse_events_add_numeric(_parse_state, list, (u32)$1, $3, $4);
> +       err = parse_state->ops->add_numeric(_parse_state, list, (u32)$1, $3, $4);
>         parse_events_terms__delete($4);
>         if (err) {
>                 free(list);
> @@ -663,12 +666,13 @@ PE_VALUE ':' PE_VALUE opt_event_config
>  event_legacy_raw:
>  PE_RAW opt_event_config
>  {
> +       struct parse_events_state *parse_state = _parse_state;
>         struct list_head *list;
>         int err;
>
>         list = alloc_list();
>         ABORT_ON(!list);
> -       err = parse_events_add_numeric(_parse_state, list, PERF_TYPE_RAW, $1, $2);
> +       err = parse_state->ops->add_numeric(_parse_state, list, PERF_TYPE_RAW, $1, $2);
>         parse_events_terms__delete($2);
>         if (err) {
>                 free(list);
> --
> 2.31.1
>

^ permalink raw reply	[flat|nested] 78+ messages in thread

* Re: [PATCH 59/59] libperf: Add parse-events test
  2021-11-08 13:37 ` [PATCH 59/59] libperf: Add parse-events test Jiri Olsa
@ 2021-11-08 18:32   ` Ian Rogers
  2021-11-08 21:37     ` Jiri Olsa
  0 siblings, 1 reply; 78+ messages in thread
From: Ian Rogers @ 2021-11-08 18:32 UTC (permalink / raw)
  To: Jiri Olsa; +Cc: Arnaldo Carvalho de Melo, Namhyung Kim, linux-perf-users

On Mon, Nov 8, 2021 at 5:43 AM Jiri Olsa <jolsa@redhat.com> wrote:
>
> Adding parse-events test.

Fwiw, we fuzz test this code but filter out strings containing .bpf.,
.o or .c to avoid the fuzzer turning into an LLVM fuzzer. This
refactoring will solve some linking issues we have. Perhaps we can set
up fuzz testing here?

Thanks,
Ian

> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
>  tools/lib/perf/tests/Build               |  1 +
>  tools/lib/perf/tests/main.c              |  1 +
>  tools/lib/perf/tests/test-evlist.c       |  2 ++
>  tools/lib/perf/tests/test-parse-events.c | 41 ++++++++++++++++++++++++
>  tools/lib/perf/tests/tests.h             |  1 +
>  5 files changed, 46 insertions(+)
>  create mode 100644 tools/lib/perf/tests/test-parse-events.c
>
> diff --git a/tools/lib/perf/tests/Build b/tools/lib/perf/tests/Build
> index 56e81378d443..f1d1133d8dae 100644
> --- a/tools/lib/perf/tests/Build
> +++ b/tools/lib/perf/tests/Build
> @@ -3,3 +3,4 @@ tests-y += test-evsel.o
>  tests-y += test-evlist.o
>  tests-y += test-cpumap.o
>  tests-y += test-threadmap.o
> +tests-y += test-parse-events.o
> diff --git a/tools/lib/perf/tests/main.c b/tools/lib/perf/tests/main.c
> index 56423fd4db19..bfa8ba05c422 100644
> --- a/tools/lib/perf/tests/main.c
> +++ b/tools/lib/perf/tests/main.c
> @@ -7,6 +7,7 @@ int tests_verbose;
>
>  int main(int argc, char **argv)
>  {
> +       __T("test parse_events", !test_parse_events(argc, argv));
>         __T("test cpumap", !test_cpumap(argc, argv));
>         __T("test threadmap", !test_threadmap(argc, argv));
>         __T("test evlist", !test_evlist(argc, argv));
> diff --git a/tools/lib/perf/tests/test-evlist.c b/tools/lib/perf/tests/test-evlist.c
> index ce91a582f0e4..199451a605a1 100644
> --- a/tools/lib/perf/tests/test-evlist.c
> +++ b/tools/lib/perf/tests/test-evlist.c
> @@ -1,5 +1,7 @@
>  // SPDX-License-Identifier: GPL-2.0
> +#ifndef _GNU_SOURCE
>  #define _GNU_SOURCE // needed for sched.h to get sched_[gs]etaffinity and CPU_(ZERO,SET)
> +#endif
>  #include <sched.h>
>  #include <stdio.h>
>  #include <stdarg.h>
> diff --git a/tools/lib/perf/tests/test-parse-events.c b/tools/lib/perf/tests/test-parse-events.c
> new file mode 100644
> index 000000000000..5f913f82de7f
> --- /dev/null
> +++ b/tools/lib/perf/tests/test-parse-events.c
> @@ -0,0 +1,41 @@
> +#include <stdio.h>
> +#include <linux/perf_event.h>
> +#include <linux/hw_breakpoint.h>
> +#include <perf/evlist.h>
> +#include <perf/evsel.h>
> +#include <internal/evlist.h>
> +#include <internal/tests.h>
> +#include "tests.h"
> +
> +static int libperf_print(enum libperf_print_level level,
> +                        const char *fmt, va_list ap)
> +{
> +       return vfprintf(stderr, fmt, ap);
> +}
> +
> +int test_parse_events(int argc, char **argv)
> +{
> +       struct perf_evlist *evlist;
> +       struct perf_evsel *evsel;
> +       int err;
> +
> +       __T_START;
> +
> +       libperf_init(libperf_print);
> +
> +       evlist = perf_evlist__new();
> +       __T("failed to create evlist", evlist);
> +
> +       err = libperf_parse_events(evlist, "mem:0:rw");
> +       __T("failed to parse events", !err);
> +
> +       evsel = perf_evlist__first(evlist);
> +
> +       __T("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
> +       __T("wrong config", 0 == evsel->attr.config);
> +       __T("wrong bp_type", (HW_BREAKPOINT_R|HW_BREAKPOINT_W) == evsel->attr.bp_type);
> +       __T("wrong bp_len", HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
> +
> +       __T_END;
> +       return tests_failed == 0 ? 0 : -1;
> +}
> diff --git a/tools/lib/perf/tests/tests.h b/tools/lib/perf/tests/tests.h
> index 604838f21b2b..b4f27fc9c46d 100644
> --- a/tools/lib/perf/tests/tests.h
> +++ b/tools/lib/perf/tests/tests.h
> @@ -6,5 +6,6 @@ int test_cpumap(int argc, char **argv);
>  int test_threadmap(int argc, char **argv);
>  int test_evlist(int argc, char **argv);
>  int test_evsel(int argc, char **argv);
> +int test_parse_events(int argc, char **argv);
>
>  #endif /* TESTS_H */
> --
> 2.31.1
>

^ permalink raw reply	[flat|nested] 78+ messages in thread

* Re: [RFC 00/59] libperf: Move in event parse code
  2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
                   ` (57 preceding siblings ...)
  2021-11-08 13:37 ` [PATCH 59/59] libperf: Add parse-events test Jiri Olsa
@ 2021-11-08 18:50 ` Ian Rogers
  2021-11-08 21:50   ` Jiri Olsa
  58 siblings, 1 reply; 78+ messages in thread
From: Ian Rogers @ 2021-11-08 18:50 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: Arnaldo Carvalho de Melo, John Garry, Jin Yao, Andi Kleen,
	Peter Zijlstra, Ingo Molnar, Mark Rutland, Alexander Shishkin,
	Michael Petlan, Stephane Eranian, Namhyung Kim, linux-perf-users

On Mon, Nov 8, 2021 at 5:37 AM Jiri Olsa <jolsa@redhat.com> wrote:
>
> hi,
> this *RFC* patchset moves event parser code to libperf.
>
> It keeps the current perf functionality intact (hopefully)
> and adds new libperf_parse_events API to libperf that
> provides events parsing.
>
> At the moment libperf_parse_events function supports only
> breakpoint events, so it can be used to do things like:
> (see the new libperf test)
>
>   evlist = perf_evlist__new();
>   err = libperf_parse_events(evlist, "mem:0:rw");
>
>
> The other pmus parsing code directly depends on parsing
> code, so now when the parser is in the libperf, it will
> be easier to add the rest of pmus support.
>
> I'm curious on any early feedback because it's big change.
> My primary target is using this interface for bpftool prog
> profile to allow using all the perf events there.
>
> Also available in here:
>   git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
>   libperf/parse
>
>
> I'm Cc-ing most of the folks just on the cover email,
> because it's a lot of changes and most people won't be
> interested ;-)
>
> Please check the linux-perf-users mailing list or the git
> branch above for all the changes.
>
> thanks,
> jirka

It is a big change but I'm positive about it. Perhaps bpftool can use
libpfm4 in the short-term ;-) There are lots of small cleanups and
documentation improvements that can be done. Getting the main move
done quickly will help avoid the merge conflicts. I foresee conflicts
with my un-merged changes (reviews welcome :-) ):

new literals in metrics and a source_count function:
https://lore.kernel.org/lkml/20211105170943.3479315-1-irogers@google.com/

kunit style cleanup:
https://lore.kernel.org/lkml/20211104064208.3156807-1-irogers@google.com/

I would like to see pmu-events cleaned up. Some ideas here are:

1) moving jevents to a python program to simplify its maintenance -
100s of lines of json parsing code would turn into a single import and
we'd cease having an out dated for of jsmn

2) the pmu_events_map holds both events and metrics. Moving pmu-events
into libperf probably means something for the metrics code, should it
move to libperf too?

3) an issue with the existing pmu_events_map is that it is a struct
with lots of pointers. Most of the pointers are to .rodata strings.
With PIE the strings can end up anywhere in memory and so relocations
are needed for what is about 1.5MB worth of data. It'd be nice if perf
wasn't relocating all of that every time it starts. A solution would
be to turn all the events into a giant string (with deduplication,
etc.) and then to do something like leb128 encode offsets into the
string (many offsets are 0 and leb128 would encode that as a single
byte). As the string offsets, or leb128 encoded offsets, are constant
then they can go in .rodata and don't require relocating. We should be
able to shave something like 1MB off the binary size while improving
startup performance. Adding the logic to jevents.c would be more yucky
than in python imo.

Thanks,
Ian

> Cc: John Garry <john.garry@huawei.com>
> Cc: Jin Yao <yao.jin@linux.intel.com>
> Cc: Andi Kleen <ak@linux.intel.com>
> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Cc: Ingo Molnar <mingo@kernel.org>
> Cc: Mark Rutland <mark.rutland@arm.com>
> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> Cc: Michael Petlan <mpetlan@redhat.com>
> Cc: Stephane Eranian <eranian@google.com>
> ---
> Jiri Olsa (59):
>       libperf: Move pmu-events.h file to libperf
>       libperf: Move pmu-events framework to libperf
>       libperf: Move pmu-events build to libperf
>       libperf: Move perf_pmu__format_parse to libperf
>       tools api fs: Move in the fncache from perf
>       libperf: Move in the pmu hybrid support
>       libperf: Move name to perf_evsel
>       libperf: Move auto_merge_stats to perf_evsel
>       libperf: Move config_terms to perf_evsel
>       libperf: Move metric_id to perf_evsel
>       libperf: Move tool_event to perf_evsel
>       libperf: Move unit to perf_evsel
>       libperf: Move exclude_GH to perf_evsel
>       libperf: Move sample_read to perf_evsel
>       libperf: Move precise_max to perf_evsel
>       libperf: Move weak_group to perf_evsel
>       libperf: Move bpf_counter to perf_evsel
>       libperf: Move group_name to perf_evsel
>       perf tools: Fix parse_events_term__num call
>       perf tools: Pass parse_state all the way down to __add_event
>       perf tools: Pass parse_state all the way down to add_tracepoint
>       perf tools: Add evsel__new callback to parse_state_ops
>       perf tools: Add evsel__new_tp callback to parse_state_ops
>       perf tools: Add loc_term and loc_val helpers to parse_events_term__str
>       perf tools: Add loc_term and loc_val helpers to parse_events_term__num
>       libperf: Move in the event_symbols_hw/event_symbols_sw
>       libperf: Move in struct parse_events_term code
>       perf tools: Add perf_evsel__add_event function
>       perf tools: Change struct parse_events_state::evlist to perf_evlist
>       libperf: Move in struct parse_events_state
>       perf tools: Move event_attr_init in evsel__new_idx function
>       libperf: Move in perf_pmu__warn_invalid_config function
>       libperf: Move in perf_evsel__add_event function
>       perf tools: Move parse_events_update_lists to parser unit
>       libperf: Add perf_evsel__is_group_leader function
>       perf tools: Make parse_events__modifier_event work over perf_evsel
>       perf tool: Pass perf_guest in struct parse_events_state
>       libperf: Move in parse_events__modifier_group/event functions
>       libperf: Move in parse_events__handle_error function
>       libperf: Move in parse_events_evlist_error function
>       perf tools: Add perf_evsel__delete callback to struct parse_events_ops
>       libperf: Move in parse_events_name function
>       perf tools: Move out parse_events_add_pmu fallback from parser code
>       perf tools: Add add_pmu callback to struct parse_events_ops
>       perf tools: Add add_pmu_multi callback to struct parse_events_ops
>       perf tools: Add add_numeric callback to struct parse_events_ops
>       perf tools: Add add_cache callback to struct parse_events_ops
>       perf tools: Add add_breakpoint callback to struct parse_events_ops
>       perf tools: Add add_tracepoint callback to struct parse_events_ops
>       perf tools: Add add_bpf callback to struct parse_events_ops
>       perf tools: Add add_tool callback to struct parse_events_ops
>       perf tools: Add set_leader callback to struct parse_events_ops
>       perf tools: Add parse_check callback to struct parse_events_ops
>       perf tools: Move PE_* enums in parse_events__scanner
>       libperf: Move in parse-events flex/bison parser
>       libperf: Move in parse_events_add_breakpoint function
>       libperf: Move in some lib objects from perf
>       libperf: Add libperf_parse_events function
>       libperf: Add parse-events test
>
>  tools/lib/api/fs/Build                             |   1 +
>  tools/{perf/util => lib/api/fs}/fncache.c          |   4 +-
>  tools/lib/api/fs/fs.h                              |   2 +
>  tools/lib/perf/Build                               |  79 ++
>  tools/lib/perf/Makefile                            |  40 +-
>  tools/lib/perf/include/internal/evsel.h            |  30 +
>  tools/lib/perf/include/internal/parse-events.h     | 203 +++++
>  .../perf/include/internal}/pmu-hybrid.h            |   2 +-
>  tools/lib/perf/include/internal/pmu.h              |  59 ++
>  tools/lib/perf/include/perf/evlist.h               |   2 +
>  .../perf/include/perf}/pmu-events.h                |   0
>  tools/lib/perf/libperf.map                         |   1 +
>  tools/lib/perf/parse-events.c                      | 875 +++++++++++++++++++
>  tools/{perf/util => lib/perf}/parse-events.l       |  16 +-
>  tools/{perf/util => lib/perf}/parse-events.y       | 197 +++--
>  tools/{ => lib}/perf/pmu-events/Build              |   2 +-
>  tools/{ => lib}/perf/pmu-events/README             |   0
>  .../pmu-events/arch/arm64/ampere/emag/branch.json  |   0
>  .../pmu-events/arch/arm64/ampere/emag/bus.json     |   0
>  .../pmu-events/arch/arm64/ampere/emag/cache.json   |   0
>  .../pmu-events/arch/arm64/ampere/emag/clock.json   |   0
>  .../arch/arm64/ampere/emag/exception.json          |   0
>  .../arch/arm64/ampere/emag/instruction.json        |   0
>  .../arch/arm64/ampere/emag/intrinsic.json          |   0
>  .../pmu-events/arch/arm64/ampere/emag/memory.json  |   0
>  .../arch/arm64/ampere/emag/pipeline.json           |   0
>  .../arch/arm64/arm/cortex-a53/branch.json          |   0
>  .../pmu-events/arch/arm64/arm/cortex-a53/bus.json  |   0
>  .../arch/arm64/arm/cortex-a53/cache.json           |   0
>  .../arch/arm64/arm/cortex-a53/memory.json          |   0
>  .../arch/arm64/arm/cortex-a53/other.json           |   0
>  .../arch/arm64/arm/cortex-a53/pipeline.json        |   0
>  .../arm64/arm/cortex-a57-a72/core-imp-def.json     |   0
>  .../arch/arm64/arm/cortex-a76-n1/branch.json       |   0
>  .../arch/arm64/arm/cortex-a76-n1/bus.json          |   0
>  .../arch/arm64/arm/cortex-a76-n1/cache.json        |   0
>  .../arch/arm64/arm/cortex-a76-n1/exception.json    |   0
>  .../arch/arm64/arm/cortex-a76-n1/instruction.json  |   0
>  .../arch/arm64/arm/cortex-a76-n1/memory.json       |   0
>  .../arch/arm64/arm/cortex-a76-n1/other.json        |   0
>  .../arch/arm64/arm/cortex-a76-n1/pipeline.json     |   0
>  .../arch/arm64/arm/neoverse-v1/branch.json         |   0
>  .../pmu-events/arch/arm64/arm/neoverse-v1/bus.json |   0
>  .../arch/arm64/arm/neoverse-v1/cache.json          |   0
>  .../arch/arm64/arm/neoverse-v1/exception.json      |   0
>  .../arch/arm64/arm/neoverse-v1/instruction.json    |   0
>  .../arch/arm64/arm/neoverse-v1/memory.json         |   0
>  .../arch/arm64/arm/neoverse-v1/other.json          |   0
>  .../arch/arm64/arm/neoverse-v1/pipeline.json       |   0
>  .../arch/arm64/armv8-common-and-microarch.json     |   0
>  .../pmu-events/arch/arm64/armv8-recommended.json   |   0
>  .../arch/arm64/cavium/thunderx2/core-imp-def.json  |   0
>  .../arch/arm64/freescale/imx8mm/sys/ddrc.json      |   0
>  .../arch/arm64/freescale/imx8mm/sys/metrics.json   |   0
>  .../arch/arm64/freescale/imx8mn/sys/ddrc.json      |   0
>  .../arch/arm64/freescale/imx8mn/sys/metrics.json   |   0
>  .../arch/arm64/freescale/imx8mp/sys/ddrc.json      |   0
>  .../arch/arm64/freescale/imx8mp/sys/metrics.json   |   0
>  .../arch/arm64/freescale/imx8mq/sys/ddrc.json      |   0
>  .../arch/arm64/freescale/imx8mq/sys/metrics.json   |   0
>  .../arch/arm64/fujitsu/a64fx/branch.json           |   0
>  .../pmu-events/arch/arm64/fujitsu/a64fx/bus.json   |   0
>  .../pmu-events/arch/arm64/fujitsu/a64fx/cache.json |   0
>  .../pmu-events/arch/arm64/fujitsu/a64fx/cycle.json |   0
>  .../arch/arm64/fujitsu/a64fx/exception.json        |   0
>  .../arch/arm64/fujitsu/a64fx/instruction.json      |   0
>  .../arch/arm64/fujitsu/a64fx/memory.json           |   0
>  .../pmu-events/arch/arm64/fujitsu/a64fx/other.json |   0
>  .../arch/arm64/fujitsu/a64fx/pipeline.json         |   0
>  .../pmu-events/arch/arm64/fujitsu/a64fx/sve.json   |   0
>  .../arch/arm64/hisilicon/hip08/core-imp-def.json   |   0
>  .../arch/arm64/hisilicon/hip08/metrics.json        |   0
>  .../arch/arm64/hisilicon/hip08/uncore-ddrc.json    |   0
>  .../arch/arm64/hisilicon/hip08/uncore-hha.json     |   0
>  .../arch/arm64/hisilicon/hip08/uncore-l3c.json     |   0
>  .../perf/pmu-events/arch/arm64/mapfile.csv         |   0
>  .../perf/pmu-events/arch/nds32/mapfile.csv         |   0
>  .../perf/pmu-events/arch/nds32/n13/atcpmu.json     |   0
>  .../perf/pmu-events/arch/powerpc/mapfile.csv       |   0
>  .../pmu-events/arch/powerpc/power10/cache.json     |   0
>  .../arch/powerpc/power10/floating_point.json       |   0
>  .../pmu-events/arch/powerpc/power10/frontend.json  |   0
>  .../pmu-events/arch/powerpc/power10/locks.json     |   0
>  .../pmu-events/arch/powerpc/power10/marked.json    |   0
>  .../pmu-events/arch/powerpc/power10/memory.json    |   0
>  .../arch/powerpc/power10/nest_metrics.json         |   0
>  .../pmu-events/arch/powerpc/power10/others.json    |   0
>  .../pmu-events/arch/powerpc/power10/pipeline.json  |   0
>  .../perf/pmu-events/arch/powerpc/power10/pmc.json  |   0
>  .../arch/powerpc/power10/translation.json          |   0
>  .../perf/pmu-events/arch/powerpc/power8/cache.json |   0
>  .../arch/powerpc/power8/floating-point.json        |   0
>  .../pmu-events/arch/powerpc/power8/frontend.json   |   0
>  .../pmu-events/arch/powerpc/power8/marked.json     |   0
>  .../pmu-events/arch/powerpc/power8/memory.json     |   0
>  .../pmu-events/arch/powerpc/power8/metrics.json    |   0
>  .../perf/pmu-events/arch/powerpc/power8/other.json |   0
>  .../pmu-events/arch/powerpc/power8/pipeline.json   |   0
>  .../perf/pmu-events/arch/powerpc/power8/pmc.json   |   0
>  .../arch/powerpc/power8/translation.json           |   0
>  .../perf/pmu-events/arch/powerpc/power9/cache.json |   0
>  .../arch/powerpc/power9/floating-point.json        |   0
>  .../pmu-events/arch/powerpc/power9/frontend.json   |   0
>  .../pmu-events/arch/powerpc/power9/marked.json     |   0
>  .../pmu-events/arch/powerpc/power9/memory.json     |   0
>  .../pmu-events/arch/powerpc/power9/metrics.json    |   0
>  .../arch/powerpc/power9/nest_metrics.json          |   0
>  .../perf/pmu-events/arch/powerpc/power9/other.json |   0
>  .../pmu-events/arch/powerpc/power9/pipeline.json   |   0
>  .../perf/pmu-events/arch/powerpc/power9/pmc.json   |   0
>  .../arch/powerpc/power9/translation.json           |   0
>  .../perf/pmu-events/arch/s390/cf_z10/basic.json    |   0
>  .../perf/pmu-events/arch/s390/cf_z10/crypto.json   |   0
>  .../perf/pmu-events/arch/s390/cf_z10/extended.json |   0
>  .../perf/pmu-events/arch/s390/cf_z13/basic.json    |   0
>  .../perf/pmu-events/arch/s390/cf_z13/crypto.json   |   0
>  .../perf/pmu-events/arch/s390/cf_z13/extended.json |   0
>  .../pmu-events/arch/s390/cf_z13/transaction.json   |   0
>  .../perf/pmu-events/arch/s390/cf_z14/basic.json    |   0
>  .../perf/pmu-events/arch/s390/cf_z14/crypto.json   |   0
>  .../perf/pmu-events/arch/s390/cf_z14/extended.json |   0
>  .../pmu-events/arch/s390/cf_z14/transaction.json   |   0
>  .../perf/pmu-events/arch/s390/cf_z15/basic.json    |   0
>  .../perf/pmu-events/arch/s390/cf_z15/crypto.json   |   0
>  .../perf/pmu-events/arch/s390/cf_z15/crypto6.json  |   0
>  .../perf/pmu-events/arch/s390/cf_z15/extended.json |   0
>  .../pmu-events/arch/s390/cf_z15/transaction.json   |   0
>  .../perf/pmu-events/arch/s390/cf_z196/basic.json   |   0
>  .../perf/pmu-events/arch/s390/cf_z196/crypto.json  |   0
>  .../pmu-events/arch/s390/cf_z196/extended.json     |   0
>  .../perf/pmu-events/arch/s390/cf_zec12/basic.json  |   0
>  .../perf/pmu-events/arch/s390/cf_zec12/crypto.json |   0
>  .../pmu-events/arch/s390/cf_zec12/extended.json    |   0
>  .../pmu-events/arch/s390/cf_zec12/transaction.json |   0
>  .../perf/pmu-events/arch/s390/mapfile.csv          |   0
>  .../perf/pmu-events/arch/test/arch-std-events.json |   0
>  .../pmu-events/arch/test/test_soc/cpu/branch.json  |   0
>  .../pmu-events/arch/test/test_soc/cpu/cache.json   |   0
>  .../pmu-events/arch/test/test_soc/cpu/other.json   |   0
>  .../pmu-events/arch/test/test_soc/cpu/uncore.json  |   0
>  .../pmu-events/arch/test/test_soc/sys/uncore.json  |   0
>  .../perf/pmu-events/arch/x86/amdzen1/branch.json   |   0
>  .../perf/pmu-events/arch/x86/amdzen1/cache.json    |   0
>  .../perf/pmu-events/arch/x86/amdzen1/core.json     |   0
>  .../pmu-events/arch/x86/amdzen1/data-fabric.json   |   0
>  .../arch/x86/amdzen1/floating-point.json           |   0
>  .../perf/pmu-events/arch/x86/amdzen1/memory.json   |   0
>  .../perf/pmu-events/arch/x86/amdzen1/other.json    |   0
>  .../pmu-events/arch/x86/amdzen1/recommended.json   |   0
>  .../perf/pmu-events/arch/x86/amdzen2/branch.json   |   0
>  .../perf/pmu-events/arch/x86/amdzen2/cache.json    |   0
>  .../perf/pmu-events/arch/x86/amdzen2/core.json     |   0
>  .../pmu-events/arch/x86/amdzen2/data-fabric.json   |   0
>  .../arch/x86/amdzen2/floating-point.json           |   0
>  .../perf/pmu-events/arch/x86/amdzen2/memory.json   |   0
>  .../perf/pmu-events/arch/x86/amdzen2/other.json    |   0
>  .../pmu-events/arch/x86/amdzen2/recommended.json   |   0
>  .../perf/pmu-events/arch/x86/amdzen3/branch.json   |   0
>  .../perf/pmu-events/arch/x86/amdzen3/cache.json    |   0
>  .../perf/pmu-events/arch/x86/amdzen3/core.json     |   0
>  .../pmu-events/arch/x86/amdzen3/data-fabric.json   |   0
>  .../arch/x86/amdzen3/floating-point.json           |   0
>  .../perf/pmu-events/arch/x86/amdzen3/memory.json   |   0
>  .../perf/pmu-events/arch/x86/amdzen3/other.json    |   0
>  .../pmu-events/arch/x86/amdzen3/recommended.json   |   0
>  .../perf/pmu-events/arch/x86/bonnell/cache.json    |   0
>  .../arch/x86/bonnell/floating-point.json           |   0
>  .../perf/pmu-events/arch/x86/bonnell/frontend.json |   0
>  .../perf/pmu-events/arch/x86/bonnell/memory.json   |   0
>  .../perf/pmu-events/arch/x86/bonnell/other.json    |   0
>  .../perf/pmu-events/arch/x86/bonnell/pipeline.json |   0
>  .../arch/x86/bonnell/virtual-memory.json           |   0
>  .../pmu-events/arch/x86/broadwell/bdw-metrics.json |   0
>  .../perf/pmu-events/arch/x86/broadwell/cache.json  |   0
>  .../arch/x86/broadwell/floating-point.json         |   0
>  .../pmu-events/arch/x86/broadwell/frontend.json    |   0
>  .../perf/pmu-events/arch/x86/broadwell/memory.json |   0
>  .../perf/pmu-events/arch/x86/broadwell/other.json  |   0
>  .../pmu-events/arch/x86/broadwell/pipeline.json    |   0
>  .../perf/pmu-events/arch/x86/broadwell/uncore.json |   0
>  .../arch/x86/broadwell/virtual-memory.json         |   0
>  .../arch/x86/broadwellde/bdwde-metrics.json        |   0
>  .../pmu-events/arch/x86/broadwellde/cache.json     |   0
>  .../arch/x86/broadwellde/floating-point.json       |   0
>  .../pmu-events/arch/x86/broadwellde/frontend.json  |   0
>  .../pmu-events/arch/x86/broadwellde/memory.json    |   0
>  .../pmu-events/arch/x86/broadwellde/other.json     |   0
>  .../pmu-events/arch/x86/broadwellde/pipeline.json  |   0
>  .../arch/x86/broadwellde/uncore-cache.json         |   0
>  .../arch/x86/broadwellde/uncore-memory.json        |   0
>  .../arch/x86/broadwellde/uncore-power.json         |   0
>  .../arch/x86/broadwellde/virtual-memory.json       |   0
>  .../arch/x86/broadwellx/bdx-metrics.json           |   0
>  .../perf/pmu-events/arch/x86/broadwellx/cache.json |   0
>  .../arch/x86/broadwellx/floating-point.json        |   0
>  .../pmu-events/arch/x86/broadwellx/frontend.json   |   0
>  .../pmu-events/arch/x86/broadwellx/memory.json     |   0
>  .../perf/pmu-events/arch/x86/broadwellx/other.json |   0
>  .../pmu-events/arch/x86/broadwellx/pipeline.json   |   0
>  .../arch/x86/broadwellx/uncore-cache.json          |   0
>  .../arch/x86/broadwellx/uncore-interconnect.json   |   0
>  .../arch/x86/broadwellx/uncore-memory.json         |   0
>  .../arch/x86/broadwellx/uncore-power.json          |   0
>  .../arch/x86/broadwellx/virtual-memory.json        |   0
>  .../pmu-events/arch/x86/cascadelakex/cache.json    |   0
>  .../arch/x86/cascadelakex/clx-metrics.json         |   0
>  .../arch/x86/cascadelakex/floating-point.json      |   0
>  .../pmu-events/arch/x86/cascadelakex/frontend.json |   0
>  .../pmu-events/arch/x86/cascadelakex/memory.json   |   0
>  .../pmu-events/arch/x86/cascadelakex/other.json    |   0
>  .../pmu-events/arch/x86/cascadelakex/pipeline.json |   0
>  .../arch/x86/cascadelakex/uncore-memory.json       |   0
>  .../arch/x86/cascadelakex/uncore-other.json        |   0
>  .../arch/x86/cascadelakex/virtual-memory.json      |   0
>  .../pmu-events/arch/x86/elkhartlake/cache.json     |   0
>  .../arch/x86/elkhartlake/ehl-metrics.json          |   0
>  .../arch/x86/elkhartlake/floating-point.json       |   0
>  .../pmu-events/arch/x86/elkhartlake/frontend.json  |   0
>  .../pmu-events/arch/x86/elkhartlake/memory.json    |   0
>  .../pmu-events/arch/x86/elkhartlake/other.json     |   0
>  .../pmu-events/arch/x86/elkhartlake/pipeline.json  |   0
>  .../arch/x86/elkhartlake/virtual-memory.json       |   0
>  .../perf/pmu-events/arch/x86/goldmont/cache.json   |   0
>  .../pmu-events/arch/x86/goldmont/frontend.json     |   0
>  .../perf/pmu-events/arch/x86/goldmont/memory.json  |   0
>  .../perf/pmu-events/arch/x86/goldmont/other.json   |   0
>  .../pmu-events/arch/x86/goldmont/pipeline.json     |   0
>  .../arch/x86/goldmont/virtual-memory.json          |   0
>  .../pmu-events/arch/x86/goldmontplus/cache.json    |   0
>  .../pmu-events/arch/x86/goldmontplus/frontend.json |   0
>  .../pmu-events/arch/x86/goldmontplus/memory.json   |   0
>  .../pmu-events/arch/x86/goldmontplus/other.json    |   0
>  .../pmu-events/arch/x86/goldmontplus/pipeline.json |   0
>  .../arch/x86/goldmontplus/virtual-memory.json      |   0
>  .../perf/pmu-events/arch/x86/haswell/cache.json    |   0
>  .../arch/x86/haswell/floating-point.json           |   0
>  .../perf/pmu-events/arch/x86/haswell/frontend.json |   0
>  .../pmu-events/arch/x86/haswell/hsw-metrics.json   |   0
>  .../perf/pmu-events/arch/x86/haswell/memory.json   |   0
>  .../perf/pmu-events/arch/x86/haswell/other.json    |   0
>  .../perf/pmu-events/arch/x86/haswell/pipeline.json |   0
>  .../perf/pmu-events/arch/x86/haswell/uncore.json   |   0
>  .../arch/x86/haswell/virtual-memory.json           |   0
>  .../perf/pmu-events/arch/x86/haswellx/cache.json   |   0
>  .../arch/x86/haswellx/floating-point.json          |   0
>  .../pmu-events/arch/x86/haswellx/frontend.json     |   0
>  .../pmu-events/arch/x86/haswellx/hsx-metrics.json  |   0
>  .../perf/pmu-events/arch/x86/haswellx/memory.json  |   0
>  .../perf/pmu-events/arch/x86/haswellx/other.json   |   0
>  .../pmu-events/arch/x86/haswellx/pipeline.json     |   0
>  .../pmu-events/arch/x86/haswellx/uncore-cache.json |   0
>  .../arch/x86/haswellx/uncore-interconnect.json     |   0
>  .../arch/x86/haswellx/uncore-memory.json           |   0
>  .../pmu-events/arch/x86/haswellx/uncore-power.json |   0
>  .../arch/x86/haswellx/virtual-memory.json          |   0
>  .../perf/pmu-events/arch/x86/icelake/cache.json    |   0
>  .../arch/x86/icelake/floating-point.json           |   0
>  .../perf/pmu-events/arch/x86/icelake/frontend.json |   0
>  .../pmu-events/arch/x86/icelake/icl-metrics.json   |   0
>  .../perf/pmu-events/arch/x86/icelake/memory.json   |   0
>  .../perf/pmu-events/arch/x86/icelake/other.json    |   0
>  .../perf/pmu-events/arch/x86/icelake/pipeline.json |   0
>  .../arch/x86/icelake/virtual-memory.json           |   0
>  .../perf/pmu-events/arch/x86/icelakex/cache.json   |   0
>  .../arch/x86/icelakex/floating-point.json          |   0
>  .../pmu-events/arch/x86/icelakex/frontend.json     |   0
>  .../pmu-events/arch/x86/icelakex/icx-metrics.json  |   0
>  .../perf/pmu-events/arch/x86/icelakex/memory.json  |   0
>  .../perf/pmu-events/arch/x86/icelakex/other.json   |   0
>  .../pmu-events/arch/x86/icelakex/pipeline.json     |   0
>  .../arch/x86/icelakex/uncore-memory.json           |   0
>  .../pmu-events/arch/x86/icelakex/uncore-other.json |   0
>  .../pmu-events/arch/x86/icelakex/uncore-power.json |   0
>  .../arch/x86/icelakex/virtual-memory.json          |   0
>  .../perf/pmu-events/arch/x86/ivybridge/cache.json  |   0
>  .../arch/x86/ivybridge/floating-point.json         |   0
>  .../pmu-events/arch/x86/ivybridge/frontend.json    |   0
>  .../pmu-events/arch/x86/ivybridge/ivb-metrics.json |   0
>  .../perf/pmu-events/arch/x86/ivybridge/memory.json |   0
>  .../perf/pmu-events/arch/x86/ivybridge/other.json  |   0
>  .../pmu-events/arch/x86/ivybridge/pipeline.json    |   0
>  .../perf/pmu-events/arch/x86/ivybridge/uncore.json |   0
>  .../arch/x86/ivybridge/virtual-memory.json         |   0
>  .../perf/pmu-events/arch/x86/ivytown/cache.json    |   0
>  .../arch/x86/ivytown/floating-point.json           |   0
>  .../perf/pmu-events/arch/x86/ivytown/frontend.json |   0
>  .../pmu-events/arch/x86/ivytown/ivt-metrics.json   |   0
>  .../perf/pmu-events/arch/x86/ivytown/memory.json   |   0
>  .../perf/pmu-events/arch/x86/ivytown/other.json    |   0
>  .../perf/pmu-events/arch/x86/ivytown/pipeline.json |   0
>  .../pmu-events/arch/x86/ivytown/uncore-cache.json  |   0
>  .../arch/x86/ivytown/uncore-interconnect.json      |   0
>  .../pmu-events/arch/x86/ivytown/uncore-memory.json |   0
>  .../pmu-events/arch/x86/ivytown/uncore-power.json  |   0
>  .../arch/x86/ivytown/virtual-memory.json           |   0
>  .../perf/pmu-events/arch/x86/jaketown/cache.json   |   0
>  .../arch/x86/jaketown/floating-point.json          |   0
>  .../pmu-events/arch/x86/jaketown/frontend.json     |   0
>  .../pmu-events/arch/x86/jaketown/jkt-metrics.json  |   0
>  .../perf/pmu-events/arch/x86/jaketown/memory.json  |   0
>  .../perf/pmu-events/arch/x86/jaketown/other.json   |   0
>  .../pmu-events/arch/x86/jaketown/pipeline.json     |   0
>  .../pmu-events/arch/x86/jaketown/uncore-cache.json |   0
>  .../arch/x86/jaketown/uncore-interconnect.json     |   0
>  .../arch/x86/jaketown/uncore-memory.json           |   0
>  .../pmu-events/arch/x86/jaketown/uncore-power.json |   0
>  .../arch/x86/jaketown/virtual-memory.json          |   0
>  .../pmu-events/arch/x86/knightslanding/cache.json  |   0
>  .../arch/x86/knightslanding/frontend.json          |   0
>  .../pmu-events/arch/x86/knightslanding/memory.json |   0
>  .../arch/x86/knightslanding/pipeline.json          |   0
>  .../arch/x86/knightslanding/uncore-memory.json     |   0
>  .../arch/x86/knightslanding/virtual-memory.json    |   0
>  .../{ => lib}/perf/pmu-events/arch/x86/mapfile.csv |   0
>  .../perf/pmu-events/arch/x86/nehalemep/cache.json  |   0
>  .../arch/x86/nehalemep/floating-point.json         |   0
>  .../pmu-events/arch/x86/nehalemep/frontend.json    |   0
>  .../perf/pmu-events/arch/x86/nehalemep/memory.json |   0
>  .../perf/pmu-events/arch/x86/nehalemep/other.json  |   0
>  .../pmu-events/arch/x86/nehalemep/pipeline.json    |   0
>  .../arch/x86/nehalemep/virtual-memory.json         |   0
>  .../perf/pmu-events/arch/x86/nehalemex/cache.json  |   0
>  .../arch/x86/nehalemex/floating-point.json         |   0
>  .../pmu-events/arch/x86/nehalemex/frontend.json    |   0
>  .../perf/pmu-events/arch/x86/nehalemex/memory.json |   0
>  .../perf/pmu-events/arch/x86/nehalemex/other.json  |   0
>  .../pmu-events/arch/x86/nehalemex/pipeline.json    |   0
>  .../arch/x86/nehalemex/virtual-memory.json         |   0
>  .../pmu-events/arch/x86/sandybridge/cache.json     |   0
>  .../arch/x86/sandybridge/floating-point.json       |   0
>  .../pmu-events/arch/x86/sandybridge/frontend.json  |   0
>  .../pmu-events/arch/x86/sandybridge/memory.json    |   0
>  .../pmu-events/arch/x86/sandybridge/other.json     |   0
>  .../pmu-events/arch/x86/sandybridge/pipeline.json  |   0
>  .../arch/x86/sandybridge/snb-metrics.json          |   0
>  .../pmu-events/arch/x86/sandybridge/uncore.json    |   0
>  .../arch/x86/sandybridge/virtual-memory.json       |   0
>  .../perf/pmu-events/arch/x86/silvermont/cache.json |   0
>  .../pmu-events/arch/x86/silvermont/frontend.json   |   0
>  .../pmu-events/arch/x86/silvermont/memory.json     |   0
>  .../perf/pmu-events/arch/x86/silvermont/other.json |   0
>  .../pmu-events/arch/x86/silvermont/pipeline.json   |   0
>  .../arch/x86/silvermont/virtual-memory.json        |   0
>  .../perf/pmu-events/arch/x86/skylake/cache.json    |   0
>  .../arch/x86/skylake/floating-point.json           |   0
>  .../perf/pmu-events/arch/x86/skylake/frontend.json |   0
>  .../perf/pmu-events/arch/x86/skylake/memory.json   |   0
>  .../perf/pmu-events/arch/x86/skylake/other.json    |   0
>  .../perf/pmu-events/arch/x86/skylake/pipeline.json |   0
>  .../pmu-events/arch/x86/skylake/skl-metrics.json   |   0
>  .../perf/pmu-events/arch/x86/skylake/uncore.json   |   0
>  .../arch/x86/skylake/virtual-memory.json           |   0
>  .../perf/pmu-events/arch/x86/skylakex/cache.json   |   0
>  .../arch/x86/skylakex/floating-point.json          |   0
>  .../pmu-events/arch/x86/skylakex/frontend.json     |   0
>  .../perf/pmu-events/arch/x86/skylakex/memory.json  |   0
>  .../perf/pmu-events/arch/x86/skylakex/other.json   |   0
>  .../pmu-events/arch/x86/skylakex/pipeline.json     |   0
>  .../pmu-events/arch/x86/skylakex/skx-metrics.json  |   0
>  .../arch/x86/skylakex/uncore-memory.json           |   0
>  .../pmu-events/arch/x86/skylakex/uncore-other.json |   0
>  .../arch/x86/skylakex/virtual-memory.json          |   0
>  .../perf/pmu-events/arch/x86/tigerlake/cache.json  |   0
>  .../arch/x86/tigerlake/floating-point.json         |   0
>  .../pmu-events/arch/x86/tigerlake/frontend.json    |   0
>  .../perf/pmu-events/arch/x86/tigerlake/memory.json |   0
>  .../perf/pmu-events/arch/x86/tigerlake/other.json  |   0
>  .../pmu-events/arch/x86/tigerlake/pipeline.json    |   0
>  .../pmu-events/arch/x86/tigerlake/tgl-metrics.json |   0
>  .../arch/x86/tigerlake/virtual-memory.json         |   0
>  .../perf/pmu-events/arch/x86/tremontx/cache.json   |   0
>  .../pmu-events/arch/x86/tremontx/frontend.json     |   0
>  .../perf/pmu-events/arch/x86/tremontx/memory.json  |   0
>  .../perf/pmu-events/arch/x86/tremontx/other.json   |   0
>  .../pmu-events/arch/x86/tremontx/pipeline.json     |   0
>  .../arch/x86/tremontx/uncore-memory.json           |   0
>  .../pmu-events/arch/x86/tremontx/uncore-other.json |   0
>  .../pmu-events/arch/x86/tremontx/uncore-power.json |   0
>  .../arch/x86/tremontx/virtual-memory.json          |   0
>  .../pmu-events/arch/x86/westmereep-dp/cache.json   |   0
>  .../arch/x86/westmereep-dp/floating-point.json     |   0
>  .../arch/x86/westmereep-dp/frontend.json           |   0
>  .../pmu-events/arch/x86/westmereep-dp/memory.json  |   0
>  .../pmu-events/arch/x86/westmereep-dp/other.json   |   0
>  .../arch/x86/westmereep-dp/pipeline.json           |   0
>  .../arch/x86/westmereep-dp/virtual-memory.json     |   0
>  .../pmu-events/arch/x86/westmereep-sp/cache.json   |   0
>  .../arch/x86/westmereep-sp/floating-point.json     |   0
>  .../arch/x86/westmereep-sp/frontend.json           |   0
>  .../pmu-events/arch/x86/westmereep-sp/memory.json  |   0
>  .../pmu-events/arch/x86/westmereep-sp/other.json   |   0
>  .../arch/x86/westmereep-sp/pipeline.json           |   0
>  .../arch/x86/westmereep-sp/virtual-memory.json     |   0
>  .../perf/pmu-events/arch/x86/westmereex/cache.json |   0
>  .../arch/x86/westmereex/floating-point.json        |   0
>  .../pmu-events/arch/x86/westmereex/frontend.json   |   0
>  .../pmu-events/arch/x86/westmereex/memory.json     |   0
>  .../perf/pmu-events/arch/x86/westmereex/other.json |   0
>  .../pmu-events/arch/x86/westmereex/pipeline.json   |   0
>  .../arch/x86/westmereex/virtual-memory.json        |   0
>  tools/{ => lib}/perf/pmu-events/jevents.c          |   6 +-
>  tools/{ => lib}/perf/pmu-events/jsmn.c             |   0
>  tools/{ => lib}/perf/pmu-events/jsmn.h             |   0
>  tools/{ => lib}/perf/pmu-events/json.c             |   0
>  tools/{ => lib}/perf/pmu-events/json.h             |   0
>  tools/{perf/util => lib/perf}/pmu-hybrid.c         |   3 +-
>  tools/lib/perf/pmu.c                               | 117 +++
>  tools/{perf/util => lib/perf}/pmu.l                |   3 +-
>  tools/{perf/util => lib/perf}/pmu.y                |   2 +-
>  tools/lib/perf/tests/Build                         |   1 +
>  tools/lib/perf/tests/main.c                        |   1 +
>  tools/lib/perf/tests/test-evlist.c                 |   2 +
>  tools/lib/perf/tests/test-parse-events.c           |  43 +
>  tools/lib/perf/tests/tests.h                       |   1 +
>  tools/perf/Makefile.perf                           |  22 +-
>  tools/perf/arch/x86/util/kvm-stat.c                |   8 +-
>  tools/perf/arch/x86/util/pmu.c                     |   1 -
>  tools/perf/builtin-c2c.c                           |   2 +-
>  tools/perf/builtin-kvm.c                           |   6 +-
>  tools/perf/builtin-list.c                          |   2 +-
>  tools/perf/builtin-mem.c                           |   2 +-
>  tools/perf/builtin-record.c                        |  12 +-
>  tools/perf/builtin-stat.c                          |  18 +-
>  tools/perf/builtin-top.c                           |   2 +-
>  tools/perf/builtin-trace.c                         |  12 +-
>  tools/perf/tests/event_update.c                    |   2 +-
>  tools/perf/tests/evsel-roundtrip-name.c            |   2 +-
>  tools/perf/tests/evsel-tp-sched.c                  |   6 +-
>  tools/perf/tests/expand-cgroup.c                   |   8 +-
>  tools/perf/tests/parse-events.c                    |  87 +-
>  tools/perf/tests/parse-metric.c                    |   6 +-
>  tools/perf/tests/perf-time-to-tsc.c                |   2 +-
>  tools/perf/tests/pmu-events.c                      |   2 +-
>  tools/perf/util/Build                              |  55 --
>  tools/perf/util/amd-sample-raw.c                   |   2 +-
>  tools/perf/util/arm-spe.c                          |   6 +-
>  tools/perf/util/auxtrace.c                         |   6 +-
>  tools/perf/util/bpf_counter.c                      |   2 +-
>  tools/perf/util/cputopo.c                          |   2 +-
>  tools/perf/util/evlist-hybrid.c                    |   5 +-
>  tools/perf/util/evlist.c                           |  18 +-
>  tools/perf/util/evsel.c                            | 109 +--
>  tools/perf/util/evsel.h                            |  23 +-
>  tools/perf/util/evsel_fprintf.c                    |   2 +-
>  tools/perf/util/fncache.h                          |   7 -
>  tools/perf/util/header.c                           |  32 +-
>  tools/perf/util/intel-pt.c                         |   6 +-
>  tools/perf/util/mem-events.c                       |   2 +-
>  tools/perf/util/metricgroup.c                      |  22 +-
>  tools/perf/util/metricgroup.h                      |   2 +-
>  tools/perf/util/parse-events-hybrid.c              |  26 +-
>  tools/perf/util/parse-events-hybrid.h              |   6 +-
>  tools/perf/util/parse-events.c                     | 971 +++++----------------
>  tools/perf/util/parse-events.h                     | 167 +---
>  tools/perf/util/pmu.c                              | 113 +--
>  tools/perf/util/pmu.h                              |  44 +-
>  tools/perf/util/python-ext-sources                 |   2 -
>  tools/perf/util/record.c                           |   4 +-
>  tools/perf/util/s390-sample-raw.c                  |   2 +-
>  tools/perf/util/sideband_evlist.c                  |   2 +-
>  tools/perf/util/sort.c                             |   6 +-
>  tools/perf/util/srccode.c                          |  10 +-
>  tools/perf/util/stat-display.c                     |  29 +-
>  tools/perf/util/stat-shadow.c                      |  14 +-
>  tools/perf/util/synthetic-events.c                 |  10 +-
>  tools/perf/util/trace-event-info.c                 |   6 +-
>  466 files changed, 2051 insertions(+), 1556 deletions(-)
>  rename tools/{perf/util => lib/api/fs}/fncache.c (95%)
>  create mode 100644 tools/lib/perf/include/internal/parse-events.h
>  rename tools/{perf/util => lib/perf/include/internal}/pmu-hybrid.h (96%)
>  create mode 100644 tools/lib/perf/include/internal/pmu.h
>  rename tools/{perf/pmu-events => lib/perf/include/perf}/pmu-events.h (100%)
>  create mode 100644 tools/lib/perf/parse-events.c
>  rename tools/{perf/util => lib/perf}/parse-events.l (96%)
>  rename tools/{perf/util => lib/perf}/parse-events.y (76%)
>  rename tools/{ => lib}/perf/pmu-events/Build (87%)
>  rename tools/{ => lib}/perf/pmu-events/README (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/branch.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/bus.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/clock.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/exception.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/instruction.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/intrinsic.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a53/branch.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a53/bus.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a53/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a53/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a53/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a53/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a57-a72/core-imp-def.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/branch.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/bus.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/exception.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/instruction.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/branch.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/bus.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/exception.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/instruction.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/armv8-common-and-microarch.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/armv8-recommended.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/cavium/thunderx2/core-imp-def.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mm/sys/ddrc.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mm/sys/metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mn/sys/ddrc.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mn/sys/metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mp/sys/ddrc.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mp/sys/metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mq/sys/ddrc.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mq/sys/metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/branch.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/bus.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/cycle.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/exception.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/instruction.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/sve.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/hisilicon/hip08/core-imp-def.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/hisilicon/hip08/metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-ddrc.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-hha.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-l3c.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/arm64/mapfile.csv (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/nds32/mapfile.csv (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/nds32/n13/atcpmu.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/mapfile.csv (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/floating_point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/locks.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/marked.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/nest_metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/others.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/pmc.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/translation.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/marked.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/pmc.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/translation.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/marked.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/nest_metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/pmc.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/translation.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z10/basic.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z10/crypto.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z10/extended.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z13/basic.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z13/crypto.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z13/extended.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z13/transaction.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z14/basic.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z14/crypto.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z14/extended.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z14/transaction.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z15/basic.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z15/crypto.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z15/crypto6.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z15/extended.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z15/transaction.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z196/basic.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z196/crypto.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z196/extended.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_zec12/basic.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_zec12/crypto.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_zec12/extended.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_zec12/transaction.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/s390/mapfile.csv (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/test/arch-std-events.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/test/test_soc/cpu/branch.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/test/test_soc/cpu/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/test/test_soc/cpu/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/test/test_soc/cpu/uncore.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/test/test_soc/sys/uncore.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/branch.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/core.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/data-fabric.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/recommended.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/branch.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/core.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/data-fabric.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/recommended.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/branch.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/core.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/data-fabric.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/recommended.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/bdw-metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/uncore.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/bdwde-metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/uncore-cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/uncore-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/uncore-power.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/bdx-metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/uncore-cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/uncore-interconnect.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/uncore-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/uncore-power.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/clx-metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/uncore-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/uncore-other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/ehl-metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmont/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmont/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmont/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmont/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmont/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmont/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmontplus/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmontplus/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmontplus/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmontplus/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmontplus/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmontplus/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/hsw-metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/uncore.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/hsx-metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/uncore-cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/uncore-interconnect.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/uncore-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/uncore-power.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/icl-metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/icx-metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/uncore-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/uncore-other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/uncore-power.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/ivb-metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/uncore.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/ivt-metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/uncore-cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/uncore-interconnect.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/uncore-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/uncore-power.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/jkt-metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/uncore-cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/uncore-interconnect.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/uncore-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/uncore-power.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/knightslanding/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/knightslanding/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/knightslanding/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/knightslanding/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/knightslanding/uncore-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/knightslanding/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/mapfile.csv (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/snb-metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/uncore.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/silvermont/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/silvermont/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/silvermont/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/silvermont/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/silvermont/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/silvermont/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/skl-metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/uncore.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/skx-metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/uncore-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/uncore-other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/tgl-metrics.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/uncore-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/uncore-other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/uncore-power.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/cache.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/floating-point.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/frontend.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/other.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/pipeline.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/virtual-memory.json (100%)
>  rename tools/{ => lib}/perf/pmu-events/jevents.c (99%)
>  rename tools/{ => lib}/perf/pmu-events/jsmn.c (100%)
>  rename tools/{ => lib}/perf/pmu-events/jsmn.h (100%)
>  rename tools/{ => lib}/perf/pmu-events/json.c (100%)
>  rename tools/{ => lib}/perf/pmu-events/json.h (100%)
>  rename tools/{perf/util => lib/perf}/pmu-hybrid.c (97%)
>  create mode 100644 tools/lib/perf/pmu.c
>  rename tools/{perf/util => lib/perf}/pmu.l (91%)
>  rename tools/{perf/util => lib/perf}/pmu.y (98%)
>  create mode 100644 tools/lib/perf/tests/test-parse-events.c
>  delete mode 100644 tools/perf/util/fncache.h
>

^ permalink raw reply	[flat|nested] 78+ messages in thread

* Re: [PATCH 05/59] tools api fs: Move in the fncache from perf
  2021-11-08 17:46   ` Ian Rogers
@ 2021-11-08 21:15     ` Jiri Olsa
  0 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 21:15 UTC (permalink / raw)
  To: Ian Rogers, Sohaib Mohamed
  Cc: Arnaldo Carvalho de Melo, Namhyung Kim, linux-perf-users

On Mon, Nov 08, 2021 at 09:46:43AM -0800, Ian Rogers wrote:
> On Mon, Nov 8, 2021 at 5:37 AM Jiri Olsa <jolsa@redhat.com> wrote:
> >
> > Moving fncache from perf under libapi.
> >
> > Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> > ---
> >  tools/lib/api/fs/Build             |  1 +
> >  tools/lib/api/fs/fncache.c         | 63 ++++++++++++++++++++++++++++++
> >  tools/lib/api/fs/fs.h              |  2 +
> >  tools/perf/arch/x86/util/pmu.c     |  1 -
> >  tools/perf/tests/parse-events.c    |  1 -
> >  tools/perf/util/Build              |  1 -
> >  tools/perf/util/fncache.c          | 63 ------------------------------
> >  tools/perf/util/fncache.h          |  7 ----
> 
> This change looks like it could be independent. Could this code be
> simplified to just using a hashmap now that we have one?

true, Sohaib, perhaps you might be interest in this?

jirka

> 
> Thanks,
> Ian
> 
> >  tools/perf/util/pmu-hybrid.c       |  1 -
> >  tools/perf/util/pmu.c              |  1 -
> >  tools/perf/util/python-ext-sources |  1 -
> >  tools/perf/util/srccode.c          | 10 ++++-
> >  12 files changed, 75 insertions(+), 77 deletions(-)
> >  create mode 100644 tools/lib/api/fs/fncache.c
> >  delete mode 100644 tools/perf/util/fncache.c
> >  delete mode 100644 tools/perf/util/fncache.h
> >
> > diff --git a/tools/lib/api/fs/Build b/tools/lib/api/fs/Build
> > index 0f75b28654de..3af4b5265a5f 100644
> > --- a/tools/lib/api/fs/Build
> > +++ b/tools/lib/api/fs/Build
> > @@ -1,3 +1,4 @@
> >  libapi-y += fs.o
> >  libapi-y += tracing_path.o
> >  libapi-y += cgroup.o
> > +libapi-y += fncache.o
> > diff --git a/tools/lib/api/fs/fncache.c b/tools/lib/api/fs/fncache.c
> > new file mode 100644
> > index 000000000000..7fb4586c341a
> > --- /dev/null
> > +++ b/tools/lib/api/fs/fncache.c
> > @@ -0,0 +1,63 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +/* Manage a cache of file names' existence */
> > +#include <stdlib.h>
> > +#include <unistd.h>
> > +#include <string.h>
> > +#include <linux/list.h>
> > +#include "fs.h"
> > +
> > +struct fncache {
> > +       struct hlist_node nd;
> > +       bool res;
> > +       char name[];
> > +};
> > +
> > +#define FNHSIZE 61
> > +
> > +static struct hlist_head fncache_hash[FNHSIZE];
> > +
> > +static unsigned shash(const unsigned char *s)
> > +{
> > +       unsigned h = 0;
> > +       while (*s)
> > +               h = 65599 * h + *s++;
> > +       return h ^ (h >> 16);
> > +}
> > +
> > +static bool lookup_fncache(const char *name, bool *res)
> > +{
> > +       int h = shash((const unsigned char *)name) % FNHSIZE;
> > +       struct fncache *n;
> > +
> > +       hlist_for_each_entry(n, &fncache_hash[h], nd) {
> > +               if (!strcmp(n->name, name)) {
> > +                       *res = n->res;
> > +                       return true;
> > +               }
> > +       }
> > +       return false;
> > +}
> > +
> > +static void update_fncache(const char *name, bool res)
> > +{
> > +       struct fncache *n = malloc(sizeof(struct fncache) + strlen(name) + 1);
> > +       int h = shash((const unsigned char *)name) % FNHSIZE;
> > +
> > +       if (!n)
> > +               return;
> > +       strcpy(n->name, name);
> > +       n->res = res;
> > +       hlist_add_head(&n->nd, &fncache_hash[h]);
> > +}
> > +
> > +/* No LRU, only use when bounded in some other way. */
> > +bool file_available(const char *name)
> > +{
> > +       bool res;
> > +
> > +       if (lookup_fncache(name, &res))
> > +               return res;
> > +       res = access(name, R_OK) == 0;
> > +       update_fncache(name, res);
> > +       return res;
> > +}
> > diff --git a/tools/lib/api/fs/fs.h b/tools/lib/api/fs/fs.h
> > index aa222ca30311..c42d4ff30ca7 100644
> > --- a/tools/lib/api/fs/fs.h
> > +++ b/tools/lib/api/fs/fs.h
> > @@ -59,4 +59,6 @@ int sysfs__read_str(const char *entry, char **buf, size_t *sizep);
> >  int sysfs__read_bool(const char *entry, bool *value);
> >
> >  int sysfs__write_int(const char *entry, int value);
> > +
> > +bool file_available(const char *name);
> >  #endif /* __API_FS__ */
> > diff --git a/tools/perf/arch/x86/util/pmu.c b/tools/perf/arch/x86/util/pmu.c
> > index 74d69db1ea99..c875dded65bb 100644
> > --- a/tools/perf/arch/x86/util/pmu.c
> > +++ b/tools/perf/arch/x86/util/pmu.c
> > @@ -13,7 +13,6 @@
> >  #include "../../../util/intel-pt.h"
> >  #include "../../../util/intel-bts.h"
> >  #include "../../../util/pmu.h"
> > -#include "../../../util/fncache.h"
> >
> >  #define TEMPLATE_ALIAS "%s/bus/event_source/devices/%s/alias"
> >
> > diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
> > index 8875e388563e..69381fe1655d 100644
> > --- a/tools/perf/tests/parse-events.c
> > +++ b/tools/perf/tests/parse-events.c
> > @@ -9,7 +9,6 @@
> >  #include "pmu-hybrid.h"
> >  #include <dirent.h>
> >  #include <errno.h>
> > -#include "fncache.h"
> >  #include <sys/types.h>
> >  #include <sys/stat.h>
> >  #include <unistd.h>
> > diff --git a/tools/perf/util/Build b/tools/perf/util/Build
> > index 03d5d6ed7fe4..b93828aacc27 100644
> > --- a/tools/perf/util/Build
> > +++ b/tools/perf/util/Build
> > @@ -52,7 +52,6 @@ perf-y += header.o
> >  perf-y += callchain.o
> >  perf-y += values.o
> >  perf-y += debug.o
> > -perf-y += fncache.o
> >  perf-y += machine.o
> >  perf-y += map.o
> >  perf-y += pstack.o
> > diff --git a/tools/perf/util/fncache.c b/tools/perf/util/fncache.c
> > deleted file mode 100644
> > index 6225cbc52310..000000000000
> > --- a/tools/perf/util/fncache.c
> > +++ /dev/null
> > @@ -1,63 +0,0 @@
> > -// SPDX-License-Identifier: GPL-2.0-only
> > -/* Manage a cache of file names' existence */
> > -#include <stdlib.h>
> > -#include <unistd.h>
> > -#include <string.h>
> > -#include <linux/list.h>
> > -#include "fncache.h"
> > -
> > -struct fncache {
> > -       struct hlist_node nd;
> > -       bool res;
> > -       char name[];
> > -};
> > -
> > -#define FNHSIZE 61
> > -
> > -static struct hlist_head fncache_hash[FNHSIZE];
> > -
> > -unsigned shash(const unsigned char *s)
> > -{
> > -       unsigned h = 0;
> > -       while (*s)
> > -               h = 65599 * h + *s++;
> > -       return h ^ (h >> 16);
> > -}
> > -
> > -static bool lookup_fncache(const char *name, bool *res)
> > -{
> > -       int h = shash((const unsigned char *)name) % FNHSIZE;
> > -       struct fncache *n;
> > -
> > -       hlist_for_each_entry(n, &fncache_hash[h], nd) {
> > -               if (!strcmp(n->name, name)) {
> > -                       *res = n->res;
> > -                       return true;
> > -               }
> > -       }
> > -       return false;
> > -}
> > -
> > -static void update_fncache(const char *name, bool res)
> > -{
> > -       struct fncache *n = malloc(sizeof(struct fncache) + strlen(name) + 1);
> > -       int h = shash((const unsigned char *)name) % FNHSIZE;
> > -
> > -       if (!n)
> > -               return;
> > -       strcpy(n->name, name);
> > -       n->res = res;
> > -       hlist_add_head(&n->nd, &fncache_hash[h]);
> > -}
> > -
> > -/* No LRU, only use when bounded in some other way. */
> > -bool file_available(const char *name)
> > -{
> > -       bool res;
> > -
> > -       if (lookup_fncache(name, &res))
> > -               return res;
> > -       res = access(name, R_OK) == 0;
> > -       update_fncache(name, res);
> > -       return res;
> > -}
> > diff --git a/tools/perf/util/fncache.h b/tools/perf/util/fncache.h
> > deleted file mode 100644
> > index fe020beaefb1..000000000000
> > --- a/tools/perf/util/fncache.h
> > +++ /dev/null
> > @@ -1,7 +0,0 @@
> > -#ifndef _FCACHE_H
> > -#define _FCACHE_H 1
> > -
> > -unsigned shash(const unsigned char *s);
> > -bool file_available(const char *name);
> > -
> > -#endif
> > diff --git a/tools/perf/util/pmu-hybrid.c b/tools/perf/util/pmu-hybrid.c
> > index f51ccaac60ee..65fdce81a384 100644
> > --- a/tools/perf/util/pmu-hybrid.c
> > +++ b/tools/perf/util/pmu-hybrid.c
> > @@ -13,7 +13,6 @@
> >  #include <stdarg.h>
> >  #include <locale.h>
> >  #include <api/fs/fs.h>
> > -#include "fncache.h"
> >  #include "pmu-hybrid.h"
> >
> >  LIST_HEAD(perf_pmu__hybrid_pmus);
> > diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
> > index 55d834160428..13e1835955e0 100644
> > --- a/tools/perf/util/pmu.c
> > +++ b/tools/perf/util/pmu.c
> > @@ -26,7 +26,6 @@
> >  #include "header.h"
> >  #include "string2.h"
> >  #include "strbuf.h"
> > -#include "fncache.h"
> >  #include "pmu-hybrid.h"
> >
> >  struct perf_pmu perf_pmu__fake;
> > diff --git a/tools/perf/util/python-ext-sources b/tools/perf/util/python-ext-sources
> > index a685d20165f7..992a76c2af01 100644
> > --- a/tools/perf/util/python-ext-sources
> > +++ b/tools/perf/util/python-ext-sources
> > @@ -39,4 +39,3 @@ util/affinity.c
> >  util/rwsem.c
> >  util/hashmap.c
> >  util/pmu-hybrid.c
> > -util/fncache.c
> > diff --git a/tools/perf/util/srccode.c b/tools/perf/util/srccode.c
> > index 476e99896d5e..5c1ff87eb98c 100644
> > --- a/tools/perf/util/srccode.c
> > +++ b/tools/perf/util/srccode.c
> > @@ -16,7 +16,7 @@
> >  #include "srccode.h"
> >  #include "debug.h"
> >  #include <internal/lib.h> // page_size
> > -#include "fncache.h"
> > +#include <api/fs/fs.h>
> >
> >  #define MAXSRCCACHE (32*1024*1024)
> >  #define MAXSRCFILES     64
> > @@ -86,6 +86,14 @@ static void free_srcfile(struct srcfile *sf)
> >         num_srcfiles--;
> >  }
> >
> > +static unsigned shash(const unsigned char *s)
> > +{
> > +       unsigned h = 0;
> > +       while (*s)
> > +               h = 65599 * h + *s++;
> > +       return h ^ (h >> 16);
> > +}
> > +
> >  static struct srcfile *find_srcfile(char *fn)
> >  {
> >         struct stat st;
> > --
> > 2.31.1
> >
> 


^ permalink raw reply	[flat|nested] 78+ messages in thread

* Re: [PATCH 13/59] libperf: Move exclude_GH to perf_evsel
  2021-11-08 17:53   ` Ian Rogers
@ 2021-11-08 21:16     ` Jiri Olsa
  0 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 21:16 UTC (permalink / raw)
  To: Ian Rogers; +Cc: Arnaldo Carvalho de Melo, Namhyung Kim, linux-perf-users

On Mon, Nov 08, 2021 at 09:53:44AM -0800, Ian Rogers wrote:
> On Mon, Nov 8, 2021 at 5:38 AM Jiri Olsa <jolsa@redhat.com> wrote:
> >
> > Moving exclude_GH to perf_evsel struct.
> >
> > Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> > ---
> >  tools/lib/perf/include/internal/evsel.h | 1 +
> >  tools/perf/util/evsel.c                 | 2 +-
> >  tools/perf/util/evsel.h                 | 1 -
> >  tools/perf/util/parse-events.c          | 4 ++--
> >  4 files changed, 4 insertions(+), 4 deletions(-)
> >
> > diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
> > index b96c9f4808ca..7f3ee73c5aa5 100644
> > --- a/tools/lib/perf/include/internal/evsel.h
> > +++ b/tools/lib/perf/include/internal/evsel.h
> > @@ -69,6 +69,7 @@ struct perf_evsel {
> >                 const char              *metric_id;
> >                 enum perf_tool_event    tool_event;
> >                 const char              *unit;
> > +               int                     exclude_GH;
> 
> I think it'd be pretty awesome if when these things get moved around
> we added a comment here to explain what the variable means. Perhaps
> even put an example :-) In this case it could explain why this is an
> int and not a bool. This is a while you are here request rather than a
> criticism of the changes which I find fine.

ok, I noticed you added several comments like that already,
I'll put some in here in next version

thanks,
jirka

> 
> Thanks,
> Ian
> 
> >         };
> >  };
> >
> > diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> > index 133b571e1190..802c7de9e8e3 100644
> > --- a/tools/perf/util/evsel.c
> > +++ b/tools/perf/util/evsel.c
> > @@ -431,7 +431,7 @@ struct evsel *evsel__clone(struct evsel *orig)
> >         evsel->use_uncore_alias = orig->use_uncore_alias;
> >         evsel->is_libpfm_event = orig->is_libpfm_event;
> >
> > -       evsel->exclude_GH = orig->exclude_GH;
> > +       evsel->core.exclude_GH = orig->core.exclude_GH;
> >         evsel->sample_read = orig->sample_read;
> >         evsel->core.auto_merge_stats = orig->core.auto_merge_stats;
> >         evsel->collect_stat = orig->collect_stat;
> > diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
> > index f6cc1e78903f..6c3634ed169a 100644
> > --- a/tools/perf/util/evsel.h
> > +++ b/tools/perf/util/evsel.h
> > @@ -62,7 +62,6 @@ struct evsel {
> >                 double                  scale;
> >                 struct cgroup           *cgrp;
> >                 /* parse modifier helper */
> > -               int                     exclude_GH;
> >                 int                     sample_read;
> >                 bool                    snapshot;
> >                 bool                    per_pkg;
> > diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> > index 1878ea1310d3..89787ebc23ef 100644
> > --- a/tools/perf/util/parse-events.c
> > +++ b/tools/perf/util/parse-events.c
> > @@ -1918,7 +1918,7 @@ static int get_event_modifier(struct event_modifier *mod, char *str,
> >         int exclusive = evsel ? evsel->core.attr.exclusive : 0;
> >
> >         int exclude = eu | ek | eh;
> > -       int exclude_GH = evsel ? evsel->exclude_GH : 0;
> > +       int exclude_GH = evsel ? evsel->core.exclude_GH : 0;
> >         int weak = 0;
> >         int bpf_counter = 0;
> >
> > @@ -2049,7 +2049,7 @@ int parse_events__modifier_event(struct list_head *list, char *str, bool add)
> >                 evsel->core.attr.exclude_host   = mod.eH;
> >                 evsel->core.attr.exclude_guest  = mod.eG;
> >                 evsel->core.attr.exclude_idle   = mod.eI;
> > -               evsel->exclude_GH          = mod.exclude_GH;
> > +               evsel->core.exclude_GH          = mod.exclude_GH;
> >                 evsel->sample_read         = mod.sample_read;
> >                 evsel->precise_max         = mod.precise_max;
> >                 evsel->weak_group          = mod.weak;
> > --
> > 2.31.1
> >
> 


^ permalink raw reply	[flat|nested] 78+ messages in thread

* Re: [PATCH 18/59] libperf: Move group_name to perf_evsel
  2021-11-08 18:07     ` Arnaldo Carvalho de Melo
@ 2021-11-08 21:19       ` Jiri Olsa
  0 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 21:19 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Ian Rogers, Arnaldo Carvalho de Melo, Namhyung Kim, linux-perf-users

On Mon, Nov 08, 2021 at 03:07:05PM -0300, Arnaldo Carvalho de Melo wrote:
> 
> 
> On November 8, 2021 2:58:39 PM GMT-03:00, Ian Rogers <irogers@google.com> wrote:
> >On Mon, Nov 8, 2021 at 5:39 AM Jiri Olsa <jolsa@redhat.com> wrote:
> >>
> >> Moving group_name to perf_evsel struct.
> >>
> >> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> >> ---
> >>  tools/lib/perf/include/internal/evsel.h |  1 +
> >>  tools/perf/tests/parse-events.c         | 32 ++++++++++++-------------
> >>  tools/perf/util/auxtrace.c              |  6 ++---
> >>  tools/perf/util/evsel.c                 | 10 ++++----
> >>  tools/perf/util/evsel.h                 |  1 -
> >>  tools/perf/util/evsel_fprintf.c         |  2 +-
> >>  tools/perf/util/header.c                |  6 ++---
> >>  tools/perf/util/parse-events.c          |  4 ++--
> >>  8 files changed, 31 insertions(+), 31 deletions(-)
> >>
> >> diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
> >> index 81df282fa008..befcd180ef3d 100644
> >> --- a/tools/lib/perf/include/internal/evsel.h
> >> +++ b/tools/lib/perf/include/internal/evsel.h
> >> @@ -64,6 +64,7 @@ struct perf_evsel {
> >>          */
> >>          struct {
> >>                  char                   *name;
> >> +               const char              *group_name;
> >
> >I like the constification here. But why constify group_name and not
> >name as well?
> 
> 
> Can be done in a separate patch, in other series, no?
> 
> I understand that he probably is taking advantage of this move do constify 'group_name', but then, looks unrelated too this move to libperf as well.

definitely separate patch, to have the move separated.. perhaps someone
could do constification patchset ;-) I'll put this one on top of the
patchset

thanks,
jirka

> 
> - Arnaldo
> 
> 
> 
> >
> >Thanks,
> >Ian
> >
> >>                 bool                    auto_merge_stats;
> >>                 struct list_head        config_terms;
> >>                 const char              *metric_id;
> >> diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
> >> index 15d6d3d907b7..50746bb524f0 100644
> >> --- a/tools/perf/tests/parse-events.c
> >> +++ b/tools/perf/tests/parse-events.c
> >> @@ -782,7 +782,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
> >>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> >>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
> >>         TEST_ASSERT_VAL("wrong group name",
> >> -               !strcmp(leader->group_name, "group1"));
> >> +               !strcmp(leader->core.group_name, "group1"));
> >>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
> >>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
> >>         TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
> >> @@ -800,7 +800,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
> >>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
> >>         TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 3);
> >>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
> >> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> >> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
> >>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
> >>         TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
> >>
> >> @@ -817,7 +817,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
> >>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> >>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
> >>         TEST_ASSERT_VAL("wrong group name",
> >> -               !strcmp(leader->group_name, "group2"));
> >> +               !strcmp(leader->core.group_name, "group2"));
> >>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
> >>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
> >>         TEST_ASSERT_VAL("wrong sample_read", !evsel->core.sample_read);
> >> @@ -872,7 +872,7 @@ static int test__group4(struct evlist *evlist __maybe_unused)
> >>         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
> >>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
> >>         TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 1);
> >> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> >> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
> >>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
> >>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
> >>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
> >> @@ -915,7 +915,7 @@ static int test__group5(struct evlist *evlist __maybe_unused)
> >>         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
> >>         TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
> >>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> >> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> >> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
> >>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
> >>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
> >>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
> >> @@ -947,7 +947,7 @@ static int test__group5(struct evlist *evlist __maybe_unused)
> >>         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
> >>         TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
> >>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> >> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> >> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
> >>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
> >>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
> >>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
> >> @@ -1001,7 +1001,7 @@ static int test__group_gh1(struct evlist *evlist)
> >>         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
> >>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
> >>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> >> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> >> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
> >>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
> >>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
> >>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
> >> @@ -1041,7 +1041,7 @@ static int test__group_gh2(struct evlist *evlist)
> >>         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
> >>         TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
> >>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> >> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> >> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
> >>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
> >>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
> >>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
> >> @@ -1081,7 +1081,7 @@ static int test__group_gh3(struct evlist *evlist)
> >>         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
> >>         TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
> >>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> >> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> >> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
> >>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
> >>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
> >>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
> >> @@ -1121,7 +1121,7 @@ static int test__group_gh4(struct evlist *evlist)
> >>         TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
> >>         TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
> >>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> >> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> >> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
> >>         TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
> >>         TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
> >>         TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
> >> @@ -1160,7 +1160,7 @@ static int test__leader_sample1(struct evlist *evlist)
> >>         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
> >>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
> >>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> >> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> >> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
> >>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
> >>         TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
> >>
> >> @@ -1189,7 +1189,7 @@ static int test__leader_sample1(struct evlist *evlist)
> >>         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
> >>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
> >>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> >> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> >> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
> >>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
> >>         TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
> >>
> >> @@ -1213,7 +1213,7 @@ static int test__leader_sample2(struct evlist *evlist __maybe_unused)
> >>         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
> >>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
> >>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> >> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> >> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
> >>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
> >>         TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
> >>
> >> @@ -1228,7 +1228,7 @@ static int test__leader_sample2(struct evlist *evlist __maybe_unused)
> >>         TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
> >>         TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
> >>         TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
> >> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> >> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
> >>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
> >>         TEST_ASSERT_VAL("wrong sample_read", evsel->core.sample_read);
> >>
> >> @@ -1259,7 +1259,7 @@ static int test__pinned_group(struct evlist *evlist)
> >>         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
> >>         TEST_ASSERT_VAL("wrong config",
> >>                         PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
> >> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> >> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
> >>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
> >>         TEST_ASSERT_VAL("wrong pinned", evsel->core.attr.pinned);
> >>
> >> @@ -1303,7 +1303,7 @@ static int test__exclusive_group(struct evlist *evlist)
> >>         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
> >>         TEST_ASSERT_VAL("wrong config",
> >>                         PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
> >> -       TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
> >> +       TEST_ASSERT_VAL("wrong group name", !evsel->core.group_name);
> >>         TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
> >>         TEST_ASSERT_VAL("wrong exclusive", evsel->core.attr.exclusive);
> >>
> >> diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
> >> index c679394b898d..a882bc81e0fb 100644
> >> --- a/tools/perf/util/auxtrace.c
> >> +++ b/tools/perf/util/auxtrace.c
> >> @@ -1235,9 +1235,9 @@ static void unleader_evsel(struct evlist *evlist, struct evsel *leader)
> >>
> >>         /* Update group information */
> >>         if (new_leader) {
> >> -               zfree(&new_leader->group_name);
> >> -               new_leader->group_name = leader->group_name;
> >> -               leader->group_name = NULL;
> >> +               zfree(&new_leader->core.group_name);
> >> +               new_leader->core.group_name = leader->core.group_name;
> >> +               leader->core.group_name = NULL;
> >>
> >>                 new_leader->core.nr_members = leader->core.nr_members - 1;
> >>                 leader->core.nr_members = 1;
> >> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> >> index aafd91805870..7621eddc8e58 100644
> >> --- a/tools/perf/util/evsel.c
> >> +++ b/tools/perf/util/evsel.c
> >> @@ -395,9 +395,9 @@ struct evsel *evsel__clone(struct evsel *orig)
> >>                 if (evsel->core.name == NULL)
> >>                         goto out_err;
> >>         }
> >> -       if (orig->group_name) {
> >> -               evsel->group_name = strdup(orig->group_name);
> >> -               if (evsel->group_name == NULL)
> >> +       if (orig->core.group_name) {
> >> +               evsel->core.group_name = strdup(orig->core.group_name);
> >> +               if (evsel->core.group_name == NULL)
> >>                         goto out_err;
> >>         }
> >>         if (orig->pmu_name) {
> >> @@ -797,7 +797,7 @@ const char *evsel__metric_id(const struct evsel *evsel)
> >>
> >>  const char *evsel__group_name(struct evsel *evsel)
> >>  {
> >> -       return evsel->group_name ?: "anon group";
> >> +       return evsel->core.group_name ?: "anon group";
> >>  }
> >>
> >>  /*
> >> @@ -1436,7 +1436,7 @@ void evsel__exit(struct evsel *evsel)
> >>         perf_cpu_map__put(evsel->core.cpus);
> >>         perf_cpu_map__put(evsel->core.own_cpus);
> >>         perf_thread_map__put(evsel->core.threads);
> >> -       zfree(&evsel->group_name);
> >> +       zfree(&evsel->core.group_name);
> >>         zfree(&evsel->core.name);
> >>         zfree(&evsel->pmu_name);
> >>         zfree(&evsel->core.metric_id);
> >> diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
> >> index c09bbddd5da0..e06d171baba3 100644
> >> --- a/tools/perf/util/evsel.h
> >> +++ b/tools/perf/util/evsel.h
> >> @@ -54,7 +54,6 @@ struct evsel {
> >>          * they can be released properly.
> >>          */
> >>         struct {
> >> -               char                    *group_name;
> >>                 const char              *pmu_name;
> >>                 struct tep_event        *tp_format;
> >>                 char                    *filter;
> >> diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprintf.c
> >> index 8c2ea8001329..4670d1e745b2 100644
> >> --- a/tools/perf/util/evsel_fprintf.c
> >> +++ b/tools/perf/util/evsel_fprintf.c
> >> @@ -48,7 +48,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
> >>                         return 0;
> >>
> >>                 if (evsel->core.nr_members > 1)
> >> -                       printed += fprintf(fp, "%s{", evsel->group_name ?: "");
> >> +                       printed += fprintf(fp, "%s{", evsel->core.group_name ?: "");
> >>
> >>                 printed += fprintf(fp, "%s", evsel__name(evsel));
> >>                 for_each_group_member(pos, evsel)
> >> diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
> >> index 4610b23fed28..a14b690a6025 100644
> >> --- a/tools/perf/util/header.c
> >> +++ b/tools/perf/util/header.c
> >> @@ -788,7 +788,7 @@ static int write_group_desc(struct feat_fd *ff,
> >>
> >>         evlist__for_each_entry(evlist, evsel) {
> >>                 if (evsel__is_group_leader(evsel) && evsel->core.nr_members > 1) {
> >> -                       const char *name = evsel->group_name ?: "{anon_group}";
> >> +                       const char *name = evsel->core.group_name ?: "{anon_group}";
> >>                         u32 leader_idx = evsel->core.idx;
> >>                         u32 nr_members = evsel->core.nr_members;
> >>
> >> @@ -2094,7 +2094,7 @@ static void print_group_desc(struct feat_fd *ff, FILE *fp)
> >>
> >>         evlist__for_each_entry(session->evlist, evsel) {
> >>                 if (evsel__is_group_leader(evsel) && evsel->core.nr_members > 1) {
> >> -                       fprintf(fp, "# group: %s{%s", evsel->group_name ?: "", evsel__name(evsel));
> >> +                       fprintf(fp, "# group: %s{%s", evsel->core.group_name ?: "", evsel__name(evsel));
> >>
> >>                         nr = evsel->core.nr_members - 1;
> >>                 } else if (nr) {
> >> @@ -2743,7 +2743,7 @@ static int process_group_desc(struct feat_fd *ff, void *data __maybe_unused)
> >>                         evsel__set_leader(evsel, evsel);
> >>                         /* {anon_group} is a dummy name */
> >>                         if (strcmp(desc[i].name, "{anon_group}")) {
> >> -                               evsel->group_name = desc[i].name;
> >> +                               evsel->core.group_name = desc[i].name;
> >>                                 desc[i].name = NULL;
> >>                         }
> >>                         evsel->core.nr_members = desc[i].nr_members;
> >> diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> >> index 24d01b768078..05a96b0f7b41 100644
> >> --- a/tools/perf/util/parse-events.c
> >> +++ b/tools/perf/util/parse-events.c
> >> @@ -1841,7 +1841,7 @@ parse_events__set_leader_for_uncore_aliase(char *name, struct list_head *list,
> >>         for (i = 0; i < nr_pmu; i++) {
> >>                 evsel = (struct evsel *) leaders[i];
> >>                 evsel->core.nr_members = total_members / nr_pmu;
> >> -               evsel->group_name = name ? strdup(name) : NULL;
> >> +               evsel->core.group_name = name ? strdup(name) : NULL;
> >>         }
> >>
> >>         /* Take the new small groups into account */
> >> @@ -1869,7 +1869,7 @@ void parse_events__set_leader(char *name, struct list_head *list,
> >>
> >>         __perf_evlist__set_leader(list);
> >>         leader = list_entry(list->next, struct evsel, core.node);
> >> -       leader->group_name = name ? strdup(name) : NULL;
> >> +       leader->core.group_name = name ? strdup(name) : NULL;
> >>  }
> >>
> >>  /* list_event is assumed to point to malloc'ed memory */
> >> --
> >> 2.31.1
> >>
> 


^ permalink raw reply	[flat|nested] 78+ messages in thread

* Re: [PATCH 19/59] perf tools: Fix parse_events_term__num call
  2021-11-08 18:15   ` Ian Rogers
@ 2021-11-08 21:21     ` Jiri Olsa
  0 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 21:21 UTC (permalink / raw)
  To: Ian Rogers; +Cc: Arnaldo Carvalho de Melo, Namhyung Kim, linux-perf-users

On Mon, Nov 08, 2021 at 10:15:45AM -0800, Ian Rogers wrote:
> On Mon, Nov 8, 2021 at 5:39 AM Jiri Olsa <jolsa@redhat.com> wrote:
> >
> > We are wrongly passing &config to parse_events_term__num
> > as loc_term_ argument.
> >
> > Fixes: fb0811535e92 ("perf parse-events: Allow config on kernel PMU events")
> 
> I think this shows up on the fix as this change moved the code around,
> but it didn't originate the issue. This pattern is common in
> parse-events.y, are they also problematic?
> https://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git/tree/tools/perf/util/parse-events.y?h=perf/core#n783

they all seem to pass proper loc_term pointer.. I spot this one
by accident and made quick patch, I'll double check the others

thanks,
jirka

> 
> Thanks,
> Ian
> 
> > Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> > ---
> >  tools/perf/util/parse-events.c | 3 +--
> >  1 file changed, 1 insertion(+), 2 deletions(-)
> >
> > diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> > index 05a96b0f7b41..2bacbab86b09 100644
> > --- a/tools/perf/util/parse-events.c
> > +++ b/tools/perf/util/parse-events.c
> > @@ -1697,8 +1697,7 @@ int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
> >
> >         if (parse_events_term__num(&term,
> >                                    PARSE_EVENTS__TERM_TYPE_USER,
> > -                                  config, 1, false, &config,
> > -                                       NULL) < 0) {
> > +                                  config, 1, false, NULL, NULL) < 0) {
> >                 free(config);
> >                 goto out_err;
> >         }
> > --
> > 2.31.1
> >
> 


^ permalink raw reply	[flat|nested] 78+ messages in thread

* Re: [PATCH 30/59] libperf: Move in struct parse_events_state
  2021-11-08 18:21   ` Ian Rogers
@ 2021-11-08 21:24     ` Jiri Olsa
  0 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 21:24 UTC (permalink / raw)
  To: Ian Rogers; +Cc: Arnaldo Carvalho de Melo, Namhyung Kim, linux-perf-users

On Mon, Nov 08, 2021 at 10:21:14AM -0800, Ian Rogers wrote:
> On Mon, Nov 8, 2021 at 5:40 AM Jiri Olsa <jolsa@redhat.com> wrote:
> >
> > Moving in struct parse_events_state to libperf
> > together with related structs.
> >
> > Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> > ---
> >  .../lib/perf/include/internal/parse-events.h  | 29 +++++++++++++++++++
> >  tools/perf/util/parse-events.h                | 28 ------------------
> >  2 files changed, 29 insertions(+), 28 deletions(-)
> >
> > diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
> > index 46f632efd71b..aff13afa08e1 100644
> > --- a/tools/lib/perf/include/internal/parse-events.h
> > +++ b/tools/lib/perf/include/internal/parse-events.h
> > @@ -5,6 +5,7 @@
> >  #include <linux/types.h>
> >  #include <linux/list.h>
> >  #include <unistd.h>
> > +#include <linux/perf_event.h>
> >
> >  struct event_symbol {
> >         const char      *symbol;
> > @@ -74,6 +75,34 @@ struct parse_events_term {
> >         bool weak;
> >  };
> >
> > +struct parse_events_error {
> > +       int   num_errors;       /* number of errors encountered */
> > +       int   idx;      /* index in the parsed string */
> > +       char *str;      /* string to display at the index */
> > +       char *help;     /* optional help string */
> > +       int   first_idx;/* as above, but for the first encountered error */
> > +       char *first_str;
> > +       char *first_help;
> > +};
> 
> Just to note that this will conflict with the patches in:
> https://lore.kernel.org/lkml/YYfyEcPfj5ct7w7Q@kernel.org/
> Which may mean a bit larger change.

right, thanks for heads up.. I'm ok with rebasing this on top of that
and other changes.. I did that many times already ;-)

jirka

> 
> Thanks,
> Ian
> 
> > +struct parse_events_ops {
> > +       struct perf_evsel* (*perf_evsel__new)(struct perf_event_attr *attr, int idx);
> > +       struct perf_evsel* (*perf_evsel__new_tp)(const char *sys, const char *name, int idx);
> > +};
> > +
> > +struct parse_events_state {
> > +       struct list_head           list;
> > +       int                        idx;
> > +       int                        nr_groups;
> > +       struct parse_events_error *error;
> > +       struct perf_evlist        *evlist;
> > +       struct list_head          *terms;
> > +       int                        stoken;
> > +       struct perf_pmu           *fake_pmu;
> > +       char                      *hybrid_pmu_name;
> > +       struct parse_events_ops   *ops;
> > +};
> > +
> >  int parse_events_term__num(struct parse_events_term **term,
> >                            int type_term, char *config, u64 num,
> >                            bool novalue,
> > diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
> > index 2f75e823124f..057b92778d17 100644
> > --- a/tools/perf/util/parse-events.h
> > +++ b/tools/perf/util/parse-events.h
> > @@ -61,34 +61,6 @@ struct perf_pmu_event_symbol {
> >         enum perf_pmu_event_symbol_type type;
> >  };
> >
> > -struct parse_events_error {
> > -       int   num_errors;       /* number of errors encountered */
> > -       int   idx;      /* index in the parsed string */
> > -       char *str;      /* string to display at the index */
> > -       char *help;     /* optional help string */
> > -       int   first_idx;/* as above, but for the first encountered error */
> > -       char *first_str;
> > -       char *first_help;
> > -};
> > -
> > -struct parse_events_ops {
> > -       struct perf_evsel* (*perf_evsel__new)(struct perf_event_attr *attr, int idx);
> > -       struct perf_evsel* (*perf_evsel__new_tp)(const char *sys, const char *name, int idx);
> > -};
> > -
> > -struct parse_events_state {
> > -       struct list_head           list;
> > -       int                        idx;
> > -       int                        nr_groups;
> > -       struct parse_events_error *error;
> > -       struct perf_evlist        *evlist;
> > -       struct list_head          *terms;
> > -       int                        stoken;
> > -       struct perf_pmu           *fake_pmu;
> > -       char                      *hybrid_pmu_name;
> > -       struct parse_events_ops   *ops;
> > -};
> > -
> >  void parse_events__handle_error(struct parse_events_error *err, int idx,
> >                                 char *str, char *help);
> >  void parse_events__shrink_config_terms(void);
> > --
> > 2.31.1
> >
> 


^ permalink raw reply	[flat|nested] 78+ messages in thread

* Re: [PATCH 42/59] libperf: Move in parse_events_name function
  2021-11-08 18:23   ` Ian Rogers
@ 2021-11-08 21:24     ` Jiri Olsa
  0 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 21:24 UTC (permalink / raw)
  To: Ian Rogers; +Cc: Arnaldo Carvalho de Melo, Namhyung Kim, linux-perf-users

On Mon, Nov 08, 2021 at 10:23:59AM -0800, Ian Rogers wrote:
> On Mon, Nov 8, 2021 at 5:41 AM Jiri Olsa <jolsa@redhat.com> wrote:
> >
> > Moving parse_events_name function to libperf.
> >
> > Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> > ---
> >  tools/lib/perf/include/internal/parse-events.h |  1 +
> >  tools/lib/perf/parse-events.c                  | 12 ++++++++++++
> >  tools/perf/util/parse-events.c                 | 12 ------------
> >  tools/perf/util/parse-events.h                 |  1 -
> >  4 files changed, 13 insertions(+), 13 deletions(-)
> >
> > diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
> > index 1d7ee03b8a80..11a85a118480 100644
> > --- a/tools/lib/perf/include/internal/parse-events.h
> > +++ b/tools/lib/perf/include/internal/parse-events.h
> > @@ -137,4 +137,5 @@ void parse_events__handle_error(struct parse_events_error *err, int idx,
> >                                 char *str, char *help);
> >  void parse_events_evlist_error(struct parse_events_state *parse_state,
> >                                int idx, const char *str);
> > +int parse_events_name(struct list_head *list, const char *name);
> >  #endif /* __LIBPERF_PARSE_EVENTS_H */
> > diff --git a/tools/lib/perf/parse-events.c b/tools/lib/perf/parse-events.c
> > index 07c89a3601b1..6efc2bb73cdf 100644
> > --- a/tools/lib/perf/parse-events.c
> > +++ b/tools/lib/perf/parse-events.c
> > @@ -580,3 +580,15 @@ void parse_events_evlist_error(struct parse_events_state *parse_state,
> >
> >         parse_events__handle_error(parse_state->error, idx, strdup(str), NULL);
> >  }
> > +
> > +int parse_events_name(struct list_head *list, const char *name)
> > +{
> > +       struct perf_evsel *evsel;
> > +
> > +       __perf_evlist__for_each_entry(list, evsel) {
> > +               if (!evsel->name)
> > +                       evsel->name = strdup(name);
> 
> It is a pre-existing problem but there should probably be an ENOMEM check here.

and we even return int.. thanks for noticing, will fix

jirka

> 
> Thanks,
> Ian
> 
> > +       }
> > +
> > +       return 0;
> > +}
> > diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> > index 0f2bf2b48888..1469bdf88f2b 100644
> > --- a/tools/perf/util/parse-events.c
> > +++ b/tools/perf/util/parse-events.c
> > @@ -1721,18 +1721,6 @@ void parse_events__set_leader(char *name, struct list_head *list,
> >         leader->core.group_name = name ? strdup(name) : NULL;
> >  }
> >
> > -int parse_events_name(struct list_head *list, const char *name)
> > -{
> > -       struct evsel *evsel;
> > -
> > -       __evlist__for_each_entry(list, evsel) {
> > -               if (!evsel->core.name)
> > -                       evsel->core.name = strdup(name);
> > -       }
> > -
> > -       return 0;
> > -}
> > -
> >  static int
> >  comp_pmu(const void *p1, const void *p2)
> >  {
> > diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
> > index cc7c6449d423..5530614e7a10 100644
> > --- a/tools/perf/util/parse-events.h
> > +++ b/tools/perf/util/parse-events.h
> > @@ -63,7 +63,6 @@ struct perf_pmu_event_symbol {
> >
> >  void parse_events__shrink_config_terms(void);
> >  void parse_events__clear_array(struct parse_events_array *a);
> > -int parse_events_name(struct list_head *list, const char *name);
> >  int parse_events_add_tracepoint(struct parse_events_state *parse_state,
> >                                 struct list_head *list,
> >                                 const char *sys, const char *event,
> > --
> > 2.31.1
> >
> 


^ permalink raw reply	[flat|nested] 78+ messages in thread

* Re: [PATCH 46/59] perf tools: Add add_numeric callback to struct parse_events_ops
  2021-11-08 18:27   ` Ian Rogers
@ 2021-11-08 21:34     ` Jiri Olsa
  0 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 21:34 UTC (permalink / raw)
  To: Ian Rogers; +Cc: Arnaldo Carvalho de Melo, Namhyung Kim, linux-perf-users

On Mon, Nov 08, 2021 at 10:27:10AM -0800, Ian Rogers wrote:
> On Mon, Nov 8, 2021 at 5:41 AM Jiri Olsa <jolsa@redhat.com> wrote:
> >
> > Adding add_numeric callback to struct parse_events_ops,
> > to allow custom numeric parsing code.
> >
> > Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> > ---
> >  tools/lib/perf/include/internal/parse-events.h |  5 +++++
> >  tools/perf/util/parse-events.c                 |  2 ++
> >  tools/perf/util/parse-events.h                 |  4 ----
> >  tools/perf/util/parse-events.y                 | 12 ++++++++----
> >  4 files changed, 15 insertions(+), 8 deletions(-)
> >
> > diff --git a/tools/lib/perf/include/internal/parse-events.h b/tools/lib/perf/include/internal/parse-events.h
> > index 78dd3f989346..cbcf799f8969 100644
> > --- a/tools/lib/perf/include/internal/parse-events.h
> > +++ b/tools/lib/perf/include/internal/parse-events.h
> > @@ -102,6 +102,11 @@ struct parse_events_ops {
> >         int (*add_pmu_multi)(struct parse_events_state *parse_state,
> >                              char *str, struct list_head *head,
> >                              struct list_head **listp);
> > +
> > +       int (*add_numeric)(struct parse_events_state *parse_state,
> > +                          struct list_head *list,
> > +                          u32 type, u64 config,
> > +                          struct list_head *head_config);
> >  };
> >
> >  struct parse_events_state {
> > diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> > index c67634c9de0d..a05e1bdb4e60 100644
> > --- a/tools/perf/util/parse-events.c
> > +++ b/tools/perf/util/parse-events.c
> > @@ -1306,6 +1306,7 @@ int parse_events_add_tracepoint(struct parse_events_state *parse_state,
> >                                             err, head_config);
> >  }
> >
> > +static
> >  int parse_events_add_numeric(struct parse_events_state *parse_state,
> >                              struct list_head *list,
> >                              u32 type, u64 config,
> > @@ -2904,4 +2905,5 @@ static struct parse_events_ops parse_state_ops = {
> >         .perf_evsel__delete = perf_evsel__delete_helper,
> >         .add_pmu            = parse_events_add_pmu,
> >         .add_pmu_multi      = parse_events_multi_pmu_add,
> > +       .add_numeric        = parse_events_add_numeric,
> 
> Some documentation on the ops would be awesome :-) Especially as this
> is allowing configuration and it is not immediately clear what that
> could mean when changes happen.

so the ops are to help with perf specific code like 'evsel allocation
and one chicken and egg problem we have in event parsing

to move flex/bison code to libperf I need to move all functions called
from that code to libperf.. and some of those functions end up calling
parser again - the pmu_loopup for terms parsing, which is sharing
parser/flexer code with event parsing

having the ops allows us to keep this 'so far unmovable code' in perf
and move just the flexer/bison, which is the base for everything

I expect some of the callbacks will go away at the end, because the
code for them will be completely in libperf, so there would be no
need for special perf implementation

but yes, I'll put some docs on them

thanks,
jirka

> 
> Thanks,
> Ian
> 
> >  };
> > diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
> > index fa03f8f70f33..40d192cace03 100644
> > --- a/tools/perf/util/parse-events.h
> > +++ b/tools/perf/util/parse-events.h
> > @@ -79,10 +79,6 @@ int parse_events_load_bpf_obj(struct parse_events_state *parse_state,
> >                               struct list_head *list,
> >                               struct bpf_object *obj,
> >                               struct list_head *head_config);
> > -int parse_events_add_numeric(struct parse_events_state *parse_state,
> > -                            struct list_head *list,
> > -                            u32 type, u64 config,
> > -                            struct list_head *head_config);
> >  int parse_events_add_tool(struct parse_events_state *parse_state,
> >                           struct list_head *list,
> >                           int tool_event);
> > diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
> > index f903690b3c8a..b23691397374 100644
> > --- a/tools/perf/util/parse-events.y
> > +++ b/tools/perf/util/parse-events.y
> > @@ -436,6 +436,7 @@ PE_VALUE_SYM_SW
> >  event_legacy_symbol:
> >  value_sym '/' event_config '/'
> >  {
> > +       struct parse_events_state *parse_state = _parse_state;
> >         struct list_head *list;
> >         int type = $1 >> 16;
> >         int config = $1 & 255;
> > @@ -443,7 +444,7 @@ value_sym '/' event_config '/'
> >
> >         list = alloc_list();
> >         ABORT_ON(!list);
> > -       err = parse_events_add_numeric(_parse_state, list, type, config, $3);
> > +       err = parse_state->ops->add_numeric(parse_state, list, type, config, $3);
> >         parse_events_terms__delete($3);
> >         if (err) {
> >                 free_list_evsel(_parse_state, list);
> > @@ -454,13 +455,14 @@ value_sym '/' event_config '/'
> >  |
> >  value_sym sep_slash_slash_dc
> >  {
> > +       struct parse_events_state *parse_state = _parse_state;
> >         struct list_head *list;
> >         int type = $1 >> 16;
> >         int config = $1 & 255;
> >
> >         list = alloc_list();
> >         ABORT_ON(!list);
> > -       ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config, NULL));
> > +       ABORT_ON(parse_state->ops->add_numeric(parse_state, list, type, config, NULL));
> >         $$ = list;
> >  }
> >  |
> > @@ -646,12 +648,13 @@ PE_NAME ':' PE_NAME
> >  event_legacy_numeric:
> >  PE_VALUE ':' PE_VALUE opt_event_config
> >  {
> > +       struct parse_events_state *parse_state = _parse_state;
> >         struct list_head *list;
> >         int err;
> >
> >         list = alloc_list();
> >         ABORT_ON(!list);
> > -       err = parse_events_add_numeric(_parse_state, list, (u32)$1, $3, $4);
> > +       err = parse_state->ops->add_numeric(_parse_state, list, (u32)$1, $3, $4);
> >         parse_events_terms__delete($4);
> >         if (err) {
> >                 free(list);
> > @@ -663,12 +666,13 @@ PE_VALUE ':' PE_VALUE opt_event_config
> >  event_legacy_raw:
> >  PE_RAW opt_event_config
> >  {
> > +       struct parse_events_state *parse_state = _parse_state;
> >         struct list_head *list;
> >         int err;
> >
> >         list = alloc_list();
> >         ABORT_ON(!list);
> > -       err = parse_events_add_numeric(_parse_state, list, PERF_TYPE_RAW, $1, $2);
> > +       err = parse_state->ops->add_numeric(_parse_state, list, PERF_TYPE_RAW, $1, $2);
> >         parse_events_terms__delete($2);
> >         if (err) {
> >                 free(list);
> > --
> > 2.31.1
> >
> 


^ permalink raw reply	[flat|nested] 78+ messages in thread

* Re: [PATCH 59/59] libperf: Add parse-events test
  2021-11-08 18:32   ` Ian Rogers
@ 2021-11-08 21:37     ` Jiri Olsa
  0 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 21:37 UTC (permalink / raw)
  To: Ian Rogers; +Cc: Arnaldo Carvalho de Melo, Namhyung Kim, linux-perf-users

On Mon, Nov 08, 2021 at 10:32:57AM -0800, Ian Rogers wrote:
> On Mon, Nov 8, 2021 at 5:43 AM Jiri Olsa <jolsa@redhat.com> wrote:
> >
> > Adding parse-events test.
> 
> Fwiw, we fuzz test this code but filter out strings containing .bpf.,
> .o or .c to avoid the fuzzer turning into an LLVM fuzzer. This
> refactoring will solve some linking issues we have. Perhaps we can set
> up fuzz testing here?

sounds good, also this could change to the kunit style you do
for perf test.. and perhaps included in 'perf test' invocation

jirka

> 
> Thanks,
> Ian
> 
> > Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> > ---
> >  tools/lib/perf/tests/Build               |  1 +
> >  tools/lib/perf/tests/main.c              |  1 +
> >  tools/lib/perf/tests/test-evlist.c       |  2 ++
> >  tools/lib/perf/tests/test-parse-events.c | 41 ++++++++++++++++++++++++
> >  tools/lib/perf/tests/tests.h             |  1 +
> >  5 files changed, 46 insertions(+)
> >  create mode 100644 tools/lib/perf/tests/test-parse-events.c
> >
> > diff --git a/tools/lib/perf/tests/Build b/tools/lib/perf/tests/Build
> > index 56e81378d443..f1d1133d8dae 100644
> > --- a/tools/lib/perf/tests/Build
> > +++ b/tools/lib/perf/tests/Build
> > @@ -3,3 +3,4 @@ tests-y += test-evsel.o
> >  tests-y += test-evlist.o
> >  tests-y += test-cpumap.o
> >  tests-y += test-threadmap.o
> > +tests-y += test-parse-events.o
> > diff --git a/tools/lib/perf/tests/main.c b/tools/lib/perf/tests/main.c
> > index 56423fd4db19..bfa8ba05c422 100644
> > --- a/tools/lib/perf/tests/main.c
> > +++ b/tools/lib/perf/tests/main.c
> > @@ -7,6 +7,7 @@ int tests_verbose;
> >
> >  int main(int argc, char **argv)
> >  {
> > +       __T("test parse_events", !test_parse_events(argc, argv));
> >         __T("test cpumap", !test_cpumap(argc, argv));
> >         __T("test threadmap", !test_threadmap(argc, argv));
> >         __T("test evlist", !test_evlist(argc, argv));
> > diff --git a/tools/lib/perf/tests/test-evlist.c b/tools/lib/perf/tests/test-evlist.c
> > index ce91a582f0e4..199451a605a1 100644
> > --- a/tools/lib/perf/tests/test-evlist.c
> > +++ b/tools/lib/perf/tests/test-evlist.c
> > @@ -1,5 +1,7 @@
> >  // SPDX-License-Identifier: GPL-2.0
> > +#ifndef _GNU_SOURCE
> >  #define _GNU_SOURCE // needed for sched.h to get sched_[gs]etaffinity and CPU_(ZERO,SET)
> > +#endif
> >  #include <sched.h>
> >  #include <stdio.h>
> >  #include <stdarg.h>
> > diff --git a/tools/lib/perf/tests/test-parse-events.c b/tools/lib/perf/tests/test-parse-events.c
> > new file mode 100644
> > index 000000000000..5f913f82de7f
> > --- /dev/null
> > +++ b/tools/lib/perf/tests/test-parse-events.c
> > @@ -0,0 +1,41 @@
> > +#include <stdio.h>
> > +#include <linux/perf_event.h>
> > +#include <linux/hw_breakpoint.h>
> > +#include <perf/evlist.h>
> > +#include <perf/evsel.h>
> > +#include <internal/evlist.h>
> > +#include <internal/tests.h>
> > +#include "tests.h"
> > +
> > +static int libperf_print(enum libperf_print_level level,
> > +                        const char *fmt, va_list ap)
> > +{
> > +       return vfprintf(stderr, fmt, ap);
> > +}
> > +
> > +int test_parse_events(int argc, char **argv)
> > +{
> > +       struct perf_evlist *evlist;
> > +       struct perf_evsel *evsel;
> > +       int err;
> > +
> > +       __T_START;
> > +
> > +       libperf_init(libperf_print);
> > +
> > +       evlist = perf_evlist__new();
> > +       __T("failed to create evlist", evlist);
> > +
> > +       err = libperf_parse_events(evlist, "mem:0:rw");
> > +       __T("failed to parse events", !err);
> > +
> > +       evsel = perf_evlist__first(evlist);
> > +
> > +       __T("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
> > +       __T("wrong config", 0 == evsel->attr.config);
> > +       __T("wrong bp_type", (HW_BREAKPOINT_R|HW_BREAKPOINT_W) == evsel->attr.bp_type);
> > +       __T("wrong bp_len", HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
> > +
> > +       __T_END;
> > +       return tests_failed == 0 ? 0 : -1;
> > +}
> > diff --git a/tools/lib/perf/tests/tests.h b/tools/lib/perf/tests/tests.h
> > index 604838f21b2b..b4f27fc9c46d 100644
> > --- a/tools/lib/perf/tests/tests.h
> > +++ b/tools/lib/perf/tests/tests.h
> > @@ -6,5 +6,6 @@ int test_cpumap(int argc, char **argv);
> >  int test_threadmap(int argc, char **argv);
> >  int test_evlist(int argc, char **argv);
> >  int test_evsel(int argc, char **argv);
> > +int test_parse_events(int argc, char **argv);
> >
> >  #endif /* TESTS_H */
> > --
> > 2.31.1
> >
> 


^ permalink raw reply	[flat|nested] 78+ messages in thread

* Re: [RFC 00/59] libperf: Move in event parse code
  2021-11-08 18:50 ` [RFC 00/59] libperf: Move in event parse code Ian Rogers
@ 2021-11-08 21:50   ` Jiri Olsa
  0 siblings, 0 replies; 78+ messages in thread
From: Jiri Olsa @ 2021-11-08 21:50 UTC (permalink / raw)
  To: Ian Rogers
  Cc: Arnaldo Carvalho de Melo, John Garry, Jin Yao, Andi Kleen,
	Peter Zijlstra, Ingo Molnar, Mark Rutland, Alexander Shishkin,
	Michael Petlan, Stephane Eranian, Namhyung Kim, linux-perf-users

On Mon, Nov 08, 2021 at 10:50:01AM -0800, Ian Rogers wrote:
> On Mon, Nov 8, 2021 at 5:37 AM Jiri Olsa <jolsa@redhat.com> wrote:
> >
> > hi,
> > this *RFC* patchset moves event parser code to libperf.
> >
> > It keeps the current perf functionality intact (hopefully)
> > and adds new libperf_parse_events API to libperf that
> > provides events parsing.
> >
> > At the moment libperf_parse_events function supports only
> > breakpoint events, so it can be used to do things like:
> > (see the new libperf test)
> >
> >   evlist = perf_evlist__new();
> >   err = libperf_parse_events(evlist, "mem:0:rw");
> >
> >
> > The other pmus parsing code directly depends on parsing
> > code, so now when the parser is in the libperf, it will
> > be easier to add the rest of pmus support.
> >
> > I'm curious on any early feedback because it's big change.
> > My primary target is using this interface for bpftool prog
> > profile to allow using all the perf events there.
> >
> > Also available in here:
> >   git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
> >   libperf/parse
> >
> >
> > I'm Cc-ing most of the folks just on the cover email,
> > because it's a lot of changes and most people won't be
> > interested ;-)
> >
> > Please check the linux-perf-users mailing list or the git
> > branch above for all the changes.
> >
> > thanks,
> > jirka
> 
> It is a big change but I'm positive about it. Perhaps bpftool can use
> libpfm4 in the short-term ;-) There are lots of small cleanups and
> documentation improvements that can be done. Getting the main move
> done quickly will help avoid the merge conflicts. I foresee conflicts
> with my un-merged changes (reviews welcome :-) ):

I rebased this several times already and it's not actually that bad,
so I don't mind ;-)

but there's pmu-events move and perhaps others that could be done
separately if nobody objects the whole event parser move idea

> 
> new literals in metrics and a source_count function:
> https://lore.kernel.org/lkml/20211105170943.3479315-1-irogers@google.com/
> 
> kunit style cleanup:
> https://lore.kernel.org/lkml/20211104064208.3156807-1-irogers@google.com/

yep, it's on my radar

> 
> I would like to see pmu-events cleaned up. Some ideas here are:
> 
> 1) moving jevents to a python program to simplify its maintenance -
> 100s of lines of json parsing code would turn into a single import and
> we'd cease having an out dated for of jsmn

I think we have some tests for jevents, but we'd need more
if we wanted to do this imo

> 
> 2) the pmu_events_map holds both events and metrics. Moving pmu-events
> into libperf probably means something for the metrics code, should it
> move to libperf too?

yes when we want metrics parsing in libperf, pmu-events is base
for both event and metric parsing, metric code in perf should not
be affected by this move

> 
> 3) an issue with the existing pmu_events_map is that it is a struct
> with lots of pointers. Most of the pointers are to .rodata strings.
> With PIE the strings can end up anywhere in memory and so relocations
> are needed for what is about 1.5MB worth of data. It'd be nice if perf
> wasn't relocating all of that every time it starts. A solution would
> be to turn all the events into a giant string (with deduplication,
> etc.) and then to do something like leb128 encode offsets into the
> string (many offsets are 0 and leb128 would encode that as a single
> byte). As the string offsets, or leb128 encoded offsets, are constant
> then they can go in .rodata and don't require relocating. We should be
> able to shave something like 1MB off the binary size while improving
> startup performance. Adding the logic to jevents.c would be more yucky
> than in python imo.

nice catch! I'm ok with python, but I wouldn't mind even the jevens solution ;-)

thanks,
jirka

> 
> Thanks,
> Ian
> 
> > Cc: John Garry <john.garry@huawei.com>
> > Cc: Jin Yao <yao.jin@linux.intel.com>
> > Cc: Andi Kleen <ak@linux.intel.com>
> > Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> > Cc: Ingo Molnar <mingo@kernel.org>
> > Cc: Mark Rutland <mark.rutland@arm.com>
> > Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> > Cc: Michael Petlan <mpetlan@redhat.com>
> > Cc: Stephane Eranian <eranian@google.com>
> > ---
> > Jiri Olsa (59):
> >       libperf: Move pmu-events.h file to libperf
> >       libperf: Move pmu-events framework to libperf
> >       libperf: Move pmu-events build to libperf
> >       libperf: Move perf_pmu__format_parse to libperf
> >       tools api fs: Move in the fncache from perf
> >       libperf: Move in the pmu hybrid support
> >       libperf: Move name to perf_evsel
> >       libperf: Move auto_merge_stats to perf_evsel
> >       libperf: Move config_terms to perf_evsel
> >       libperf: Move metric_id to perf_evsel
> >       libperf: Move tool_event to perf_evsel
> >       libperf: Move unit to perf_evsel
> >       libperf: Move exclude_GH to perf_evsel
> >       libperf: Move sample_read to perf_evsel
> >       libperf: Move precise_max to perf_evsel
> >       libperf: Move weak_group to perf_evsel
> >       libperf: Move bpf_counter to perf_evsel
> >       libperf: Move group_name to perf_evsel
> >       perf tools: Fix parse_events_term__num call
> >       perf tools: Pass parse_state all the way down to __add_event
> >       perf tools: Pass parse_state all the way down to add_tracepoint
> >       perf tools: Add evsel__new callback to parse_state_ops
> >       perf tools: Add evsel__new_tp callback to parse_state_ops
> >       perf tools: Add loc_term and loc_val helpers to parse_events_term__str
> >       perf tools: Add loc_term and loc_val helpers to parse_events_term__num
> >       libperf: Move in the event_symbols_hw/event_symbols_sw
> >       libperf: Move in struct parse_events_term code
> >       perf tools: Add perf_evsel__add_event function
> >       perf tools: Change struct parse_events_state::evlist to perf_evlist
> >       libperf: Move in struct parse_events_state
> >       perf tools: Move event_attr_init in evsel__new_idx function
> >       libperf: Move in perf_pmu__warn_invalid_config function
> >       libperf: Move in perf_evsel__add_event function
> >       perf tools: Move parse_events_update_lists to parser unit
> >       libperf: Add perf_evsel__is_group_leader function
> >       perf tools: Make parse_events__modifier_event work over perf_evsel
> >       perf tool: Pass perf_guest in struct parse_events_state
> >       libperf: Move in parse_events__modifier_group/event functions
> >       libperf: Move in parse_events__handle_error function
> >       libperf: Move in parse_events_evlist_error function
> >       perf tools: Add perf_evsel__delete callback to struct parse_events_ops
> >       libperf: Move in parse_events_name function
> >       perf tools: Move out parse_events_add_pmu fallback from parser code
> >       perf tools: Add add_pmu callback to struct parse_events_ops
> >       perf tools: Add add_pmu_multi callback to struct parse_events_ops
> >       perf tools: Add add_numeric callback to struct parse_events_ops
> >       perf tools: Add add_cache callback to struct parse_events_ops
> >       perf tools: Add add_breakpoint callback to struct parse_events_ops
> >       perf tools: Add add_tracepoint callback to struct parse_events_ops
> >       perf tools: Add add_bpf callback to struct parse_events_ops
> >       perf tools: Add add_tool callback to struct parse_events_ops
> >       perf tools: Add set_leader callback to struct parse_events_ops
> >       perf tools: Add parse_check callback to struct parse_events_ops
> >       perf tools: Move PE_* enums in parse_events__scanner
> >       libperf: Move in parse-events flex/bison parser
> >       libperf: Move in parse_events_add_breakpoint function
> >       libperf: Move in some lib objects from perf
> >       libperf: Add libperf_parse_events function
> >       libperf: Add parse-events test
> >
> >  tools/lib/api/fs/Build                             |   1 +
> >  tools/{perf/util => lib/api/fs}/fncache.c          |   4 +-
> >  tools/lib/api/fs/fs.h                              |   2 +
> >  tools/lib/perf/Build                               |  79 ++
> >  tools/lib/perf/Makefile                            |  40 +-
> >  tools/lib/perf/include/internal/evsel.h            |  30 +
> >  tools/lib/perf/include/internal/parse-events.h     | 203 +++++
> >  .../perf/include/internal}/pmu-hybrid.h            |   2 +-
> >  tools/lib/perf/include/internal/pmu.h              |  59 ++
> >  tools/lib/perf/include/perf/evlist.h               |   2 +
> >  .../perf/include/perf}/pmu-events.h                |   0
> >  tools/lib/perf/libperf.map                         |   1 +
> >  tools/lib/perf/parse-events.c                      | 875 +++++++++++++++++++
> >  tools/{perf/util => lib/perf}/parse-events.l       |  16 +-
> >  tools/{perf/util => lib/perf}/parse-events.y       | 197 +++--
> >  tools/{ => lib}/perf/pmu-events/Build              |   2 +-
> >  tools/{ => lib}/perf/pmu-events/README             |   0
> >  .../pmu-events/arch/arm64/ampere/emag/branch.json  |   0
> >  .../pmu-events/arch/arm64/ampere/emag/bus.json     |   0
> >  .../pmu-events/arch/arm64/ampere/emag/cache.json   |   0
> >  .../pmu-events/arch/arm64/ampere/emag/clock.json   |   0
> >  .../arch/arm64/ampere/emag/exception.json          |   0
> >  .../arch/arm64/ampere/emag/instruction.json        |   0
> >  .../arch/arm64/ampere/emag/intrinsic.json          |   0
> >  .../pmu-events/arch/arm64/ampere/emag/memory.json  |   0
> >  .../arch/arm64/ampere/emag/pipeline.json           |   0
> >  .../arch/arm64/arm/cortex-a53/branch.json          |   0
> >  .../pmu-events/arch/arm64/arm/cortex-a53/bus.json  |   0
> >  .../arch/arm64/arm/cortex-a53/cache.json           |   0
> >  .../arch/arm64/arm/cortex-a53/memory.json          |   0
> >  .../arch/arm64/arm/cortex-a53/other.json           |   0
> >  .../arch/arm64/arm/cortex-a53/pipeline.json        |   0
> >  .../arm64/arm/cortex-a57-a72/core-imp-def.json     |   0
> >  .../arch/arm64/arm/cortex-a76-n1/branch.json       |   0
> >  .../arch/arm64/arm/cortex-a76-n1/bus.json          |   0
> >  .../arch/arm64/arm/cortex-a76-n1/cache.json        |   0
> >  .../arch/arm64/arm/cortex-a76-n1/exception.json    |   0
> >  .../arch/arm64/arm/cortex-a76-n1/instruction.json  |   0
> >  .../arch/arm64/arm/cortex-a76-n1/memory.json       |   0
> >  .../arch/arm64/arm/cortex-a76-n1/other.json        |   0
> >  .../arch/arm64/arm/cortex-a76-n1/pipeline.json     |   0
> >  .../arch/arm64/arm/neoverse-v1/branch.json         |   0
> >  .../pmu-events/arch/arm64/arm/neoverse-v1/bus.json |   0
> >  .../arch/arm64/arm/neoverse-v1/cache.json          |   0
> >  .../arch/arm64/arm/neoverse-v1/exception.json      |   0
> >  .../arch/arm64/arm/neoverse-v1/instruction.json    |   0
> >  .../arch/arm64/arm/neoverse-v1/memory.json         |   0
> >  .../arch/arm64/arm/neoverse-v1/other.json          |   0
> >  .../arch/arm64/arm/neoverse-v1/pipeline.json       |   0
> >  .../arch/arm64/armv8-common-and-microarch.json     |   0
> >  .../pmu-events/arch/arm64/armv8-recommended.json   |   0
> >  .../arch/arm64/cavium/thunderx2/core-imp-def.json  |   0
> >  .../arch/arm64/freescale/imx8mm/sys/ddrc.json      |   0
> >  .../arch/arm64/freescale/imx8mm/sys/metrics.json   |   0
> >  .../arch/arm64/freescale/imx8mn/sys/ddrc.json      |   0
> >  .../arch/arm64/freescale/imx8mn/sys/metrics.json   |   0
> >  .../arch/arm64/freescale/imx8mp/sys/ddrc.json      |   0
> >  .../arch/arm64/freescale/imx8mp/sys/metrics.json   |   0
> >  .../arch/arm64/freescale/imx8mq/sys/ddrc.json      |   0
> >  .../arch/arm64/freescale/imx8mq/sys/metrics.json   |   0
> >  .../arch/arm64/fujitsu/a64fx/branch.json           |   0
> >  .../pmu-events/arch/arm64/fujitsu/a64fx/bus.json   |   0
> >  .../pmu-events/arch/arm64/fujitsu/a64fx/cache.json |   0
> >  .../pmu-events/arch/arm64/fujitsu/a64fx/cycle.json |   0
> >  .../arch/arm64/fujitsu/a64fx/exception.json        |   0
> >  .../arch/arm64/fujitsu/a64fx/instruction.json      |   0
> >  .../arch/arm64/fujitsu/a64fx/memory.json           |   0
> >  .../pmu-events/arch/arm64/fujitsu/a64fx/other.json |   0
> >  .../arch/arm64/fujitsu/a64fx/pipeline.json         |   0
> >  .../pmu-events/arch/arm64/fujitsu/a64fx/sve.json   |   0
> >  .../arch/arm64/hisilicon/hip08/core-imp-def.json   |   0
> >  .../arch/arm64/hisilicon/hip08/metrics.json        |   0
> >  .../arch/arm64/hisilicon/hip08/uncore-ddrc.json    |   0
> >  .../arch/arm64/hisilicon/hip08/uncore-hha.json     |   0
> >  .../arch/arm64/hisilicon/hip08/uncore-l3c.json     |   0
> >  .../perf/pmu-events/arch/arm64/mapfile.csv         |   0
> >  .../perf/pmu-events/arch/nds32/mapfile.csv         |   0
> >  .../perf/pmu-events/arch/nds32/n13/atcpmu.json     |   0
> >  .../perf/pmu-events/arch/powerpc/mapfile.csv       |   0
> >  .../pmu-events/arch/powerpc/power10/cache.json     |   0
> >  .../arch/powerpc/power10/floating_point.json       |   0
> >  .../pmu-events/arch/powerpc/power10/frontend.json  |   0
> >  .../pmu-events/arch/powerpc/power10/locks.json     |   0
> >  .../pmu-events/arch/powerpc/power10/marked.json    |   0
> >  .../pmu-events/arch/powerpc/power10/memory.json    |   0
> >  .../arch/powerpc/power10/nest_metrics.json         |   0
> >  .../pmu-events/arch/powerpc/power10/others.json    |   0
> >  .../pmu-events/arch/powerpc/power10/pipeline.json  |   0
> >  .../perf/pmu-events/arch/powerpc/power10/pmc.json  |   0
> >  .../arch/powerpc/power10/translation.json          |   0
> >  .../perf/pmu-events/arch/powerpc/power8/cache.json |   0
> >  .../arch/powerpc/power8/floating-point.json        |   0
> >  .../pmu-events/arch/powerpc/power8/frontend.json   |   0
> >  .../pmu-events/arch/powerpc/power8/marked.json     |   0
> >  .../pmu-events/arch/powerpc/power8/memory.json     |   0
> >  .../pmu-events/arch/powerpc/power8/metrics.json    |   0
> >  .../perf/pmu-events/arch/powerpc/power8/other.json |   0
> >  .../pmu-events/arch/powerpc/power8/pipeline.json   |   0
> >  .../perf/pmu-events/arch/powerpc/power8/pmc.json   |   0
> >  .../arch/powerpc/power8/translation.json           |   0
> >  .../perf/pmu-events/arch/powerpc/power9/cache.json |   0
> >  .../arch/powerpc/power9/floating-point.json        |   0
> >  .../pmu-events/arch/powerpc/power9/frontend.json   |   0
> >  .../pmu-events/arch/powerpc/power9/marked.json     |   0
> >  .../pmu-events/arch/powerpc/power9/memory.json     |   0
> >  .../pmu-events/arch/powerpc/power9/metrics.json    |   0
> >  .../arch/powerpc/power9/nest_metrics.json          |   0
> >  .../perf/pmu-events/arch/powerpc/power9/other.json |   0
> >  .../pmu-events/arch/powerpc/power9/pipeline.json   |   0
> >  .../perf/pmu-events/arch/powerpc/power9/pmc.json   |   0
> >  .../arch/powerpc/power9/translation.json           |   0
> >  .../perf/pmu-events/arch/s390/cf_z10/basic.json    |   0
> >  .../perf/pmu-events/arch/s390/cf_z10/crypto.json   |   0
> >  .../perf/pmu-events/arch/s390/cf_z10/extended.json |   0
> >  .../perf/pmu-events/arch/s390/cf_z13/basic.json    |   0
> >  .../perf/pmu-events/arch/s390/cf_z13/crypto.json   |   0
> >  .../perf/pmu-events/arch/s390/cf_z13/extended.json |   0
> >  .../pmu-events/arch/s390/cf_z13/transaction.json   |   0
> >  .../perf/pmu-events/arch/s390/cf_z14/basic.json    |   0
> >  .../perf/pmu-events/arch/s390/cf_z14/crypto.json   |   0
> >  .../perf/pmu-events/arch/s390/cf_z14/extended.json |   0
> >  .../pmu-events/arch/s390/cf_z14/transaction.json   |   0
> >  .../perf/pmu-events/arch/s390/cf_z15/basic.json    |   0
> >  .../perf/pmu-events/arch/s390/cf_z15/crypto.json   |   0
> >  .../perf/pmu-events/arch/s390/cf_z15/crypto6.json  |   0
> >  .../perf/pmu-events/arch/s390/cf_z15/extended.json |   0
> >  .../pmu-events/arch/s390/cf_z15/transaction.json   |   0
> >  .../perf/pmu-events/arch/s390/cf_z196/basic.json   |   0
> >  .../perf/pmu-events/arch/s390/cf_z196/crypto.json  |   0
> >  .../pmu-events/arch/s390/cf_z196/extended.json     |   0
> >  .../perf/pmu-events/arch/s390/cf_zec12/basic.json  |   0
> >  .../perf/pmu-events/arch/s390/cf_zec12/crypto.json |   0
> >  .../pmu-events/arch/s390/cf_zec12/extended.json    |   0
> >  .../pmu-events/arch/s390/cf_zec12/transaction.json |   0
> >  .../perf/pmu-events/arch/s390/mapfile.csv          |   0
> >  .../perf/pmu-events/arch/test/arch-std-events.json |   0
> >  .../pmu-events/arch/test/test_soc/cpu/branch.json  |   0
> >  .../pmu-events/arch/test/test_soc/cpu/cache.json   |   0
> >  .../pmu-events/arch/test/test_soc/cpu/other.json   |   0
> >  .../pmu-events/arch/test/test_soc/cpu/uncore.json  |   0
> >  .../pmu-events/arch/test/test_soc/sys/uncore.json  |   0
> >  .../perf/pmu-events/arch/x86/amdzen1/branch.json   |   0
> >  .../perf/pmu-events/arch/x86/amdzen1/cache.json    |   0
> >  .../perf/pmu-events/arch/x86/amdzen1/core.json     |   0
> >  .../pmu-events/arch/x86/amdzen1/data-fabric.json   |   0
> >  .../arch/x86/amdzen1/floating-point.json           |   0
> >  .../perf/pmu-events/arch/x86/amdzen1/memory.json   |   0
> >  .../perf/pmu-events/arch/x86/amdzen1/other.json    |   0
> >  .../pmu-events/arch/x86/amdzen1/recommended.json   |   0
> >  .../perf/pmu-events/arch/x86/amdzen2/branch.json   |   0
> >  .../perf/pmu-events/arch/x86/amdzen2/cache.json    |   0
> >  .../perf/pmu-events/arch/x86/amdzen2/core.json     |   0
> >  .../pmu-events/arch/x86/amdzen2/data-fabric.json   |   0
> >  .../arch/x86/amdzen2/floating-point.json           |   0
> >  .../perf/pmu-events/arch/x86/amdzen2/memory.json   |   0
> >  .../perf/pmu-events/arch/x86/amdzen2/other.json    |   0
> >  .../pmu-events/arch/x86/amdzen2/recommended.json   |   0
> >  .../perf/pmu-events/arch/x86/amdzen3/branch.json   |   0
> >  .../perf/pmu-events/arch/x86/amdzen3/cache.json    |   0
> >  .../perf/pmu-events/arch/x86/amdzen3/core.json     |   0
> >  .../pmu-events/arch/x86/amdzen3/data-fabric.json   |   0
> >  .../arch/x86/amdzen3/floating-point.json           |   0
> >  .../perf/pmu-events/arch/x86/amdzen3/memory.json   |   0
> >  .../perf/pmu-events/arch/x86/amdzen3/other.json    |   0
> >  .../pmu-events/arch/x86/amdzen3/recommended.json   |   0
> >  .../perf/pmu-events/arch/x86/bonnell/cache.json    |   0
> >  .../arch/x86/bonnell/floating-point.json           |   0
> >  .../perf/pmu-events/arch/x86/bonnell/frontend.json |   0
> >  .../perf/pmu-events/arch/x86/bonnell/memory.json   |   0
> >  .../perf/pmu-events/arch/x86/bonnell/other.json    |   0
> >  .../perf/pmu-events/arch/x86/bonnell/pipeline.json |   0
> >  .../arch/x86/bonnell/virtual-memory.json           |   0
> >  .../pmu-events/arch/x86/broadwell/bdw-metrics.json |   0
> >  .../perf/pmu-events/arch/x86/broadwell/cache.json  |   0
> >  .../arch/x86/broadwell/floating-point.json         |   0
> >  .../pmu-events/arch/x86/broadwell/frontend.json    |   0
> >  .../perf/pmu-events/arch/x86/broadwell/memory.json |   0
> >  .../perf/pmu-events/arch/x86/broadwell/other.json  |   0
> >  .../pmu-events/arch/x86/broadwell/pipeline.json    |   0
> >  .../perf/pmu-events/arch/x86/broadwell/uncore.json |   0
> >  .../arch/x86/broadwell/virtual-memory.json         |   0
> >  .../arch/x86/broadwellde/bdwde-metrics.json        |   0
> >  .../pmu-events/arch/x86/broadwellde/cache.json     |   0
> >  .../arch/x86/broadwellde/floating-point.json       |   0
> >  .../pmu-events/arch/x86/broadwellde/frontend.json  |   0
> >  .../pmu-events/arch/x86/broadwellde/memory.json    |   0
> >  .../pmu-events/arch/x86/broadwellde/other.json     |   0
> >  .../pmu-events/arch/x86/broadwellde/pipeline.json  |   0
> >  .../arch/x86/broadwellde/uncore-cache.json         |   0
> >  .../arch/x86/broadwellde/uncore-memory.json        |   0
> >  .../arch/x86/broadwellde/uncore-power.json         |   0
> >  .../arch/x86/broadwellde/virtual-memory.json       |   0
> >  .../arch/x86/broadwellx/bdx-metrics.json           |   0
> >  .../perf/pmu-events/arch/x86/broadwellx/cache.json |   0
> >  .../arch/x86/broadwellx/floating-point.json        |   0
> >  .../pmu-events/arch/x86/broadwellx/frontend.json   |   0
> >  .../pmu-events/arch/x86/broadwellx/memory.json     |   0
> >  .../perf/pmu-events/arch/x86/broadwellx/other.json |   0
> >  .../pmu-events/arch/x86/broadwellx/pipeline.json   |   0
> >  .../arch/x86/broadwellx/uncore-cache.json          |   0
> >  .../arch/x86/broadwellx/uncore-interconnect.json   |   0
> >  .../arch/x86/broadwellx/uncore-memory.json         |   0
> >  .../arch/x86/broadwellx/uncore-power.json          |   0
> >  .../arch/x86/broadwellx/virtual-memory.json        |   0
> >  .../pmu-events/arch/x86/cascadelakex/cache.json    |   0
> >  .../arch/x86/cascadelakex/clx-metrics.json         |   0
> >  .../arch/x86/cascadelakex/floating-point.json      |   0
> >  .../pmu-events/arch/x86/cascadelakex/frontend.json |   0
> >  .../pmu-events/arch/x86/cascadelakex/memory.json   |   0
> >  .../pmu-events/arch/x86/cascadelakex/other.json    |   0
> >  .../pmu-events/arch/x86/cascadelakex/pipeline.json |   0
> >  .../arch/x86/cascadelakex/uncore-memory.json       |   0
> >  .../arch/x86/cascadelakex/uncore-other.json        |   0
> >  .../arch/x86/cascadelakex/virtual-memory.json      |   0
> >  .../pmu-events/arch/x86/elkhartlake/cache.json     |   0
> >  .../arch/x86/elkhartlake/ehl-metrics.json          |   0
> >  .../arch/x86/elkhartlake/floating-point.json       |   0
> >  .../pmu-events/arch/x86/elkhartlake/frontend.json  |   0
> >  .../pmu-events/arch/x86/elkhartlake/memory.json    |   0
> >  .../pmu-events/arch/x86/elkhartlake/other.json     |   0
> >  .../pmu-events/arch/x86/elkhartlake/pipeline.json  |   0
> >  .../arch/x86/elkhartlake/virtual-memory.json       |   0
> >  .../perf/pmu-events/arch/x86/goldmont/cache.json   |   0
> >  .../pmu-events/arch/x86/goldmont/frontend.json     |   0
> >  .../perf/pmu-events/arch/x86/goldmont/memory.json  |   0
> >  .../perf/pmu-events/arch/x86/goldmont/other.json   |   0
> >  .../pmu-events/arch/x86/goldmont/pipeline.json     |   0
> >  .../arch/x86/goldmont/virtual-memory.json          |   0
> >  .../pmu-events/arch/x86/goldmontplus/cache.json    |   0
> >  .../pmu-events/arch/x86/goldmontplus/frontend.json |   0
> >  .../pmu-events/arch/x86/goldmontplus/memory.json   |   0
> >  .../pmu-events/arch/x86/goldmontplus/other.json    |   0
> >  .../pmu-events/arch/x86/goldmontplus/pipeline.json |   0
> >  .../arch/x86/goldmontplus/virtual-memory.json      |   0
> >  .../perf/pmu-events/arch/x86/haswell/cache.json    |   0
> >  .../arch/x86/haswell/floating-point.json           |   0
> >  .../perf/pmu-events/arch/x86/haswell/frontend.json |   0
> >  .../pmu-events/arch/x86/haswell/hsw-metrics.json   |   0
> >  .../perf/pmu-events/arch/x86/haswell/memory.json   |   0
> >  .../perf/pmu-events/arch/x86/haswell/other.json    |   0
> >  .../perf/pmu-events/arch/x86/haswell/pipeline.json |   0
> >  .../perf/pmu-events/arch/x86/haswell/uncore.json   |   0
> >  .../arch/x86/haswell/virtual-memory.json           |   0
> >  .../perf/pmu-events/arch/x86/haswellx/cache.json   |   0
> >  .../arch/x86/haswellx/floating-point.json          |   0
> >  .../pmu-events/arch/x86/haswellx/frontend.json     |   0
> >  .../pmu-events/arch/x86/haswellx/hsx-metrics.json  |   0
> >  .../perf/pmu-events/arch/x86/haswellx/memory.json  |   0
> >  .../perf/pmu-events/arch/x86/haswellx/other.json   |   0
> >  .../pmu-events/arch/x86/haswellx/pipeline.json     |   0
> >  .../pmu-events/arch/x86/haswellx/uncore-cache.json |   0
> >  .../arch/x86/haswellx/uncore-interconnect.json     |   0
> >  .../arch/x86/haswellx/uncore-memory.json           |   0
> >  .../pmu-events/arch/x86/haswellx/uncore-power.json |   0
> >  .../arch/x86/haswellx/virtual-memory.json          |   0
> >  .../perf/pmu-events/arch/x86/icelake/cache.json    |   0
> >  .../arch/x86/icelake/floating-point.json           |   0
> >  .../perf/pmu-events/arch/x86/icelake/frontend.json |   0
> >  .../pmu-events/arch/x86/icelake/icl-metrics.json   |   0
> >  .../perf/pmu-events/arch/x86/icelake/memory.json   |   0
> >  .../perf/pmu-events/arch/x86/icelake/other.json    |   0
> >  .../perf/pmu-events/arch/x86/icelake/pipeline.json |   0
> >  .../arch/x86/icelake/virtual-memory.json           |   0
> >  .../perf/pmu-events/arch/x86/icelakex/cache.json   |   0
> >  .../arch/x86/icelakex/floating-point.json          |   0
> >  .../pmu-events/arch/x86/icelakex/frontend.json     |   0
> >  .../pmu-events/arch/x86/icelakex/icx-metrics.json  |   0
> >  .../perf/pmu-events/arch/x86/icelakex/memory.json  |   0
> >  .../perf/pmu-events/arch/x86/icelakex/other.json   |   0
> >  .../pmu-events/arch/x86/icelakex/pipeline.json     |   0
> >  .../arch/x86/icelakex/uncore-memory.json           |   0
> >  .../pmu-events/arch/x86/icelakex/uncore-other.json |   0
> >  .../pmu-events/arch/x86/icelakex/uncore-power.json |   0
> >  .../arch/x86/icelakex/virtual-memory.json          |   0
> >  .../perf/pmu-events/arch/x86/ivybridge/cache.json  |   0
> >  .../arch/x86/ivybridge/floating-point.json         |   0
> >  .../pmu-events/arch/x86/ivybridge/frontend.json    |   0
> >  .../pmu-events/arch/x86/ivybridge/ivb-metrics.json |   0
> >  .../perf/pmu-events/arch/x86/ivybridge/memory.json |   0
> >  .../perf/pmu-events/arch/x86/ivybridge/other.json  |   0
> >  .../pmu-events/arch/x86/ivybridge/pipeline.json    |   0
> >  .../perf/pmu-events/arch/x86/ivybridge/uncore.json |   0
> >  .../arch/x86/ivybridge/virtual-memory.json         |   0
> >  .../perf/pmu-events/arch/x86/ivytown/cache.json    |   0
> >  .../arch/x86/ivytown/floating-point.json           |   0
> >  .../perf/pmu-events/arch/x86/ivytown/frontend.json |   0
> >  .../pmu-events/arch/x86/ivytown/ivt-metrics.json   |   0
> >  .../perf/pmu-events/arch/x86/ivytown/memory.json   |   0
> >  .../perf/pmu-events/arch/x86/ivytown/other.json    |   0
> >  .../perf/pmu-events/arch/x86/ivytown/pipeline.json |   0
> >  .../pmu-events/arch/x86/ivytown/uncore-cache.json  |   0
> >  .../arch/x86/ivytown/uncore-interconnect.json      |   0
> >  .../pmu-events/arch/x86/ivytown/uncore-memory.json |   0
> >  .../pmu-events/arch/x86/ivytown/uncore-power.json  |   0
> >  .../arch/x86/ivytown/virtual-memory.json           |   0
> >  .../perf/pmu-events/arch/x86/jaketown/cache.json   |   0
> >  .../arch/x86/jaketown/floating-point.json          |   0
> >  .../pmu-events/arch/x86/jaketown/frontend.json     |   0
> >  .../pmu-events/arch/x86/jaketown/jkt-metrics.json  |   0
> >  .../perf/pmu-events/arch/x86/jaketown/memory.json  |   0
> >  .../perf/pmu-events/arch/x86/jaketown/other.json   |   0
> >  .../pmu-events/arch/x86/jaketown/pipeline.json     |   0
> >  .../pmu-events/arch/x86/jaketown/uncore-cache.json |   0
> >  .../arch/x86/jaketown/uncore-interconnect.json     |   0
> >  .../arch/x86/jaketown/uncore-memory.json           |   0
> >  .../pmu-events/arch/x86/jaketown/uncore-power.json |   0
> >  .../arch/x86/jaketown/virtual-memory.json          |   0
> >  .../pmu-events/arch/x86/knightslanding/cache.json  |   0
> >  .../arch/x86/knightslanding/frontend.json          |   0
> >  .../pmu-events/arch/x86/knightslanding/memory.json |   0
> >  .../arch/x86/knightslanding/pipeline.json          |   0
> >  .../arch/x86/knightslanding/uncore-memory.json     |   0
> >  .../arch/x86/knightslanding/virtual-memory.json    |   0
> >  .../{ => lib}/perf/pmu-events/arch/x86/mapfile.csv |   0
> >  .../perf/pmu-events/arch/x86/nehalemep/cache.json  |   0
> >  .../arch/x86/nehalemep/floating-point.json         |   0
> >  .../pmu-events/arch/x86/nehalemep/frontend.json    |   0
> >  .../perf/pmu-events/arch/x86/nehalemep/memory.json |   0
> >  .../perf/pmu-events/arch/x86/nehalemep/other.json  |   0
> >  .../pmu-events/arch/x86/nehalemep/pipeline.json    |   0
> >  .../arch/x86/nehalemep/virtual-memory.json         |   0
> >  .../perf/pmu-events/arch/x86/nehalemex/cache.json  |   0
> >  .../arch/x86/nehalemex/floating-point.json         |   0
> >  .../pmu-events/arch/x86/nehalemex/frontend.json    |   0
> >  .../perf/pmu-events/arch/x86/nehalemex/memory.json |   0
> >  .../perf/pmu-events/arch/x86/nehalemex/other.json  |   0
> >  .../pmu-events/arch/x86/nehalemex/pipeline.json    |   0
> >  .../arch/x86/nehalemex/virtual-memory.json         |   0
> >  .../pmu-events/arch/x86/sandybridge/cache.json     |   0
> >  .../arch/x86/sandybridge/floating-point.json       |   0
> >  .../pmu-events/arch/x86/sandybridge/frontend.json  |   0
> >  .../pmu-events/arch/x86/sandybridge/memory.json    |   0
> >  .../pmu-events/arch/x86/sandybridge/other.json     |   0
> >  .../pmu-events/arch/x86/sandybridge/pipeline.json  |   0
> >  .../arch/x86/sandybridge/snb-metrics.json          |   0
> >  .../pmu-events/arch/x86/sandybridge/uncore.json    |   0
> >  .../arch/x86/sandybridge/virtual-memory.json       |   0
> >  .../perf/pmu-events/arch/x86/silvermont/cache.json |   0
> >  .../pmu-events/arch/x86/silvermont/frontend.json   |   0
> >  .../pmu-events/arch/x86/silvermont/memory.json     |   0
> >  .../perf/pmu-events/arch/x86/silvermont/other.json |   0
> >  .../pmu-events/arch/x86/silvermont/pipeline.json   |   0
> >  .../arch/x86/silvermont/virtual-memory.json        |   0
> >  .../perf/pmu-events/arch/x86/skylake/cache.json    |   0
> >  .../arch/x86/skylake/floating-point.json           |   0
> >  .../perf/pmu-events/arch/x86/skylake/frontend.json |   0
> >  .../perf/pmu-events/arch/x86/skylake/memory.json   |   0
> >  .../perf/pmu-events/arch/x86/skylake/other.json    |   0
> >  .../perf/pmu-events/arch/x86/skylake/pipeline.json |   0
> >  .../pmu-events/arch/x86/skylake/skl-metrics.json   |   0
> >  .../perf/pmu-events/arch/x86/skylake/uncore.json   |   0
> >  .../arch/x86/skylake/virtual-memory.json           |   0
> >  .../perf/pmu-events/arch/x86/skylakex/cache.json   |   0
> >  .../arch/x86/skylakex/floating-point.json          |   0
> >  .../pmu-events/arch/x86/skylakex/frontend.json     |   0
> >  .../perf/pmu-events/arch/x86/skylakex/memory.json  |   0
> >  .../perf/pmu-events/arch/x86/skylakex/other.json   |   0
> >  .../pmu-events/arch/x86/skylakex/pipeline.json     |   0
> >  .../pmu-events/arch/x86/skylakex/skx-metrics.json  |   0
> >  .../arch/x86/skylakex/uncore-memory.json           |   0
> >  .../pmu-events/arch/x86/skylakex/uncore-other.json |   0
> >  .../arch/x86/skylakex/virtual-memory.json          |   0
> >  .../perf/pmu-events/arch/x86/tigerlake/cache.json  |   0
> >  .../arch/x86/tigerlake/floating-point.json         |   0
> >  .../pmu-events/arch/x86/tigerlake/frontend.json    |   0
> >  .../perf/pmu-events/arch/x86/tigerlake/memory.json |   0
> >  .../perf/pmu-events/arch/x86/tigerlake/other.json  |   0
> >  .../pmu-events/arch/x86/tigerlake/pipeline.json    |   0
> >  .../pmu-events/arch/x86/tigerlake/tgl-metrics.json |   0
> >  .../arch/x86/tigerlake/virtual-memory.json         |   0
> >  .../perf/pmu-events/arch/x86/tremontx/cache.json   |   0
> >  .../pmu-events/arch/x86/tremontx/frontend.json     |   0
> >  .../perf/pmu-events/arch/x86/tremontx/memory.json  |   0
> >  .../perf/pmu-events/arch/x86/tremontx/other.json   |   0
> >  .../pmu-events/arch/x86/tremontx/pipeline.json     |   0
> >  .../arch/x86/tremontx/uncore-memory.json           |   0
> >  .../pmu-events/arch/x86/tremontx/uncore-other.json |   0
> >  .../pmu-events/arch/x86/tremontx/uncore-power.json |   0
> >  .../arch/x86/tremontx/virtual-memory.json          |   0
> >  .../pmu-events/arch/x86/westmereep-dp/cache.json   |   0
> >  .../arch/x86/westmereep-dp/floating-point.json     |   0
> >  .../arch/x86/westmereep-dp/frontend.json           |   0
> >  .../pmu-events/arch/x86/westmereep-dp/memory.json  |   0
> >  .../pmu-events/arch/x86/westmereep-dp/other.json   |   0
> >  .../arch/x86/westmereep-dp/pipeline.json           |   0
> >  .../arch/x86/westmereep-dp/virtual-memory.json     |   0
> >  .../pmu-events/arch/x86/westmereep-sp/cache.json   |   0
> >  .../arch/x86/westmereep-sp/floating-point.json     |   0
> >  .../arch/x86/westmereep-sp/frontend.json           |   0
> >  .../pmu-events/arch/x86/westmereep-sp/memory.json  |   0
> >  .../pmu-events/arch/x86/westmereep-sp/other.json   |   0
> >  .../arch/x86/westmereep-sp/pipeline.json           |   0
> >  .../arch/x86/westmereep-sp/virtual-memory.json     |   0
> >  .../perf/pmu-events/arch/x86/westmereex/cache.json |   0
> >  .../arch/x86/westmereex/floating-point.json        |   0
> >  .../pmu-events/arch/x86/westmereex/frontend.json   |   0
> >  .../pmu-events/arch/x86/westmereex/memory.json     |   0
> >  .../perf/pmu-events/arch/x86/westmereex/other.json |   0
> >  .../pmu-events/arch/x86/westmereex/pipeline.json   |   0
> >  .../arch/x86/westmereex/virtual-memory.json        |   0
> >  tools/{ => lib}/perf/pmu-events/jevents.c          |   6 +-
> >  tools/{ => lib}/perf/pmu-events/jsmn.c             |   0
> >  tools/{ => lib}/perf/pmu-events/jsmn.h             |   0
> >  tools/{ => lib}/perf/pmu-events/json.c             |   0
> >  tools/{ => lib}/perf/pmu-events/json.h             |   0
> >  tools/{perf/util => lib/perf}/pmu-hybrid.c         |   3 +-
> >  tools/lib/perf/pmu.c                               | 117 +++
> >  tools/{perf/util => lib/perf}/pmu.l                |   3 +-
> >  tools/{perf/util => lib/perf}/pmu.y                |   2 +-
> >  tools/lib/perf/tests/Build                         |   1 +
> >  tools/lib/perf/tests/main.c                        |   1 +
> >  tools/lib/perf/tests/test-evlist.c                 |   2 +
> >  tools/lib/perf/tests/test-parse-events.c           |  43 +
> >  tools/lib/perf/tests/tests.h                       |   1 +
> >  tools/perf/Makefile.perf                           |  22 +-
> >  tools/perf/arch/x86/util/kvm-stat.c                |   8 +-
> >  tools/perf/arch/x86/util/pmu.c                     |   1 -
> >  tools/perf/builtin-c2c.c                           |   2 +-
> >  tools/perf/builtin-kvm.c                           |   6 +-
> >  tools/perf/builtin-list.c                          |   2 +-
> >  tools/perf/builtin-mem.c                           |   2 +-
> >  tools/perf/builtin-record.c                        |  12 +-
> >  tools/perf/builtin-stat.c                          |  18 +-
> >  tools/perf/builtin-top.c                           |   2 +-
> >  tools/perf/builtin-trace.c                         |  12 +-
> >  tools/perf/tests/event_update.c                    |   2 +-
> >  tools/perf/tests/evsel-roundtrip-name.c            |   2 +-
> >  tools/perf/tests/evsel-tp-sched.c                  |   6 +-
> >  tools/perf/tests/expand-cgroup.c                   |   8 +-
> >  tools/perf/tests/parse-events.c                    |  87 +-
> >  tools/perf/tests/parse-metric.c                    |   6 +-
> >  tools/perf/tests/perf-time-to-tsc.c                |   2 +-
> >  tools/perf/tests/pmu-events.c                      |   2 +-
> >  tools/perf/util/Build                              |  55 --
> >  tools/perf/util/amd-sample-raw.c                   |   2 +-
> >  tools/perf/util/arm-spe.c                          |   6 +-
> >  tools/perf/util/auxtrace.c                         |   6 +-
> >  tools/perf/util/bpf_counter.c                      |   2 +-
> >  tools/perf/util/cputopo.c                          |   2 +-
> >  tools/perf/util/evlist-hybrid.c                    |   5 +-
> >  tools/perf/util/evlist.c                           |  18 +-
> >  tools/perf/util/evsel.c                            | 109 +--
> >  tools/perf/util/evsel.h                            |  23 +-
> >  tools/perf/util/evsel_fprintf.c                    |   2 +-
> >  tools/perf/util/fncache.h                          |   7 -
> >  tools/perf/util/header.c                           |  32 +-
> >  tools/perf/util/intel-pt.c                         |   6 +-
> >  tools/perf/util/mem-events.c                       |   2 +-
> >  tools/perf/util/metricgroup.c                      |  22 +-
> >  tools/perf/util/metricgroup.h                      |   2 +-
> >  tools/perf/util/parse-events-hybrid.c              |  26 +-
> >  tools/perf/util/parse-events-hybrid.h              |   6 +-
> >  tools/perf/util/parse-events.c                     | 971 +++++----------------
> >  tools/perf/util/parse-events.h                     | 167 +---
> >  tools/perf/util/pmu.c                              | 113 +--
> >  tools/perf/util/pmu.h                              |  44 +-
> >  tools/perf/util/python-ext-sources                 |   2 -
> >  tools/perf/util/record.c                           |   4 +-
> >  tools/perf/util/s390-sample-raw.c                  |   2 +-
> >  tools/perf/util/sideband_evlist.c                  |   2 +-
> >  tools/perf/util/sort.c                             |   6 +-
> >  tools/perf/util/srccode.c                          |  10 +-
> >  tools/perf/util/stat-display.c                     |  29 +-
> >  tools/perf/util/stat-shadow.c                      |  14 +-
> >  tools/perf/util/synthetic-events.c                 |  10 +-
> >  tools/perf/util/trace-event-info.c                 |   6 +-
> >  466 files changed, 2051 insertions(+), 1556 deletions(-)
> >  rename tools/{perf/util => lib/api/fs}/fncache.c (95%)
> >  create mode 100644 tools/lib/perf/include/internal/parse-events.h
> >  rename tools/{perf/util => lib/perf/include/internal}/pmu-hybrid.h (96%)
> >  create mode 100644 tools/lib/perf/include/internal/pmu.h
> >  rename tools/{perf/pmu-events => lib/perf/include/perf}/pmu-events.h (100%)
> >  create mode 100644 tools/lib/perf/parse-events.c
> >  rename tools/{perf/util => lib/perf}/parse-events.l (96%)
> >  rename tools/{perf/util => lib/perf}/parse-events.y (76%)
> >  rename tools/{ => lib}/perf/pmu-events/Build (87%)
> >  rename tools/{ => lib}/perf/pmu-events/README (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/branch.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/bus.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/clock.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/exception.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/instruction.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/intrinsic.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/ampere/emag/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a53/branch.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a53/bus.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a53/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a53/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a53/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a53/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a57-a72/core-imp-def.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/branch.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/bus.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/exception.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/instruction.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/cortex-a76-n1/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/branch.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/bus.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/exception.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/instruction.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/arm/neoverse-v1/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/armv8-common-and-microarch.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/armv8-recommended.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/cavium/thunderx2/core-imp-def.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mm/sys/ddrc.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mm/sys/metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mn/sys/ddrc.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mn/sys/metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mp/sys/ddrc.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mp/sys/metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mq/sys/ddrc.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/freescale/imx8mq/sys/metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/branch.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/bus.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/cycle.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/exception.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/instruction.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/fujitsu/a64fx/sve.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/hisilicon/hip08/core-imp-def.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/hisilicon/hip08/metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-ddrc.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-hha.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-l3c.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/arm64/mapfile.csv (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/nds32/mapfile.csv (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/nds32/n13/atcpmu.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/mapfile.csv (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/floating_point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/locks.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/marked.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/nest_metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/others.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/pmc.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power10/translation.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/marked.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/pmc.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power8/translation.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/marked.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/nest_metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/pmc.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/powerpc/power9/translation.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z10/basic.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z10/crypto.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z10/extended.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z13/basic.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z13/crypto.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z13/extended.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z13/transaction.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z14/basic.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z14/crypto.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z14/extended.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z14/transaction.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z15/basic.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z15/crypto.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z15/crypto6.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z15/extended.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z15/transaction.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z196/basic.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z196/crypto.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_z196/extended.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_zec12/basic.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_zec12/crypto.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_zec12/extended.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/cf_zec12/transaction.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/s390/mapfile.csv (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/test/arch-std-events.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/test/test_soc/cpu/branch.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/test/test_soc/cpu/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/test/test_soc/cpu/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/test/test_soc/cpu/uncore.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/test/test_soc/sys/uncore.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/branch.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/core.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/data-fabric.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen1/recommended.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/branch.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/core.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/data-fabric.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen2/recommended.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/branch.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/core.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/data-fabric.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/amdzen3/recommended.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/bonnell/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/bdw-metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/uncore.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwell/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/bdwde-metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/uncore-cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/uncore-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/uncore-power.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellde/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/bdx-metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/uncore-cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/uncore-interconnect.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/uncore-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/uncore-power.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/broadwellx/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/clx-metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/uncore-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/uncore-other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/cascadelakex/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/ehl-metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/elkhartlake/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmont/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmont/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmont/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmont/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmont/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmont/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmontplus/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmontplus/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmontplus/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmontplus/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmontplus/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/goldmontplus/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/hsw-metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/uncore.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswell/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/hsx-metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/uncore-cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/uncore-interconnect.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/uncore-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/uncore-power.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/haswellx/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/icl-metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelake/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/icx-metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/uncore-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/uncore-other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/uncore-power.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/icelakex/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/ivb-metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/uncore.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivybridge/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/ivt-metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/uncore-cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/uncore-interconnect.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/uncore-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/uncore-power.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/ivytown/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/jkt-metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/uncore-cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/uncore-interconnect.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/uncore-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/uncore-power.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/jaketown/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/knightslanding/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/knightslanding/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/knightslanding/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/knightslanding/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/knightslanding/uncore-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/knightslanding/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/mapfile.csv (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemep/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/nehalemex/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/snb-metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/uncore.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/sandybridge/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/silvermont/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/silvermont/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/silvermont/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/silvermont/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/silvermont/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/silvermont/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/skl-metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/uncore.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylake/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/skx-metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/uncore-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/uncore-other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/skylakex/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/tgl-metrics.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/tigerlake/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/uncore-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/uncore-other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/uncore-power.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/tremontx/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-dp/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereep-sp/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/cache.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/floating-point.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/frontend.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/other.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/pipeline.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/arch/x86/westmereex/virtual-memory.json (100%)
> >  rename tools/{ => lib}/perf/pmu-events/jevents.c (99%)
> >  rename tools/{ => lib}/perf/pmu-events/jsmn.c (100%)
> >  rename tools/{ => lib}/perf/pmu-events/jsmn.h (100%)
> >  rename tools/{ => lib}/perf/pmu-events/json.c (100%)
> >  rename tools/{ => lib}/perf/pmu-events/json.h (100%)
> >  rename tools/{perf/util => lib/perf}/pmu-hybrid.c (97%)
> >  create mode 100644 tools/lib/perf/pmu.c
> >  rename tools/{perf/util => lib/perf}/pmu.l (91%)
> >  rename tools/{perf/util => lib/perf}/pmu.y (98%)
> >  create mode 100644 tools/lib/perf/tests/test-parse-events.c
> >  delete mode 100644 tools/perf/util/fncache.h
> >
> 


^ permalink raw reply	[flat|nested] 78+ messages in thread

end of thread, other threads:[~2021-11-08 21:50 UTC | newest]

Thread overview: 78+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-08 13:36 [RFC 00/59] libperf: Move in event parse code Jiri Olsa
2021-11-08 13:36 ` [PATCH 01/59] libperf: Move pmu-events.h file to libperf Jiri Olsa
2021-11-08 13:36 ` [PATCH 03/59] libperf: Move pmu-events build " Jiri Olsa
2021-11-08 13:36 ` [PATCH 04/59] libperf: Move perf_pmu__format_parse " Jiri Olsa
2021-11-08 13:36 ` [PATCH 05/59] tools api fs: Move in the fncache from perf Jiri Olsa
2021-11-08 17:46   ` Ian Rogers
2021-11-08 21:15     ` Jiri Olsa
2021-11-08 13:36 ` [PATCH 06/59] libperf: Move in the pmu hybrid support Jiri Olsa
2021-11-08 13:36 ` [PATCH 07/59] libperf: Move name to perf_evsel Jiri Olsa
2021-11-08 13:36 ` [PATCH 08/59] libperf: Move auto_merge_stats " Jiri Olsa
2021-11-08 13:36 ` [PATCH 09/59] libperf: Move config_terms " Jiri Olsa
2021-11-08 13:36 ` [PATCH 10/59] libperf: Move metric_id " Jiri Olsa
2021-11-08 13:36 ` [PATCH 11/59] libperf: Move tool_event " Jiri Olsa
2021-11-08 13:36 ` [PATCH 12/59] libperf: Move unit " Jiri Olsa
2021-11-08 13:36 ` [PATCH 13/59] libperf: Move exclude_GH " Jiri Olsa
2021-11-08 17:53   ` Ian Rogers
2021-11-08 21:16     ` Jiri Olsa
2021-11-08 13:36 ` [PATCH 14/59] libperf: Move sample_read " Jiri Olsa
2021-11-08 13:36 ` [PATCH 15/59] libperf: Move precise_max " Jiri Olsa
2021-11-08 13:36 ` [PATCH 16/59] libperf: Move weak_group " Jiri Olsa
2021-11-08 13:36 ` [PATCH 17/59] libperf: Move bpf_counter " Jiri Olsa
2021-11-08 13:36 ` [PATCH 18/59] libperf: Move group_name " Jiri Olsa
2021-11-08 17:58   ` Ian Rogers
2021-11-08 18:07     ` Arnaldo Carvalho de Melo
2021-11-08 21:19       ` Jiri Olsa
2021-11-08 13:36 ` [PATCH 19/59] perf tools: Fix parse_events_term__num call Jiri Olsa
2021-11-08 18:15   ` Ian Rogers
2021-11-08 21:21     ` Jiri Olsa
2021-11-08 13:36 ` [PATCH 20/59] perf tools: Pass parse_state all the way down to __add_event Jiri Olsa
2021-11-08 13:36 ` [PATCH 21/59] perf tools: Pass parse_state all the way down to add_tracepoint Jiri Olsa
2021-11-08 13:36 ` [PATCH 22/59] perf tools: Add evsel__new callback to parse_state_ops Jiri Olsa
2021-11-08 13:36 ` [PATCH 23/59] perf tools: Add evsel__new_tp " Jiri Olsa
2021-11-08 13:36 ` [PATCH 24/59] perf tools: Add loc_term and loc_val helpers to parse_events_term__str Jiri Olsa
2021-11-08 13:36 ` [PATCH 25/59] perf tools: Add loc_term and loc_val helpers to parse_events_term__num Jiri Olsa
2021-11-08 13:36 ` [PATCH 26/59] libperf: Move in the event_symbols_hw/event_symbols_sw Jiri Olsa
2021-11-08 13:36 ` [PATCH 27/59] libperf: Move in struct parse_events_term code Jiri Olsa
2021-11-08 13:36 ` [PATCH 28/59] perf tools: Add perf_evsel__add_event function Jiri Olsa
2021-11-08 13:36 ` [PATCH 29/59] perf tools: Change struct parse_events_state::evlist to perf_evlist Jiri Olsa
2021-11-08 13:36 ` [PATCH 30/59] libperf: Move in struct parse_events_state Jiri Olsa
2021-11-08 18:21   ` Ian Rogers
2021-11-08 21:24     ` Jiri Olsa
2021-11-08 13:36 ` [PATCH 31/59] perf tools: Move event_attr_init in evsel__new_idx function Jiri Olsa
2021-11-08 13:36 ` [PATCH 32/59] libperf: Move in perf_pmu__warn_invalid_config function Jiri Olsa
2021-11-08 13:36 ` [PATCH 33/59] libperf: Move in perf_evsel__add_event function Jiri Olsa
2021-11-08 13:36 ` [PATCH 34/59] perf tools: Move parse_events_update_lists to parser unit Jiri Olsa
2021-11-08 13:36 ` [PATCH 35/59] libperf: Add perf_evsel__is_group_leader function Jiri Olsa
2021-11-08 13:36 ` [PATCH 36/59] perf tools: Make parse_events__modifier_event work over perf_evsel Jiri Olsa
2021-11-08 13:36 ` [PATCH 37/59] perf tool: Pass perf_guest in struct parse_events_state Jiri Olsa
2021-11-08 13:36 ` [PATCH 38/59] libperf: Move in parse_events__modifier_group/event functions Jiri Olsa
2021-11-08 13:36 ` [PATCH 39/59] libperf: Move in parse_events__handle_error function Jiri Olsa
2021-11-08 13:36 ` [PATCH 40/59] libperf: Move in parse_events_evlist_error function Jiri Olsa
2021-11-08 13:36 ` [PATCH 41/59] perf tools: Add perf_evsel__delete callback to struct parse_events_ops Jiri Olsa
2021-11-08 13:36 ` [PATCH 42/59] libperf: Move in parse_events_name function Jiri Olsa
2021-11-08 18:23   ` Ian Rogers
2021-11-08 21:24     ` Jiri Olsa
2021-11-08 13:36 ` [PATCH 43/59] perf tools: Move out parse_events_add_pmu fallback from parser code Jiri Olsa
2021-11-08 13:36 ` [PATCH 44/59] perf tools: Add add_pmu callback to struct parse_events_ops Jiri Olsa
2021-11-08 13:36 ` [PATCH 45/59] perf tools: Add add_pmu_multi " Jiri Olsa
2021-11-08 13:36 ` [PATCH 46/59] perf tools: Add add_numeric " Jiri Olsa
2021-11-08 18:27   ` Ian Rogers
2021-11-08 21:34     ` Jiri Olsa
2021-11-08 13:36 ` [PATCH 47/59] perf tools: Add add_cache " Jiri Olsa
2021-11-08 13:36 ` [PATCH 48/59] perf tools: Add add_breakpoint " Jiri Olsa
2021-11-08 13:37 ` [PATCH 49/59] perf tools: Add add_tracepoint " Jiri Olsa
2021-11-08 13:37 ` [PATCH 50/59] perf tools: Add add_bpf " Jiri Olsa
2021-11-08 13:37 ` [PATCH 51/59] perf tools: Add add_tool " Jiri Olsa
2021-11-08 13:37 ` [PATCH 52/59] perf tools: Add set_leader " Jiri Olsa
2021-11-08 13:37 ` [PATCH 53/59] perf tools: Add parse_check " Jiri Olsa
2021-11-08 13:37 ` [PATCH 54/59] perf tools: Move PE_* enums in parse_events__scanner Jiri Olsa
2021-11-08 13:37 ` [PATCH 55/59] libperf: Move in parse-events flex/bison parser Jiri Olsa
2021-11-08 13:37 ` [PATCH 56/59] libperf: Move in parse_events_add_breakpoint function Jiri Olsa
2021-11-08 13:37 ` [PATCH 57/59] libperf: Move in some lib objects from perf Jiri Olsa
2021-11-08 13:37 ` [PATCH 58/59] libperf: Add libperf_parse_events function Jiri Olsa
2021-11-08 13:37 ` [PATCH 59/59] libperf: Add parse-events test Jiri Olsa
2021-11-08 18:32   ` Ian Rogers
2021-11-08 21:37     ` Jiri Olsa
2021-11-08 18:50 ` [RFC 00/59] libperf: Move in event parse code Ian Rogers
2021-11-08 21:50   ` Jiri Olsa

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).