Messages in this thread | | | Subject | Re: [PATCH] perf hist: Fix memory leak of a perf_hpp_fmt | From | kajoljain <> | Date | Thu, 18 Nov 2021 13:28:11 +0530 |
| |
On 11/18/21 12:42 PM, Ian Rogers wrote: > perf_hpp__column_unregister removes an entry from a list but doesn't > free the memory causing a memory leak spotted by leak sanitizer. Add the > free while at the same time reducing the scope of the function to > static.
Patch looks good to me.
Reviewed-by: Kajol Jain<kjain@linux.ibm.com>
Thanks, Kajol jain
> > Signed-off-by: Ian Rogers <irogers@google.com> > --- > tools/perf/ui/hist.c | 28 ++++++++++++++-------------- > tools/perf/util/hist.h | 1 - > 2 files changed, 14 insertions(+), 15 deletions(-) > > diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c > index c1f24d004852..5075ecead5f3 100644 > --- a/tools/perf/ui/hist.c > +++ b/tools/perf/ui/hist.c > @@ -535,6 +535,18 @@ struct perf_hpp_list perf_hpp_list = { > #undef __HPP_SORT_ACC_FN > #undef __HPP_SORT_RAW_FN > > +static void fmt_free(struct perf_hpp_fmt *fmt) > +{ > + /* > + * At this point fmt should be completely > + * unhooked, if not it's a bug. > + */ > + BUG_ON(!list_empty(&fmt->list)); > + BUG_ON(!list_empty(&fmt->sort_list)); > + > + if (fmt->free) > + fmt->free(fmt); > +} > > void perf_hpp__init(void) > { > @@ -598,9 +610,10 @@ void perf_hpp_list__prepend_sort_field(struct perf_hpp_list *list, > list_add(&format->sort_list, &list->sorts); > } > > -void perf_hpp__column_unregister(struct perf_hpp_fmt *format) > +static void perf_hpp__column_unregister(struct perf_hpp_fmt *format) > { > list_del_init(&format->list); > + fmt_free(format); > } > > void perf_hpp__cancel_cumulate(void) > @@ -672,19 +685,6 @@ void perf_hpp__append_sort_keys(struct perf_hpp_list *list) > } > > > -static void fmt_free(struct perf_hpp_fmt *fmt) > -{ > - /* > - * At this point fmt should be completely > - * unhooked, if not it's a bug. > - */ > - BUG_ON(!list_empty(&fmt->list)); > - BUG_ON(!list_empty(&fmt->sort_list)); > - > - if (fmt->free) > - fmt->free(fmt); > -} > - > void perf_hpp__reset_output_field(struct perf_hpp_list *list) > { > struct perf_hpp_fmt *fmt, *tmp; > diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h > index 5343b62476e6..621f35ae1efa 100644 > --- a/tools/perf/util/hist.h > +++ b/tools/perf/util/hist.h > @@ -369,7 +369,6 @@ enum { > }; > > void perf_hpp__init(void); > -void perf_hpp__column_unregister(struct perf_hpp_fmt *format); > void perf_hpp__cancel_cumulate(void); > void perf_hpp__setup_output_field(struct perf_hpp_list *list); > void perf_hpp__reset_output_field(struct perf_hpp_list *list); >
| |