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>,
Clark Williams <clark.williams@gmail.com>,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Subject: [PATCH RT 2/3] swait: Add memory barrier before checking list empty
Date: Mon, 19 Aug 2013 11:35:32 -0400 [thread overview]
Message-ID: <20130819153618.983248997@goodmis.org> (raw)
In-Reply-To: 20130819153530.409041534@goodmis.org
[-- Attachment #1: 0002-swait-Add-memory-barrier-before-checking-list-empty.patch --]
[-- Type: text/plain, Size: 1587 bytes --]
From: Steven Rostedt <rostedt@goodmis.org>
There's a race condition with swait wakeups and adding to the list. The
__swait_wake() does a check for swait_head_has_waiters(), and if it is
empty it will exit without doing any wake ups. The problem is that the
check does not include any memory barriers before it makes a decision
to wake up or not.
CPU0 CPU1
---- ----
condition = 1
load h->list (is empty)
raw_spin_lock(hlist->lock)
hlist_add();
__set_current_state();
raw_spin_unlock(hlist->lock)
swait_wake()
swait_head_has_waiters()
(sees h->list as empty and returns)
check_condition (sees condition = 0)
store condition = 1
schedule()
Now the task on CPU1 has just missed its wakeup. By adding a memory
barrier before the list empty check, we fix the problem of miss seeing
the list not empty as well as pushing out the condition for the other
task to see.
Reviewed-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
kernel/wait-simple.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/kernel/wait-simple.c b/kernel/wait-simple.c
index 4b9a0b5..9725a11 100644
--- a/kernel/wait-simple.c
+++ b/kernel/wait-simple.c
@@ -27,6 +27,8 @@ static inline void __swait_dequeue(struct swaiter *w)
/* Check whether a head has waiters enqueued */
static inline bool swait_head_has_waiters(struct swait_head *h)
{
+ /* Make sure the condition is visible before checking list_empty() */
+ smp_mb();
return !list_empty(&h->list);
}
--
1.7.10.4
next prev parent reply other threads:[~2013-08-19 15:36 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-19 15:35 [PATCH RT 0/3] rt/rcu/swait: Fix boot up when RCU NOCB_ALL is enabled Steven Rostedt
2013-08-19 15:35 ` [PATCH RT 1/3] rcu/swait: Fix RCU conversion of wake_up_all() to swait_wake() Steven Rostedt
2013-08-19 15:35 ` Steven Rostedt [this message]
2013-08-19 15:51 ` [PATCH RT 2/3] swait: Add memory barrier before checking list empty Steven Rostedt
2013-08-19 16:49 ` Steven Rostedt
2013-08-19 15:35 ` [PATCH RT 3/3] swait: Add smp_mb() after setting h->list Steven Rostedt
2013-08-21 13:41 ` [PATCH RT 0/3] rt/rcu/swait: Fix boot up when RCU NOCB_ALL is enabled Sebastian Andrzej Siewior
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=20130819153618.983248997@goodmis.org \
--to=rostedt@goodmis.org \
--cc=C.Emde@osadl.org \
--cc=bigeasy@linutronix.de \
--cc=clark.williams@gmail.com \
--cc=jkacur@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rt-users@vger.kernel.org \
--cc=paulmck@linux.vnet.ibm.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox