[PATCH v2 2/4] perf dso: Make lock error check and add BUG_ONs

From: Ian Rogers
Date: Tue Jan 25 2022 - 15:46:49 EST


Make the pthread mutex on dso use the error check type. This allows
deadlock checking via the return type. Assert the returned value from
mutex lock is always 0.

Signed-off-by: Ian Rogers <irogers@xxxxxxxxxx>
---
tools/perf/util/dso.c | 12 +++++++++---
tools/perf/util/symbol.c | 2 +-
2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
index 9cc8a1772b4b..6beccffeef7b 100644
--- a/tools/perf/util/dso.c
+++ b/tools/perf/util/dso.c
@@ -784,7 +784,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);
+ BUG_ON(pthread_mutex_lock(&dso->lock) != 0);
while (next) {
struct dso_cache *cache;

@@ -830,7 +830,7 @@ dso_cache__insert(struct dso *dso, struct dso_cache *new)
struct dso_cache *cache;
u64 offset = new->offset;

- pthread_mutex_lock(&dso->lock);
+ BUG_ON(pthread_mutex_lock(&dso->lock) != 0);
while (*p != NULL) {
u64 end;

@@ -1259,6 +1259,8 @@ struct dso *dso__new_id(const char *name, struct dso_id *id)
struct dso *dso = calloc(1, sizeof(*dso) + strlen(name) + 1);

if (dso != NULL) {
+ pthread_mutexattr_t lock_attr;
+
strcpy(dso->name, name);
if (id)
dso->id = *id;
@@ -1286,8 +1288,12 @@ 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);
+ pthread_mutexattr_init(&lock_attr);
+ pthread_mutexattr_settype(&lock_attr, PTHREAD_MUTEX_ERRORCHECK);
+ pthread_mutex_init(&dso->lock, &lock_attr);
+ pthread_mutexattr_destroy(&lock_attr);
refcount_set(&dso->refcnt, 1);
+
}

return dso;
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index b2ed3140a1fa..43f47532696f 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -1783,7 +1783,7 @@ int dso__load(struct dso *dso, struct map *map)
}

nsinfo__mountns_enter(dso->nsinfo, &nsc);
- pthread_mutex_lock(&dso->lock);
+ BUG_ON(pthread_mutex_lock(&dso->lock) != 0);

/* check again under the dso->lock */
if (dso__loaded(dso)) {
--
2.35.0.rc0.227.g00780c9af4-goog