[dm-devel] [PATCH 2/6] multipathd: track waiters for mutex_lock

Benjamin Marzinski bmarzins at redhat.com
Sat Jul 30 05:12:56 UTC 2022


use the uatomic operations to track how many threads are waiting in
lock() for mutex_locks. This will be used by a later patch.

Signed-off-by: Benjamin Marzinski <bmarzins at redhat.com>
---
 libmultipath/lock.h | 16 ++++++++++++++++
 multipathd/main.c   |  2 +-
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/libmultipath/lock.h b/libmultipath/lock.h
index d7b779e7..20ca77e6 100644
--- a/libmultipath/lock.h
+++ b/libmultipath/lock.h
@@ -2,17 +2,28 @@
 #define _LOCK_H
 
 #include <pthread.h>
+#include <urcu/uatomic.h>
+#include <stdbool.h>
 
 typedef void (wakeup_fn)(void);
 
 struct mutex_lock {
 	pthread_mutex_t mutex;
 	wakeup_fn *wakeup;
+	int waiters; /* uatomic access only */
 };
 
+static inline void init_lock(struct mutex_lock *a)
+{
+	pthread_mutex_init(&a->mutex, NULL);
+	uatomic_set(&a->waiters, 0);
+}
+
 static inline void lock(struct mutex_lock *a)
 {
+	uatomic_inc(&a->waiters);
 	pthread_mutex_lock(&a->mutex);
+	uatomic_dec(&a->waiters);
 }
 
 static inline int trylock(struct mutex_lock *a)
@@ -30,6 +41,11 @@ static inline void __unlock(struct mutex_lock *a)
 	pthread_mutex_unlock(&a->mutex);
 }
 
+static inline bool lock_has_waiters(struct mutex_lock *a)
+{
+	return (uatomic_read(&a->waiters) > 0);
+}
+
 #define lock_cleanup_pop(a) pthread_cleanup_pop(1)
 
 void cleanup_lock (void * data);
diff --git a/multipathd/main.c b/multipathd/main.c
index 2f2b9d4c..71079113 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -2940,7 +2940,7 @@ init_vecs (void)
 	if (!vecs)
 		return NULL;
 
-	pthread_mutex_init(&vecs->lock.mutex, NULL);
+	init_lock(&vecs->lock);
 
 	return vecs;
 }
-- 
2.17.2



More information about the dm-devel mailing list