]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
futex: Simplify double_lock_hb()
authorPeter Zijlstra <peterz@infradead.org>
Thu, 23 Sep 2021 17:11:04 +0000 (14:11 -0300)
committerPeter Zijlstra <peterz@infradead.org>
Thu, 7 Oct 2021 11:51:11 +0000 (13:51 +0200)
We need to make sure that all requeue operations take the hash bucket
locks in the same order to avoid deadlock. Simplify the current
double_lock_hb implementation by making sure hb1 is always the
"smallest" bucket to avoid extra checks.

[André: Add commit description]
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: André Almeida <andrealmeid@collabora.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: André Almeida <andrealmeid@collabora.com>
Link: https://lore.kernel.org/r/20210923171111.300673-16-andrealmeid@collabora.com
kernel/futex/futex.h

index fe847f57dad572a4d7959fe36a5800a319b22e69..465f7bd5caef005406d7046432faf85378baa08f 100644 (file)
@@ -239,14 +239,12 @@ extern int fixup_pi_owner(u32 __user *uaddr, struct futex_q *q, int locked);
 static inline void
 double_lock_hb(struct futex_hash_bucket *hb1, struct futex_hash_bucket *hb2)
 {
-       if (hb1 <= hb2) {
-               spin_lock(&hb1->lock);
-               if (hb1 < hb2)
-                       spin_lock_nested(&hb2->lock, SINGLE_DEPTH_NESTING);
-       } else { /* hb1 > hb2 */
-               spin_lock(&hb2->lock);
-               spin_lock_nested(&hb1->lock, SINGLE_DEPTH_NESTING);
-       }
+       if (hb1 > hb2)
+               swap(hb1, hb2);
+
+       spin_lock(&hb1->lock);
+       if (hb1 != hb2)
+               spin_lock_nested(&hb2->lock, SINGLE_DEPTH_NESTING);
 }
 
 static inline void