Message ID | 20230608232823.4027869-5-irogers@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Fix memory leaks (was reference count checking for thread) | expand |
Em Thu, Jun 08, 2023 at 04:28:01PM -0700, Ian Rogers escreveu: > Address/leak sanitizer with reference count checking can identify the > location of leaks, so use put rather than delete to avoid free-ing > memory when the reference count is >1. Add maps__zput to ensure the > variable is cleared. Applied. - Arnaldo > Signed-off-by: Ian Rogers <irogers@google.com> > --- > tools/perf/tests/maps.c | 2 +- > tools/perf/util/machine.c | 2 +- > tools/perf/util/maps.c | 2 +- > tools/perf/util/maps.h | 9 ++++++++- > 4 files changed, 11 insertions(+), 4 deletions(-) > > diff --git a/tools/perf/tests/maps.c b/tools/perf/tests/maps.c > index 8c0eb5cf8bb5..5bb1123a91a7 100644 > --- a/tools/perf/tests/maps.c > +++ b/tools/perf/tests/maps.c > @@ -140,7 +140,7 @@ static int test__maps__merge_in(struct test_suite *t __maybe_unused, int subtest > ret = check_maps(merged3, ARRAY_SIZE(merged3), maps); > TEST_ASSERT_VAL("merge check failed", !ret); > > - maps__delete(maps); > + maps__zput(maps); > return TEST_OK; > } > > diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c > index 5d34d60a0045..8972c852d3bd 100644 > --- a/tools/perf/util/machine.c > +++ b/tools/perf/util/machine.c > @@ -248,7 +248,7 @@ void machine__exit(struct machine *machine) > return; > > machine__destroy_kernel_maps(machine); > - maps__delete(machine->kmaps); > + maps__zput(machine->kmaps); > dsos__exit(&machine->dsos); > machine__exit_vdso(machine); > zfree(&machine->root_dir); > diff --git a/tools/perf/util/maps.c b/tools/perf/util/maps.c > index 5ae6379a1b42..5206a6433117 100644 > --- a/tools/perf/util/maps.c > +++ b/tools/perf/util/maps.c > @@ -171,7 +171,7 @@ struct maps *maps__new(struct machine *machine) > return result; > } > > -void maps__delete(struct maps *maps) > +static void maps__delete(struct maps *maps) > { > maps__exit(maps); > unwind__finish_access(maps); > diff --git a/tools/perf/util/maps.h b/tools/perf/util/maps.h > index d2963456cfbe..83144e0645ed 100644 > --- a/tools/perf/util/maps.h > +++ b/tools/perf/util/maps.h > @@ -57,13 +57,20 @@ struct kmap { > }; > > struct maps *maps__new(struct machine *machine); > -void maps__delete(struct maps *maps); > bool maps__empty(struct maps *maps); > int maps__clone(struct thread *thread, struct maps *parent); > > struct maps *maps__get(struct maps *maps); > void maps__put(struct maps *maps); > > +static inline void __maps__zput(struct maps **map) > +{ > + maps__put(*map); > + *map = NULL; > +} > + > +#define maps__zput(map) __maps__zput(&map) > + > static inline struct rb_root *maps__entries(struct maps *maps) > { > return &RC_CHK_ACCESS(maps)->entries; > -- > 2.41.0.162.gfafddb0af9-goog >
diff --git a/tools/perf/tests/maps.c b/tools/perf/tests/maps.c index 8c0eb5cf8bb5..5bb1123a91a7 100644 --- a/tools/perf/tests/maps.c +++ b/tools/perf/tests/maps.c @@ -140,7 +140,7 @@ static int test__maps__merge_in(struct test_suite *t __maybe_unused, int subtest ret = check_maps(merged3, ARRAY_SIZE(merged3), maps); TEST_ASSERT_VAL("merge check failed", !ret); - maps__delete(maps); + maps__zput(maps); return TEST_OK; } diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 5d34d60a0045..8972c852d3bd 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -248,7 +248,7 @@ void machine__exit(struct machine *machine) return; machine__destroy_kernel_maps(machine); - maps__delete(machine->kmaps); + maps__zput(machine->kmaps); dsos__exit(&machine->dsos); machine__exit_vdso(machine); zfree(&machine->root_dir); diff --git a/tools/perf/util/maps.c b/tools/perf/util/maps.c index 5ae6379a1b42..5206a6433117 100644 --- a/tools/perf/util/maps.c +++ b/tools/perf/util/maps.c @@ -171,7 +171,7 @@ struct maps *maps__new(struct machine *machine) return result; } -void maps__delete(struct maps *maps) +static void maps__delete(struct maps *maps) { maps__exit(maps); unwind__finish_access(maps); diff --git a/tools/perf/util/maps.h b/tools/perf/util/maps.h index d2963456cfbe..83144e0645ed 100644 --- a/tools/perf/util/maps.h +++ b/tools/perf/util/maps.h @@ -57,13 +57,20 @@ struct kmap { }; struct maps *maps__new(struct machine *machine); -void maps__delete(struct maps *maps); bool maps__empty(struct maps *maps); int maps__clone(struct thread *thread, struct maps *parent); struct maps *maps__get(struct maps *maps); void maps__put(struct maps *maps); +static inline void __maps__zput(struct maps **map) +{ + maps__put(*map); + *map = NULL; +} + +#define maps__zput(map) __maps__zput(&map) + static inline struct rb_root *maps__entries(struct maps *maps) { return &RC_CHK_ACCESS(maps)->entries;
Address/leak sanitizer with reference count checking can identify the location of leaks, so use put rather than delete to avoid free-ing memory when the reference count is >1. Add maps__zput to ensure the variable is cleared. Signed-off-by: Ian Rogers <irogers@google.com> --- tools/perf/tests/maps.c | 2 +- tools/perf/util/machine.c | 2 +- tools/perf/util/maps.c | 2 +- tools/perf/util/maps.h | 9 ++++++++- 4 files changed, 11 insertions(+), 4 deletions(-)