diff mbox

[3.19.y-ckt,128/128] sched/wait: Fix signal handling in bit wait helpers

Message ID 1450287568-19808-129-git-send-email-kamal@canonical.com
State New
Headers show

Commit Message

Kamal Mostafa Dec. 16, 2015, 5:39 p.m. UTC
3.19.8-ckt12 -stable review patch.  If anyone has any objections, please let me know.

------------------

From: Peter Zijlstra <peterz@infradead.org>

commit 68985633bccb6066bf1803e316fbc6c1f5b796d6 upstream.

Vladimir reported getting RCU stall warnings and bisected it back to
commit:

  743162013d40 ("sched: Remove proliferation of wait_on_bit() action functions")

That commit inadvertently reversed the calls to schedule() and signal_pending(),
thereby not handling the case where the signal receives while we sleep.

Reported-by: Vladimir Murzin <vladimir.murzin@arm.com>
Tested-by: Vladimir Murzin <vladimir.murzin@arm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: mark.rutland@arm.com
Cc: neilb@suse.de
Cc: oleg@redhat.com
Fixes: 743162013d40 ("sched: Remove proliferation of wait_on_bit() action functions")
Fixes: cbbce8220949 ("SCHED: add some "wait..on_bit...timeout()" interfaces.")
Link: http://lkml.kernel.org/r/20151201130404.GL3816@twins.programming.kicks-ass.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
---
 kernel/sched/wait.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

Comments

Linus Torvalds Dec. 16, 2015, 5:44 p.m. UTC | #1
This one was completely buggy. Make sure you get the fix to the fix too.

   Linus
Oleg Nesterov Dec. 16, 2015, 5:57 p.m. UTC | #2
On 12/16, Kamal Mostafa wrote:
>
> 3.19.8-ckt12 -stable review patch.  If anyone has any objections, please let me know.
>
>
> commit 68985633bccb6066bf1803e316fbc6c1f5b796d6 upstream.

Please note that this patch is wrong without the next fix from Peter.

And in fact to me it is still not clear whether we really want to do
this, this probably needs more investigation.

Oleg.
Kamal Mostafa Dec. 16, 2015, 6:07 p.m. UTC | #3
On Wed, 2015-12-16 at 18:57 +0100, Oleg Nesterov wrote:
> On 12/16, Kamal Mostafa wrote:
> >
> > 3.19.8-ckt12 -stable review patch.  If anyone has any objections, please let me know.
> >
> >
> > commit 68985633bccb6066bf1803e316fbc6c1f5b796d6 upstream.
> 
> Please note that this patch is wrong without the next fix from Peter.
> 
> And in fact to me it is still not clear whether we really want to do
> this, this probably needs more investigation.
> 
> Oleg.
> 

Thanks for the heads-up, Linus and Oleg.  I'll just hold both of them
out of 3.19-stable until the dust settles.

Deferred until next 3.19 cycle:

6898563 sched/wait: Fix signal handling in bit wait helpers
dfd01f0 sched/wait: Fix the signal handling fix

 -Kamal
diff mbox

Patch

diff --git a/kernel/sched/wait.c b/kernel/sched/wait.c
index 852143a..e0bb7e6 100644
--- a/kernel/sched/wait.c
+++ b/kernel/sched/wait.c
@@ -583,18 +583,18 @@  EXPORT_SYMBOL(wake_up_atomic_t);
 
 __sched int bit_wait(struct wait_bit_key *word)
 {
-	if (signal_pending_state(current->state, current))
-		return 1;
 	schedule();
+	if (signal_pending(current))
+		return -EINTR;
 	return 0;
 }
 EXPORT_SYMBOL(bit_wait);
 
 __sched int bit_wait_io(struct wait_bit_key *word)
 {
-	if (signal_pending_state(current->state, current))
-		return 1;
 	io_schedule();
+	if (signal_pending(current))
+		return -EINTR;
 	return 0;
 }
 EXPORT_SYMBOL(bit_wait_io);
@@ -602,11 +602,11 @@  EXPORT_SYMBOL(bit_wait_io);
 __sched int bit_wait_timeout(struct wait_bit_key *word)
 {
 	unsigned long now = ACCESS_ONCE(jiffies);
-	if (signal_pending_state(current->state, current))
-		return 1;
 	if (time_after_eq(now, word->timeout))
 		return -EAGAIN;
 	schedule_timeout(word->timeout - now);
+	if (signal_pending(current))
+		return -EINTR;
 	return 0;
 }
 EXPORT_SYMBOL_GPL(bit_wait_timeout);
@@ -614,11 +614,11 @@  EXPORT_SYMBOL_GPL(bit_wait_timeout);
 __sched int bit_wait_io_timeout(struct wait_bit_key *word)
 {
 	unsigned long now = ACCESS_ONCE(jiffies);
-	if (signal_pending_state(current->state, current))
-		return 1;
 	if (time_after_eq(now, word->timeout))
 		return -EAGAIN;
 	io_schedule_timeout(word->timeout - now);
+	if (signal_pending(current))
+		return -EINTR;
 	return 0;
 }
 EXPORT_SYMBOL_GPL(bit_wait_io_timeout);