Message ID | 20220824153901.488576-12-irogers@google.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | BPF |
Headers | show |
Series | Mutex wrapper, locking and memory leak fixes | expand |
Context | Check | Description |
---|---|---|
bpf/vmtest-bpf-PR | fail | merge-conflict |
netdev/tree_selection | success | Not a local patch |
On 24/08/22 18:38, Ian Rogers wrote: > Switch to the use of mutex wrappers that provide better error checking. > > Signed-off-by: Ian Rogers <irogers@google.com> > --- > tools/perf/util/dso.c | 12 ++++++------ Some not done yet $ grep -i pthread_mut tools/perf/util/dso.c static pthread_mutex_t dso__data_open_lock = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&dso__data_open_lock); pthread_mutex_unlock(&dso__data_open_lock); if (pthread_mutex_lock(&dso__data_open_lock) < 0) pthread_mutex_unlock(&dso__data_open_lock); pthread_mutex_unlock(&dso__data_open_lock); pthread_mutex_lock(&dso__data_open_lock); pthread_mutex_unlock(&dso__data_open_lock); pthread_mutex_lock(&dso__data_open_lock); pthread_mutex_unlock(&dso__data_open_lock); > tools/perf/util/dso.h | 4 ++-- > tools/perf/util/symbol.c | 4 ++-- > 3 files changed, 10 insertions(+), 10 deletions(-) > > diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c > index 5ac13958d1bd..a9789a955403 100644 > --- a/tools/perf/util/dso.c > +++ b/tools/perf/util/dso.c > @@ -795,7 +795,7 @@ dso_cache__free(struct dso *dso) > struct rb_root *root = &dso->data.cache; > struct rb_node *next = rb_first(root); > > - pthread_mutex_lock(&dso->lock); > + mutex_lock(&dso->lock); > while (next) { > struct dso_cache *cache; > > @@ -804,7 +804,7 @@ dso_cache__free(struct dso *dso) > rb_erase(&cache->rb_node, root); > free(cache); > } > - pthread_mutex_unlock(&dso->lock); > + mutex_unlock(&dso->lock); > } > > static struct dso_cache *__dso_cache__find(struct dso *dso, u64 offset) > @@ -841,7 +841,7 @@ dso_cache__insert(struct dso *dso, struct dso_cache *new) > struct dso_cache *cache; > u64 offset = new->offset; > > - pthread_mutex_lock(&dso->lock); > + mutex_lock(&dso->lock); > while (*p != NULL) { > u64 end; > > @@ -862,7 +862,7 @@ dso_cache__insert(struct dso *dso, struct dso_cache *new) > > cache = NULL; > out: > - pthread_mutex_unlock(&dso->lock); > + mutex_unlock(&dso->lock); > return cache; > } > > @@ -1297,7 +1297,7 @@ struct dso *dso__new_id(const char *name, struct dso_id *id) > dso->root = NULL; > INIT_LIST_HEAD(&dso->node); > INIT_LIST_HEAD(&dso->data.open_entry); > - pthread_mutex_init(&dso->lock, NULL); > + mutex_init(&dso->lock); > refcount_set(&dso->refcnt, 1); > } > > @@ -1336,7 +1336,7 @@ void dso__delete(struct dso *dso) > dso__free_a2l(dso); > zfree(&dso->symsrc_filename); > nsinfo__zput(dso->nsinfo); > - pthread_mutex_destroy(&dso->lock); > + mutex_destroy(&dso->lock); > free(dso); > } > > diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h > index 66981c7a9a18..58d94175e714 100644 > --- a/tools/perf/util/dso.h > +++ b/tools/perf/util/dso.h > @@ -2,7 +2,6 @@ > #ifndef __PERF_DSO > #define __PERF_DSO > > -#include <pthread.h> > #include <linux/refcount.h> > #include <linux/types.h> > #include <linux/rbtree.h> > @@ -11,6 +10,7 @@ > #include <stdio.h> > #include <linux/bitops.h> > #include "build-id.h" > +#include "mutex.h" > > struct machine; > struct map; > @@ -145,7 +145,7 @@ struct dso_cache { > struct auxtrace_cache; > > struct dso { > - pthread_mutex_t lock; > + struct mutex lock; > struct list_head node; > struct rb_node rb_node; /* rbtree node sorted by long name */ > struct rb_root *root; /* root of rbtree that rb_node is in */ > diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c > index a4b22caa7c24..656d9b4dd456 100644 > --- a/tools/perf/util/symbol.c > +++ b/tools/perf/util/symbol.c > @@ -1800,7 +1800,7 @@ int dso__load(struct dso *dso, struct map *map) > } > > nsinfo__mountns_enter(dso->nsinfo, &nsc); > - pthread_mutex_lock(&dso->lock); > + mutex_lock(&dso->lock); > > /* check again under the dso->lock */ > if (dso__loaded(dso)) { > @@ -1964,7 +1964,7 @@ int dso__load(struct dso *dso, struct map *map) > ret = 0; > out: > dso__set_loaded(dso); > - pthread_mutex_unlock(&dso->lock); > + mutex_unlock(&dso->lock); > nsinfo__mountns_exit(&nsc); > > return ret;
On Fri, Aug 26, 2022 at 3:37 AM Adrian Hunter <adrian.hunter@intel.com> wrote: > > On 24/08/22 18:38, Ian Rogers wrote: > > Switch to the use of mutex wrappers that provide better error checking. > > > > Signed-off-by: Ian Rogers <irogers@google.com> > > --- > > tools/perf/util/dso.c | 12 ++++++------ > > Some not done yet > > $ grep -i pthread_mut tools/perf/util/dso.c > static pthread_mutex_t dso__data_open_lock = PTHREAD_MUTEX_INITIALIZER; > pthread_mutex_lock(&dso__data_open_lock); > pthread_mutex_unlock(&dso__data_open_lock); > if (pthread_mutex_lock(&dso__data_open_lock) < 0) > pthread_mutex_unlock(&dso__data_open_lock); > pthread_mutex_unlock(&dso__data_open_lock); > pthread_mutex_lock(&dso__data_open_lock); > pthread_mutex_unlock(&dso__data_open_lock); > pthread_mutex_lock(&dso__data_open_lock); > pthread_mutex_unlock(&dso__data_open_lock); Yes, these are all solely dso__data_open_lock that lacks any clear init/exit code to place the initialization/destruction hooks onto. I don't plan to alter these in this patch set. Thanks, Ian > > > tools/perf/util/dso.h | 4 ++-- > > tools/perf/util/symbol.c | 4 ++-- > > 3 files changed, 10 insertions(+), 10 deletions(-) > > > > diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c > > index 5ac13958d1bd..a9789a955403 100644 > > --- a/tools/perf/util/dso.c > > +++ b/tools/perf/util/dso.c > > @@ -795,7 +795,7 @@ dso_cache__free(struct dso *dso) > > struct rb_root *root = &dso->data.cache; > > struct rb_node *next = rb_first(root); > > > > - pthread_mutex_lock(&dso->lock); > > + mutex_lock(&dso->lock); > > while (next) { > > struct dso_cache *cache; > > > > @@ -804,7 +804,7 @@ dso_cache__free(struct dso *dso) > > rb_erase(&cache->rb_node, root); > > free(cache); > > } > > - pthread_mutex_unlock(&dso->lock); > > + mutex_unlock(&dso->lock); > > } > > > > static struct dso_cache *__dso_cache__find(struct dso *dso, u64 offset) > > @@ -841,7 +841,7 @@ dso_cache__insert(struct dso *dso, struct dso_cache *new) > > struct dso_cache *cache; > > u64 offset = new->offset; > > > > - pthread_mutex_lock(&dso->lock); > > + mutex_lock(&dso->lock); > > while (*p != NULL) { > > u64 end; > > > > @@ -862,7 +862,7 @@ dso_cache__insert(struct dso *dso, struct dso_cache *new) > > > > cache = NULL; > > out: > > - pthread_mutex_unlock(&dso->lock); > > + mutex_unlock(&dso->lock); > > return cache; > > } > > > > @@ -1297,7 +1297,7 @@ struct dso *dso__new_id(const char *name, struct dso_id *id) > > dso->root = NULL; > > INIT_LIST_HEAD(&dso->node); > > INIT_LIST_HEAD(&dso->data.open_entry); > > - pthread_mutex_init(&dso->lock, NULL); > > + mutex_init(&dso->lock); > > refcount_set(&dso->refcnt, 1); > > } > > > > @@ -1336,7 +1336,7 @@ void dso__delete(struct dso *dso) > > dso__free_a2l(dso); > > zfree(&dso->symsrc_filename); > > nsinfo__zput(dso->nsinfo); > > - pthread_mutex_destroy(&dso->lock); > > + mutex_destroy(&dso->lock); > > free(dso); > > } > > > > diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h > > index 66981c7a9a18..58d94175e714 100644 > > --- a/tools/perf/util/dso.h > > +++ b/tools/perf/util/dso.h > > @@ -2,7 +2,6 @@ > > #ifndef __PERF_DSO > > #define __PERF_DSO > > > > -#include <pthread.h> > > #include <linux/refcount.h> > > #include <linux/types.h> > > #include <linux/rbtree.h> > > @@ -11,6 +10,7 @@ > > #include <stdio.h> > > #include <linux/bitops.h> > > #include "build-id.h" > > +#include "mutex.h" > > > > struct machine; > > struct map; > > @@ -145,7 +145,7 @@ struct dso_cache { > > struct auxtrace_cache; > > > > struct dso { > > - pthread_mutex_t lock; > > + struct mutex lock; > > struct list_head node; > > struct rb_node rb_node; /* rbtree node sorted by long name */ > > struct rb_root *root; /* root of rbtree that rb_node is in */ > > diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c > > index a4b22caa7c24..656d9b4dd456 100644 > > --- a/tools/perf/util/symbol.c > > +++ b/tools/perf/util/symbol.c > > @@ -1800,7 +1800,7 @@ int dso__load(struct dso *dso, struct map *map) > > } > > > > nsinfo__mountns_enter(dso->nsinfo, &nsc); > > - pthread_mutex_lock(&dso->lock); > > + mutex_lock(&dso->lock); > > > > /* check again under the dso->lock */ > > if (dso__loaded(dso)) { > > @@ -1964,7 +1964,7 @@ int dso__load(struct dso *dso, struct map *map) > > ret = 0; > > out: > > dso__set_loaded(dso); > > - pthread_mutex_unlock(&dso->lock); > > + mutex_unlock(&dso->lock); > > nsinfo__mountns_exit(&nsc); > > > > return ret; >
On 26/08/22 19:05, Ian Rogers wrote: > On Fri, Aug 26, 2022 at 3:37 AM Adrian Hunter <adrian.hunter@intel.com> wrote: >> >> On 24/08/22 18:38, Ian Rogers wrote: >>> Switch to the use of mutex wrappers that provide better error checking. >>> >>> Signed-off-by: Ian Rogers <irogers@google.com> >>> --- >>> tools/perf/util/dso.c | 12 ++++++------ >> >> Some not done yet >> >> $ grep -i pthread_mut tools/perf/util/dso.c >> static pthread_mutex_t dso__data_open_lock = PTHREAD_MUTEX_INITIALIZER; >> pthread_mutex_lock(&dso__data_open_lock); >> pthread_mutex_unlock(&dso__data_open_lock); >> if (pthread_mutex_lock(&dso__data_open_lock) < 0) >> pthread_mutex_unlock(&dso__data_open_lock); >> pthread_mutex_unlock(&dso__data_open_lock); >> pthread_mutex_lock(&dso__data_open_lock); >> pthread_mutex_unlock(&dso__data_open_lock); >> pthread_mutex_lock(&dso__data_open_lock); >> pthread_mutex_unlock(&dso__data_open_lock); > > Yes, these are all solely dso__data_open_lock that lacks any clear > init/exit code to place the initialization/destruction hooks onto. I > don't plan to alter these in this patch set. Perhaps that could be explained in the change log. But why not just add init / exit code. Could be called out of main(), or maybe use __attribute__((constructor)) / __attribute__((destructor))
On Fri, Aug 26, 2022 at 10:34 AM Adrian Hunter <adrian.hunter@intel.com> wrote: > > On 26/08/22 19:05, Ian Rogers wrote: > > On Fri, Aug 26, 2022 at 3:37 AM Adrian Hunter <adrian.hunter@intel.com> wrote: > >> > >> On 24/08/22 18:38, Ian Rogers wrote: > >>> Switch to the use of mutex wrappers that provide better error checking. > >>> > >>> Signed-off-by: Ian Rogers <irogers@google.com> > >>> --- > >>> tools/perf/util/dso.c | 12 ++++++------ > >> > >> Some not done yet > >> > >> $ grep -i pthread_mut tools/perf/util/dso.c > >> static pthread_mutex_t dso__data_open_lock = PTHREAD_MUTEX_INITIALIZER; > >> pthread_mutex_lock(&dso__data_open_lock); > >> pthread_mutex_unlock(&dso__data_open_lock); > >> if (pthread_mutex_lock(&dso__data_open_lock) < 0) > >> pthread_mutex_unlock(&dso__data_open_lock); > >> pthread_mutex_unlock(&dso__data_open_lock); > >> pthread_mutex_lock(&dso__data_open_lock); > >> pthread_mutex_unlock(&dso__data_open_lock); > >> pthread_mutex_lock(&dso__data_open_lock); > >> pthread_mutex_unlock(&dso__data_open_lock); > > > > Yes, these are all solely dso__data_open_lock that lacks any clear > > init/exit code to place the initialization/destruction hooks onto. I > > don't plan to alter these in this patch set. > > Perhaps that could be explained in the change log. > > But why not just add init / exit code. Could be called out > of main(), or maybe use __attribute__((constructor)) / > __attribute__((destructor)) Because the lock is global and not part of the dso. Thanks, Ian
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index 5ac13958d1bd..a9789a955403 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c @@ -795,7 +795,7 @@ dso_cache__free(struct dso *dso) struct rb_root *root = &dso->data.cache; struct rb_node *next = rb_first(root); - pthread_mutex_lock(&dso->lock); + mutex_lock(&dso->lock); while (next) { struct dso_cache *cache; @@ -804,7 +804,7 @@ dso_cache__free(struct dso *dso) rb_erase(&cache->rb_node, root); free(cache); } - pthread_mutex_unlock(&dso->lock); + mutex_unlock(&dso->lock); } static struct dso_cache *__dso_cache__find(struct dso *dso, u64 offset) @@ -841,7 +841,7 @@ dso_cache__insert(struct dso *dso, struct dso_cache *new) struct dso_cache *cache; u64 offset = new->offset; - pthread_mutex_lock(&dso->lock); + mutex_lock(&dso->lock); while (*p != NULL) { u64 end; @@ -862,7 +862,7 @@ dso_cache__insert(struct dso *dso, struct dso_cache *new) cache = NULL; out: - pthread_mutex_unlock(&dso->lock); + mutex_unlock(&dso->lock); return cache; } @@ -1297,7 +1297,7 @@ struct dso *dso__new_id(const char *name, struct dso_id *id) dso->root = NULL; INIT_LIST_HEAD(&dso->node); INIT_LIST_HEAD(&dso->data.open_entry); - pthread_mutex_init(&dso->lock, NULL); + mutex_init(&dso->lock); refcount_set(&dso->refcnt, 1); } @@ -1336,7 +1336,7 @@ void dso__delete(struct dso *dso) dso__free_a2l(dso); zfree(&dso->symsrc_filename); nsinfo__zput(dso->nsinfo); - pthread_mutex_destroy(&dso->lock); + mutex_destroy(&dso->lock); free(dso); } diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h index 66981c7a9a18..58d94175e714 100644 --- a/tools/perf/util/dso.h +++ b/tools/perf/util/dso.h @@ -2,7 +2,6 @@ #ifndef __PERF_DSO #define __PERF_DSO -#include <pthread.h> #include <linux/refcount.h> #include <linux/types.h> #include <linux/rbtree.h> @@ -11,6 +10,7 @@ #include <stdio.h> #include <linux/bitops.h> #include "build-id.h" +#include "mutex.h" struct machine; struct map; @@ -145,7 +145,7 @@ struct dso_cache { struct auxtrace_cache; struct dso { - pthread_mutex_t lock; + struct mutex lock; struct list_head node; struct rb_node rb_node; /* rbtree node sorted by long name */ struct rb_root *root; /* root of rbtree that rb_node is in */ diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index a4b22caa7c24..656d9b4dd456 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c @@ -1800,7 +1800,7 @@ int dso__load(struct dso *dso, struct map *map) } nsinfo__mountns_enter(dso->nsinfo, &nsc); - pthread_mutex_lock(&dso->lock); + mutex_lock(&dso->lock); /* check again under the dso->lock */ if (dso__loaded(dso)) { @@ -1964,7 +1964,7 @@ int dso__load(struct dso *dso, struct map *map) ret = 0; out: dso__set_loaded(dso); - pthread_mutex_unlock(&dso->lock); + mutex_unlock(&dso->lock); nsinfo__mountns_exit(&nsc); return ret;
Switch to the use of mutex wrappers that provide better error checking. Signed-off-by: Ian Rogers <irogers@google.com> --- tools/perf/util/dso.c | 12 ++++++------ tools/perf/util/dso.h | 4 ++-- tools/perf/util/symbol.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-)