perf parse-events: Avoid string for PE_BP_COLON, PE_BP_SLASH
authorIan Rogers <irogers@google.com>
Tue, 13 Jun 2023 18:26:29 +0000 (11:26 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 14 Jun 2023 02:40:33 +0000 (23:40 -0300)
There's no need to read the string ':' or '/' for PE_BP_COLON or
PE_BP_SLASH and doing so causes parse-events.y to leak memory.

The original patch has a committer note about not using these tokens
presumably as yacc spotted they were a memory leak because no
%destructor could be run. Remove the unused token workaround as there
is now no value associated with these tokens.

Fixes: f0617f526cb0c482 ("perf parse: Allow config terms with breakpoints")
Signed-off-by: Ian Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rob Herring <robh@kernel.org>
Link: https://lore.kernel.org/r/20230613182629.1500317-1-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/parse-events.h
tools/perf/util/parse-events.l
tools/perf/util/parse-events.y

index 5fdc1f33f57ec9941991c5e6abe3e4995e1566eb..b0eb95f93e9c32aab80aa7e1c279a2c1fa0c23dc 100644 (file)
@@ -228,10 +228,6 @@ void parse_events_error__handle(struct parse_events_error *err, int idx,
 void parse_events_error__print(struct parse_events_error *err,
                               const char *event);
 
-static inline void parse_events_unused_value(const void *x __maybe_unused)
-{
-}
-
 #ifdef HAVE_LIBELF_SUPPORT
 /*
  * If the probe point starts with '%',
index 7629af3d5c7cd2c68798bd82e8700ce5820e4ff4..99335ec586ae814b4a21d7a668522bf69f4f19b9 100644 (file)
@@ -315,13 +315,13 @@ r0x{num_raw_hex}  { return str(yyscanner, PE_RAW); }
         * are the same, so trailing context can be used disambiguate the two
         * cases.
         */
-":"/{modifier_bp}      { return str(yyscanner, PE_BP_COLON); }
+":"/{modifier_bp}      { return PE_BP_COLON; }
        /*
         * The slash before memory length can get mixed up with the slash before
         * config terms. Fortunately config terms do not start with a numeric
         * digit, so trailing context can be used disambiguate the two cases.
         */
-"/"/{digit}            { return str(yyscanner, PE_BP_SLASH); }
+"/"/{digit}            { return PE_BP_SLASH; }
 "/"/{non_digit}                { BEGIN(config); return '/'; }
 {num_dec}              { return value(yyscanner, 10); }
 {num_hex}              { return value(yyscanner, 16); }
index 0c3d086cc22aaefde7c74e300ff16e69ca46f35f..9f28d4b5502f18270bd7b8bdb1b0b3e800afae79 100644 (file)
@@ -80,8 +80,6 @@ static void free_list_evsel(struct list_head* list_evsel)
 %type <str> PE_LEGACY_CACHE
 %type <str> PE_MODIFIER_EVENT
 %type <str> PE_MODIFIER_BP
-%type <str> PE_BP_COLON
-%type <str> PE_BP_SLASH
 %type <str> PE_EVENT_NAME
 %type <str> PE_KERNEL_PMU_EVENT PE_PMU_EVENT_FAKE
 %type <str> PE_DRV_CFG_TERM
@@ -510,9 +508,6 @@ PE_PREFIX_MEM PE_VALUE PE_BP_SLASH PE_VALUE PE_BP_COLON PE_MODIFIER_BP opt_event
        struct list_head *list;
        int err;
 
-       parse_events_unused_value(&$3);
-       parse_events_unused_value(&$5);
-
        list = alloc_list();
        ABORT_ON(!list);
        err = parse_events_add_breakpoint(_parse_state, list,
@@ -531,8 +526,6 @@ PE_PREFIX_MEM PE_VALUE PE_BP_SLASH PE_VALUE opt_event_config
        struct list_head *list;
        int err;
 
-       parse_events_unused_value(&$3);
-
        list = alloc_list();
        ABORT_ON(!list);
        err = parse_events_add_breakpoint(_parse_state, list,
@@ -550,8 +543,6 @@ PE_PREFIX_MEM PE_VALUE PE_BP_COLON PE_MODIFIER_BP opt_event_config
        struct list_head *list;
        int err;
 
-       parse_events_unused_value(&$3);
-
        list = alloc_list();
        ABORT_ON(!list);
        err = parse_events_add_breakpoint(_parse_state, list,