lkml.org 
[lkml]   [2022]   [Jan]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
Subject[PATCH v2 0/4] Reference count checker and related fixes
From
This v2 patch set has the main reference count patch for cpu map from
the first set and then adds reference count checking to nsinfo. The
reference count checking on nsinfo helped diagnose a data race bug
which is fixed in the independent patches 2 and 3.

The perf tool has a class of memory problems where reference counts
are used incorrectly. Memory/address sanitizers and valgrind don't
provide useful ways to debug these problems, you see a memory leak
where the only pertinent information is the original allocation
site. What would be more useful is knowing where a get fails to have a
corresponding put, where there are double puts, etc.

This work was motivated by the roll-back of:
https://lore.kernel.org/linux-perf-users/20211118193714.2293728-1-irogers@google.com/
where fixing a missed put resulted in a use-after-free in a different
context. There was a sense in fixing the issue that a game of
wac-a-mole had been embarked upon in adding missed gets and puts.

The basic approach of the change is to add a level of indirection at
the get and put calls. Get allocates a level of indirection that, if
no corresponding put is called, becomes a memory leak (and associated
stack trace) that leak sanitizer can report. Similarly if two puts are
called for the same get, then a double free can be detected by address
sanitizer. This can also detect the use after put, which should also
yield a segv without a sanitizer.

Adding reference count checking to cpu map was done as a proof of
concept, it yielded little other than a location where the use of get
could be cleaner by using its result. Reference count checking on
nsinfo identified a double free of the indirection layer and the
related threads, thereby identifying a data race as discussed here:
https://lore.kernel.org/linux-perf-users/CAP-5=fWZH20L4kv-BwVtGLwR=Em3AOOT+Q4QGivvQuYn5AsPRg@mail.gmail.com/
Accordingly the dso->lock was extended and use to cover the race.

An alternative that was considered was ref_tracker:
https://lwn.net/Articles/877603/
ref_tracker requires use of a reference counted struct to also use a
cookie/tracker. The cookie is combined with data in a ref_tracker_dir
to spot double puts. When an object is finished with leaks can be
detected, as with this approach when leak analysis happens. This
approach was preferred as it doesn't introduce cookies, spots use
after put and appears moderately more neutral to the API. Weaknesses
of the implemented approcah are not being able to do adhoc leak
detection and a preference for adding an accessor API to structs. I
believe there are other issues and welcome suggestions.

Ian Rogers (4):
perf cpumap: Add reference count checking
perf dso: Make lock error check and add BUG_ONs
perf dso: Hold lock when accessing nsinfo
perf namespaces: Add reference count checking

tools/lib/perf/cpumap.c | 120 ++++++++++-----
tools/lib/perf/include/internal/cpumap.h | 14 +-
tools/perf/builtin-inject.c | 6 +-
tools/perf/builtin-probe.c | 2 +-
tools/perf/tests/cpumap.c | 20 ++-
tools/perf/util/build-id.c | 4 +-
tools/perf/util/cpumap.c | 42 ++---
tools/perf/util/dso.c | 17 ++-
tools/perf/util/jitdump.c | 10 +-
tools/perf/util/map.c | 7 +-
tools/perf/util/namespaces.c | 187 ++++++++++++++++-------
tools/perf/util/namespaces.h | 23 ++-
tools/perf/util/pmu.c | 24 +--
tools/perf/util/probe-event.c | 2 +
tools/perf/util/symbol.c | 10 +-
15 files changed, 337 insertions(+), 151 deletions(-)

--
2.35.0.rc0.227.g00780c9af4-goog

\
 
 \ /
  Last update: 2022-01-25 21:47    [W:0.119 / U:0.408 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site