| From fe1bce9e2107ba3a8faffe572483b6974201a0e6 Mon Sep 17 00:00:00 2001 |
| From: Davidlohr Bueso <dave@stgolabs.net> |
| Date: Wed, 20 Apr 2016 20:09:24 -0700 |
| Subject: futex: Acknowledge a new waiter in counter before plist |
| |
| From: Davidlohr Bueso <dave@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@infradead.org> |
| Signed-off-by: Davidlohr Bueso <dbueso@suse.de> |
| Cc: Davidlohr Bueso <dave@stgolabs.net> |
| Cc: bigeasy@linutronix.de |
| Cc: dvhart@infradead.org |
| Link: http://lkml.kernel.org/r/1461208164-29150-1-git-send-email-dave@stgolabs.net |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| kernel/futex.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/kernel/futex.c |
| +++ b/kernel/futex.c |
| @@ -1378,8 +1378,8 @@ void requeue_futex(struct futex_q *q, st |
| 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); |