linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Take over futex of dead task only if FUTEX_WAITERS is not set
@ 2012-10-11 14:52 Siddhesh Poyarekar
  2012-10-17  7:15 ` [PATCH RESEND] " Siddhesh Poyarekar
  0 siblings, 1 reply; 13+ messages in thread
From: Siddhesh Poyarekar @ 2012-10-11 14:52 UTC (permalink / raw)
  To: linux-kernel; +Cc: Thomas Gleixner, Darren Hart, Siddhesh Poyarekar

In futex_lock_pi_atomic, we consider that if the value in the futex
variable is 0 with additional flags, then it is safe for takeover
since the owner of the futex is dead.  However, when FUTEX_WAITERS is
set in the futex value, handle_futex_death calls futex_wake to wake up
one task. Hence the assumption in futex_lock_pi_atomic is not correct.
The correct assumption is that a futex may be considered safe for a
takeover if The FUTEX_OWNER_DIED bit is set, the TID bits are 0 and
the FUTEX_WAITERS bit is not set.

The race described above can be seen in the reproducer in the
following glibc bug report:

http://sourceware.org/bugzilla/show_bug.cgi?id=14076

Signed-off-by: Siddhesh Poyarekar <siddhesh.poyarekar@gmail.com>
---
 kernel/futex.c |    7 ++++++-
 1 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/kernel/futex.c b/kernel/futex.c
index 3717e7b..9aa2d5a 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -760,9 +760,14 @@ retry:
 	 * case. We also do an unconditional take over, when the owner
 	 * of the futex died.
 	 *
+	 * We do not take over the futex if FUTEX_WAITERS is set because we
+	 * could end up waking two tasks, the current one and the one that the
+	 * futex death event wakes in handle_futex_death.
+	 *
 	 * This is safe as we are protected by the hash bucket lock !
 	 */
-	if (unlikely(ownerdied || !(curval & FUTEX_TID_MASK))) {
+	if (unlikely(ownerdied ||
+			!(curval & (FUTEX_TID_MASK | FUTEX_WAITERS)))) {
 		/* Keep the OWNER_DIED bit */
 		newval = (curval & ~FUTEX_TID_MASK) | vpid;
 		ownerdied = 0;
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2012-11-01 21:35 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-10-11 14:52 [PATCH] Take over futex of dead task only if FUTEX_WAITERS is not set Siddhesh Poyarekar
2012-10-17  7:15 ` [PATCH RESEND] " Siddhesh Poyarekar
2012-10-22  3:20   ` [PATCH] [RESEND 2] " Siddhesh Poyarekar
2012-10-23 14:04     ` Darren Hart
2012-10-23 20:29       ` Thomas Gleixner
2012-10-24 12:48         ` Siddhesh Poyarekar
2012-10-24 18:08           ` Thomas Gleixner
2012-10-25  4:36             ` Darren Hart
2012-10-25  4:44               ` Siddhesh Poyarekar
2012-10-25  4:33         ` Darren Hart
2012-10-25  8:14           ` Thomas Gleixner
2012-10-25  8:18             ` Darren Hart
2012-11-01 21:35         ` [tip:core/urgent] futex: Handle futex_pi OWNER_DIED take over correctly tip-bot for Thomas Gleixner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).