Re: [PATCH v1] perf parse-events: Avoid string for PE_BP_COLON, PE_BP_SLASH

From: Ian Rogers
Date: Tue Jun 13 2023 - 16:26:46 EST


On Tue, Jun 13, 2023 at 12:41 PM Arnaldo Carvalho de Melo
<acme@xxxxxxxxxx> wrote:
>
> Em Tue, Jun 13, 2023 at 11:26:29AM -0700, Ian Rogers escreveu:
> > 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.
>
> It looked like the compiler was the one warning (-Wother) about args not
> being used, didn't made it clear those were possible memory leaks :-\
>
> util/parse-events.y:508.24-34: warning: unused value: $3 [-Wother]
> 508 | PE_PREFIX_MEM PE_VALUE PE_BP_SLASH PE_VALUE PE_BP_COLON PE_MODIFIER_BP opt_event_config
>
> Anyway, I'll apply and test your patch.
>
> - Arnaldo

Thanks, I couldn't repro the problem but I know that's because I don't
have your full container set up. Given my ignorance please help me fix
the commit message, or I can update it in a v2 set, or possibly we'll
need to bring back the unused logic.

Ian

>
> > Fixes: f0617f526cb0 ("perf parse: Allow config terms with breakpoints")
> > Signed-off-by: Ian Rogers <irogers@xxxxxxxxxx>
> > ---
> > tools/perf/util/parse-events.h | 4 ----
> > tools/perf/util/parse-events.l | 4 ++--
> > tools/perf/util/parse-events.y | 9 ---------
> > 3 files changed, 2 insertions(+), 15 deletions(-)
> >
> > diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
> > index 5fdc1f33f57e..b0eb95f93e9c 100644
> > --- a/tools/perf/util/parse-events.h
> > +++ b/tools/perf/util/parse-events.h
> > @@ -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 '%',
> > diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l
> > index 7629af3d5c7c..99335ec586ae 100644
> > --- a/tools/perf/util/parse-events.l
> > +++ b/tools/perf/util/parse-events.l
> > @@ -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); }
> > diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
> > index 0c3d086cc22a..9f28d4b5502f 100644
> > --- a/tools/perf/util/parse-events.y
> > +++ b/tools/perf/util/parse-events.y
> > @@ -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,
> > --
> > 2.41.0.162.gfafddb0af9-goog
> >
>
> --
>
> - Arnaldo