[PATCH v2 00/26] Fix memory leaks (was reference count checking for thread)

Ian Rogers irogers at google.com
Thu Jun 8 16:27:57 PDT 2023


Use leak sanitizer and reference count checking to fix outstanding
memory leaks in "perf top" or those discovered in "perf test". Also
fix address sanitizer issues discovered.

Add reference count checking to thread after first refactoring bits of
the code, such as making the thread red-black tree non-invasive (so
the thread it references is easier to reference count, rather than
having 3 potential references). Part of this refactoring also removes
the dead thread list because if we held a reference here the threads
would never die and anything else has questionable
correctness.

addr_location is made into its own C/header file to capture the init,
exit and copy code.

Refactor and change callchain_cursor to come from a pthread key so
that a destructor can run on pthreads exiting.

Fix additional outstanding memory leak and reference count issues to
the point that "perf test" compiled with address sanitizer but without
libtraceevent passes all but one test - libtraceevent reports leaks
within its own code, most likely as it isn't compiled with
sanitizers. The remaining failing test is "68: Test dwarf unwind" and
that has address sanitizer issues as it uses memcpy to access the
stack within the process - we likely want to skip parts of the test
with sanitizers enabled.

v2. Include extra fixes for callchain cursor, addr2line and related
    "perf top" fixes, as well as the 2 patches in:
    https://lore.kernel.org/lkml/20230607050148.3248353-1-irogers@google.com/

Ian Rogers (26):
  perf thread: Remove notion of dead threads
  perf thread: Make threads rbtree non-invasive
  perf thread: Add accessor functions for thread
  perf maps: Make delete static, always use put
  perf addr_location: Move to its own header
  perf addr_location: Add init/exit/copy functions
  perf thread: Add reference count checking
  perf machine: Make delete_threads part of machine__exit
  perf report: Avoid thread leak
  perf header: Ensure bitmaps are freed
  perf stat: Avoid evlist leak
  perf intel-pt: Fix missed put and leak
  perf evlist: Free stats in all evlist destruction
  perf python: Avoid 2 leak sanitizer issues
  perf jit: Fix two thread leaks
  perf symbol-elf: Correct holding a reference
  perf maps: Fix overlapping memory leak
  perf machine: Fix leak of kernel dso
  perf machine: Don't leak module maps
  perf map/maps/thread: Changes to reference counting
  perf annotate: Fix parse_objdump_line memory leak
  perf top: Add exit routine for main thread
  perf header: Avoid out-of-bounds read
  perf callchain: Use pthread keys for tls callchain_cursor
  perf srcline: Change free_srcline to zfree_srcline
  perf hist: Fix srcline memory leak

 tools/perf/arch/arm/tests/dwarf-unwind.c      |   2 +-
 tools/perf/arch/arm64/tests/dwarf-unwind.c    |   2 +-
 tools/perf/arch/powerpc/tests/dwarf-unwind.c  |   2 +-
 tools/perf/arch/x86/tests/dwarf-unwind.c      |   2 +-
 tools/perf/builtin-annotate.c                 |  28 +-
 tools/perf/builtin-c2c.c                      |  22 +-
 tools/perf/builtin-diff.c                     |  20 +-
 tools/perf/builtin-inject.c                   |   4 +-
 tools/perf/builtin-kmem.c                     |  13 +-
 tools/perf/builtin-kwork.c                    |  15 +-
 tools/perf/builtin-mem.c                      |   4 +-
 tools/perf/builtin-report.c                   |  21 +-
 tools/perf/builtin-sched.c                    |  80 ++---
 tools/perf/builtin-script.c                   | 123 ++++----
 tools/perf/builtin-stat.c                     |   1 +
 tools/perf/builtin-timechart.c                |  11 +-
 tools/perf/builtin-top.c                      |  19 +-
 tools/perf/builtin-trace.c                    |  38 ++-
 .../scripts/python/Perf-Trace-Util/Context.c  |   4 +-
 tools/perf/tests/code-reading.c               |   6 +-
 tools/perf/tests/dwarf-unwind.c               |   1 -
 tools/perf/tests/hists_common.c               |   2 +-
 tools/perf/tests/hists_cumulate.c             |  18 +-
 tools/perf/tests/hists_filter.c               |  11 +-
 tools/perf/tests/hists_link.c                 |  20 +-
 tools/perf/tests/hists_output.c               |  12 +-
 tools/perf/tests/maps.c                       |   2 +-
 tools/perf/tests/mmap-thread-lookup.c         |   5 +-
 tools/perf/tests/perf-targz-src-pkg           |   5 +-
 tools/perf/tests/symbols.c                    |   1 -
 tools/perf/tests/thread-maps-share.c          |  13 +-
 tools/perf/trace/beauty/pid.c                 |   4 +-
 tools/perf/ui/browsers/hists.c                |  19 +-
 tools/perf/ui/hist.c                          |   5 +-
 tools/perf/ui/stdio/hist.c                    |   2 +-
 tools/perf/util/Build                         |   1 +
 tools/perf/util/addr_location.c               |  44 +++
 tools/perf/util/addr_location.h               |  31 ++
 tools/perf/util/annotate.c                    |   5 +-
 tools/perf/util/arm-spe.c                     |   4 +-
 tools/perf/util/block-info.c                  |   4 +-
 tools/perf/util/build-id.c                    |   2 +
 tools/perf/util/callchain.c                   |  68 +++-
 tools/perf/util/callchain.h                   |   4 +-
 tools/perf/util/cs-etm.c                      |  28 +-
 tools/perf/util/data-convert-json.c           |  16 +-
 tools/perf/util/db-export.c                   |  30 +-
 tools/perf/util/dlfilter.c                    |  17 +-
 tools/perf/util/event.c                       |  37 +--
 tools/perf/util/evlist.c                      |   2 +
 tools/perf/util/evsel_fprintf.c               |   8 +-
 tools/perf/util/header.c                      |  14 +-
 tools/perf/util/hist.c                        |  59 ++--
 tools/perf/util/intel-bts.c                   |   2 +-
 tools/perf/util/intel-pt.c                    |  88 +++---
 tools/perf/util/jitdump.c                     |  12 +-
 tools/perf/util/machine.c                     | 292 +++++++++---------
 tools/perf/util/map.c                         |   4 +-
 tools/perf/util/maps.c                        |   5 +-
 tools/perf/util/maps.h                        |   9 +-
 tools/perf/util/python.c                      |   4 +
 .../scripting-engines/trace-event-python.c    |  40 ++-
 tools/perf/util/session.c                     |   8 +-
 tools/perf/util/sort.c                        |  12 +-
 tools/perf/util/srcline.c                     |  15 +-
 tools/perf/util/srcline.h                     |   2 +-
 tools/perf/util/symbol-elf.c                  |   4 +-
 tools/perf/util/symbol.h                      |  17 +-
 tools/perf/util/thread-stack.c                |  25 +-
 tools/perf/util/thread.c                      | 222 +++++++------
 tools/perf/util/thread.h                      | 210 ++++++++++++-
 tools/perf/util/unwind-libdw.c                |  27 +-
 tools/perf/util/unwind-libunwind-local.c      |  19 +-
 tools/perf/util/unwind-libunwind.c            |   2 +-
 tools/perf/util/vdso.c                        |   2 +-
 75 files changed, 1210 insertions(+), 722 deletions(-)
 create mode 100644 tools/perf/util/addr_location.c
 create mode 100644 tools/perf/util/addr_location.h

-- 
2.41.0.162.gfafddb0af9-goog




More information about the linux-arm-kernel mailing list