locking/ww_mutex: Abstract out waiter enqueueing
authorPeter Zijlstra <peterz@infradead.org>
Sun, 15 Aug 2021 21:28:47 +0000 (23:28 +0200)
committerIngo Molnar <mingo@kernel.org>
Tue, 17 Aug 2021 17:04:54 +0000 (19:04 +0200)
The upcoming rtmutex based ww_mutex needs a different handling for
enqueueing a waiter. Split it out into a helper function.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20210815211304.566318143@linutronix.de
kernel/locking/ww_mutex.h

index 1cd178c..f5aaf2f 100644 (file)
@@ -44,6 +44,15 @@ __ww_waiter_last(struct mutex *lock)
        return w;
 }
 
+static inline void
+__ww_waiter_add(struct mutex *lock, struct mutex_waiter *waiter, struct mutex_waiter *pos)
+{
+       struct list_head *p = &lock->wait_list;
+       if (pos)
+               p = &pos->list;
+       __mutex_add_waiter(lock, waiter, p);
+}
+
 /*
  * Wait-Die:
  *   The newer transactions are killed when:
@@ -337,12 +346,11 @@ __ww_mutex_add_waiter(struct mutex_waiter *waiter,
                      struct mutex *lock,
                      struct ww_acquire_ctx *ww_ctx)
 {
-       struct mutex_waiter *cur;
-       struct list_head *pos;
+       struct mutex_waiter *cur, *pos = NULL;
        bool is_wait_die;
 
        if (!ww_ctx) {
-               __mutex_add_waiter(lock, waiter, &lock->wait_list);
+               __ww_waiter_add(lock, waiter, NULL);
                return 0;
        }
 
@@ -355,7 +363,6 @@ __ww_mutex_add_waiter(struct mutex_waiter *waiter,
         * never die here, but they are sorted in stamp order and
         * may wound the lock holder.
         */
-       pos = &lock->wait_list;
        for (cur = __ww_waiter_last(lock); cur;
             cur = __ww_waiter_prev(lock, cur)) {
 
@@ -378,13 +385,13 @@ __ww_mutex_add_waiter(struct mutex_waiter *waiter,
                        break;
                }
 
-               pos = &cur->list;
+               pos = cur;
 
                /* Wait-Die: ensure younger waiters die. */
                __ww_mutex_die(lock, cur, ww_ctx);
        }
 
-       __mutex_add_waiter(lock, waiter, pos);
+       __ww_waiter_add(lock, waiter, pos);
 
        /*
         * Wound-Wait: if we're blocking on a mutex owned by a younger context,