From: Steven Rostedt <rostedt@goodmis.org>
To: linux-kernel@vger.kernel.org,
linux-rt-users <linux-rt-users@vger.kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>,
Carsten Emde <C.Emde@osadl.org>,
Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
John Kacur <jkacur@redhat.com>,
Paul Gortmaker <paul.gortmaker@windriver.com>,
Julia Cartwright <julia@ni.com>,
Daniel Wagner <daniel.wagner@siemens.com>,
tom.zanussi@linux.intel.com, Alex Shi <alex.shi@linaro.org>,
stable-rt@vger.kernel.org,
Mathias Koehrer <mathias.koehrer@etas.com>,
David Hauck <davidh@netacquire.com>
Subject: [PATCH RT 03/13] sched: Prevent task state corruption by spurious lock wakeup
Date: Wed, 17 Jan 2018 10:14:07 -0500 [thread overview]
Message-ID: <20180117151430.956597206@goodmis.org> (raw)
In-Reply-To: 20180117151404.093229667@goodmis.org
[-- Attachment #1: 0003-sched-Prevent-task-state-corruption-by-spurious-lock.patch --]
[-- Type: text/plain, Size: 2756 bytes --]
3.18.91-rt98-rc1 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <tglx@linutronix.de>
Mathias and others reported GDB failures on RT.
The following scenario leads to task state corruption:
CPU0 CPU1
T1->state = TASK_XXX;
spin_lock(&lock)
rt_spin_lock_slowlock(&lock->rtmutex)
raw_spin_lock(&rtm->wait_lock);
T1->saved_state = current->state;
T1->state = TASK_UNINTERRUPTIBLE;
spin_unlock(&lock)
task_blocks_on_rt_mutex(rtm) rt_spin_lock_slowunlock(&lock->rtmutex)
queue_waiter(rtm) raw_spin_lock(&rtm->wait_lock);
pi_chain_walk(rtm)
raw_spin_unlock(&rtm->wait_lock);
wake_top_waiter(T1)
raw_spin_lock(&rtm->wait_lock);
for (;;) {
if (__try_to_take_rt_mutex()) <- Succeeds
break;
...
}
T1->state = T1->saved_state;
try_to_wake_up(T1)
ttwu_do_wakeup(T1)
T1->state = TASK_RUNNING;
In most cases this is harmless because waiting for some event, which is the
usual reason for TASK_[UN]INTERRUPTIBLE has to be safe against other forms
of spurious wakeups anyway.
But in case of TASK_TRACED this is actually fatal, because the task loses
the TASK_TRACED state. In consequence it fails to consume SIGSTOP which was
sent from the debugger and actually delivers SIGSTOP to the task which
breaks the ptrace mechanics and brings the debugger into an unexpected
state.
The TASK_TRACED state should prevent getting there due to the state
matching logic in try_to_wake_up(). But that's not true because
wake_up_lock_sleeper() uses TASK_ALL as state mask. That's bogus because
lock sleepers always use TASK_UNINTERRUPTIBLE, so the wakeup should use
that as well.
The cure is way simpler as figuring it out:
Change the mask used in wake_up_lock_sleeper() from TASK_ALL to
TASK_UNINTERRUPTIBLE.
Cc: stable-rt@vger.kernel.org
Reported-by: Mathias Koehrer <mathias.koehrer@etas.com>
Reported-by: David Hauck <davidh@netacquire.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
---
kernel/sched/core.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 2532e4f2d075..b606f31e5034 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -1923,7 +1923,7 @@ EXPORT_SYMBOL(wake_up_process);
*/
int wake_up_lock_sleeper(struct task_struct *p)
{
- return try_to_wake_up(p, TASK_ALL, WF_LOCK_SLEEPER);
+ return try_to_wake_up(p, TASK_UNINTERRUPTIBLE, WF_LOCK_SLEEPER);
}
int wake_up_state(struct task_struct *p, unsigned int state)
--
2.13.2
next prev parent reply other threads:[~2018-01-17 15:19 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-17 15:14 [PATCH RT 00/13] Linux 3.18.91-rt98-rc1 Steven Rostedt
2018-01-17 15:14 ` [PATCH RT 01/13] rtmutex: Make lock_killable work Steven Rostedt
2018-01-17 15:14 ` [PATCH RT 02/13] random: avoid preempt_disable()ed section Steven Rostedt
2018-01-17 15:14 ` Steven Rostedt [this message]
2018-01-17 15:14 ` [PATCH RT 04/13] fs: convert two more BH_Uptodate_Lock related bitspinlocks Steven Rostedt
2018-01-17 15:14 ` [PATCH RT 05/13] md/raid5: do not disable interrupts Steven Rostedt
2018-01-17 15:14 ` [PATCH RT 06/13] locking/rt-mutex: fix deadlock in device mapper / block-IO Steven Rostedt
2018-01-17 15:14 ` [PATCH RT 07/13] Revert "fs: jbd2: pull your plug when waiting for space" Steven Rostedt
2018-01-17 15:46 ` Sebastian Andrzej Siewior
2018-01-17 17:13 ` Steven Rostedt
2018-01-17 15:14 ` [PATCH RT 08/13] cpu_pm: replace raw_notifier to atomic_notifier Steven Rostedt
2018-01-17 15:14 ` [PATCH RT 09/13] kernel/hrtimer: migrate deferred timer on CPU down Steven Rostedt
2018-01-17 15:14 ` [PATCH RT 10/13] kernel/hrtimer/hotplug: dont wake ktimersoftd while holding the hrtimer base lock Steven Rostedt
2018-01-17 15:14 ` [PATCH RT 11/13] rt/locking: allow recursive local_trylock() Steven Rostedt
2018-01-17 15:14 ` [PATCH RT 12/13] net: use trylock in icmp_sk Steven Rostedt
2018-01-17 15:14 ` [PATCH RT 13/13] Linux 3.18.91-rt98-rc1 Steven Rostedt
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=20180117151430.956597206@goodmis.org \
--to=rostedt@goodmis.org \
--cc=C.Emde@osadl.org \
--cc=alex.shi@linaro.org \
--cc=bigeasy@linutronix.de \
--cc=daniel.wagner@siemens.com \
--cc=davidh@netacquire.com \
--cc=jkacur@redhat.com \
--cc=julia@ni.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rt-users@vger.kernel.org \
--cc=mathias.koehrer@etas.com \
--cc=paul.gortmaker@windriver.com \
--cc=stable-rt@vger.kernel.org \
--cc=tglx@linutronix.de \
--cc=tom.zanussi@linux.intel.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox