[PATCH 4.2.y-ckt 68/93] futex: Acknowledge a new waiter in counter before plist

Kamal Mostafa kamal at canonical.com
Tue Apr 26 18:17:08 UTC 2016


4.2.8-ckt9 -stable review patch.  If anyone has any objections, please let me know.

---8<------------------------------------------------------------

From: Davidlohr Bueso <dave at stgolabs.net>

commit fe1bce9e2107ba3a8faffe572483b6974201a0e6 upstream.

Otherwise an incoming waker on the dest hash bucket can miss
the waiter adding itself to the plist during the lockless
check optimization (small window but still the correct way
of doing this); similarly to the decrement counterpart.

Suggested-by: Peter Zijlstra <peterz at infradead.org>
Signed-off-by: Davidlohr Bueso <dbueso at suse.de>
Cc: Davidlohr Bueso <dave at stgolabs.net>
Cc: bigeasy at linutronix.de
Cc: dvhart at infradead.org
Link: http://lkml.kernel.org/r/1461208164-29150-1-git-send-email-dave@stgolabs.net
Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
Signed-off-by: Kamal Mostafa <kamal at canonical.com>
---
 kernel/futex.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/futex.c b/kernel/futex.c
index df4203b2..02113e5 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -1395,8 +1395,8 @@ void requeue_futex(struct futex_q *q, struct futex_hash_bucket *hb1,
 	if (likely(&hb1->chain != &hb2->chain)) {
 		plist_del(&q->list, &hb1->chain);
 		hb_waiters_dec(hb1);
-		plist_add(&q->list, &hb2->chain);
 		hb_waiters_inc(hb2);
+		plist_add(&q->list, &hb2->chain);
 		q->lock_ptr = &hb2->lock;
 	}
 	get_futex_key_refs(key2);
-- 
2.7.4





More information about the kernel-team mailing list