From: Darren Hart <dvhltc@us.ibm.com>
To: linux-kernel@vger.kernel.org
Cc: Darren Hart <dvhltc@us.ibm.com>,
Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@elte.hu>,
Peter Zijlstra <peterz@infradead.org>,
Rusty Russell <rusty@rustcorp.com.au>
Subject: [PATCH 2/2] RFC: Fix futex_lock_pi fault handling (NOT FOR INCLUSION)
Date: Thu, 08 Jan 2009 23:52:28 -0800 [thread overview]
Message-ID: <20090109075228.2226.33551.stgit@Aeon> (raw)
In-Reply-To: <20090109075148.2226.5222.stgit@Aeon>
Regardless of whether we call get_user or futex_handle_fault to deal with a
fault, the uaddr doesn't change, so the key won't change. There doesn't appear
to be a reason to re-get the key after a get_user call, but not after a
futex_handle_fault. This patch moves both jump points to right after the the
get_futex_key call. Also fix a missed put_futex_key() call and update the
comment to accurately depict the current code (we don't hold the mm sem now).
Signed-off-by: Darren Hart <dvhltc@us.ibm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rusty Russell <rusty@rustcorp.com.au>
---
kernel/futex.c | 17 ++++++++---------
1 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/kernel/futex.c b/kernel/futex.c
index c15c029..cd03229 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -1351,13 +1351,13 @@ static int futex_lock_pi(u32 __user *uaddr, int fshared,
}
q.pi_state = NULL;
-retry:
+
q.key = FUTEX_KEY_INIT;
ret = get_futex_key(uaddr, fshared, &q.key);
if (unlikely(ret != 0))
goto out;
-retry_unlocked:
+retry:
hb = queue_lock(&q);
retry_locked:
@@ -1566,19 +1566,18 @@ out:
uaddr_faulted:
/*
- * We have to r/w *(int __user *)uaddr, and we have to modify it
- * atomically. Therefore, if we continue to fault after get_user()
- * below, we need to handle the fault ourselves, while still holding
- * the mmap_sem. This can occur if the uaddr is under contention as
- * we have to drop the mmap_sem in order to call get_user().
+ * We need to read and write *(int __user *)uaddr2 atomically.
+ * Therefore, if get_user below is not enough, we need to
+ * handle the fault ourselves.
*/
queue_unlock(&q, hb);
+ put_futex_key(fshared, &q.key);
if (attempt++) {
ret = futex_handle_fault((unsigned long)uaddr, attempt);
if (ret)
- goto out_put_key;
- goto retry_unlocked;
+ goto out;
+ goto retry;
}
ret = get_user(uval, uaddr);
next prev parent reply other threads:[~2009-01-09 7:53 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-09 7:52 [PATCH] RFC: futex fault handling and futex key references (NOT FOR INCLUSION) Darren Hart
2009-01-09 7:52 ` [PATCH 1/2] RFC: Fix futex_wake_op fault handling " Darren Hart
2009-01-09 7:52 ` Darren Hart [this message]
2009-01-09 22:02 ` [PATCH] RFC: futex fault handling and futex key references " Peter Zijlstra
2009-01-10 5:54 ` Darren Hart
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090109075228.2226.33551.stgit@Aeon \
--to=dvhltc@us.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=peterz@infradead.org \
--cc=rusty@rustcorp.com.au \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.