All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] sched: Teach might_sleep about preemptable rcu
@ 2009-12-14 22:44 Frederic Weisbecker
  2009-12-14 23:03 ` Paul E. McKenney
  2009-12-16  8:18 ` [tip:sched/urgent] sched: Teach might_sleep() about preemptible RCU tip-bot for Frederic Weisbecker
  0 siblings, 2 replies; 13+ messages in thread
From: Frederic Weisbecker @ 2009-12-14 22:44 UTC (permalink / raw)
  To: Ingo Molnar; +Cc: LKML, Frederic Weisbecker, Paul E. McKenney, Peter Zijlstra

In practice, it is harmless to voluntarily sleep in a rcu_read_lock()
section if we are running under preempt rcu, but it is illegal because
if we build a kernel running non-preemptable rcu.

Currently, might_sleep() doesn't notice sleepable operations under
rcu_read_lock() sections if we are running under preemptable rcu
because preempt_count() is left untouched after rcu_read_lock() in
this case. But we want developers who test their changes under such
config to notice the "sleeping while atomic" issues.

Then we add rcu_read_lock_nesting to prempt_count() in might_sleep()
checks.

Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
---
 include/linux/rcutree.h |   11 +++++++++++
 kernel/sched.c          |    2 +-
 2 files changed, 12 insertions(+), 1 deletions(-)

diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h
index c93eee5..8044b1b 100644
--- a/include/linux/rcutree.h
+++ b/include/linux/rcutree.h
@@ -45,6 +45,12 @@ extern void __rcu_read_unlock(void);
 extern void synchronize_rcu(void);
 extern void exit_rcu(void);
 
+/*
+ * Defined as macro as it is a very low level header
+ * included from areas that don't even know about current
+ */
+#define rcu_preempt_depth() (current->rcu_read_lock_nesting)
+
 #else /* #ifdef CONFIG_TREE_PREEMPT_RCU */
 
 static inline void __rcu_read_lock(void)
@@ -63,6 +69,11 @@ static inline void exit_rcu(void)
 {
 }
 
+static inline int rcu_preempt_depth(void)
+{
+	return 0;
+}
+
 #endif /* #else #ifdef CONFIG_TREE_PREEMPT_RCU */
 
 static inline void __rcu_read_lock_bh(void)
diff --git a/kernel/sched.c b/kernel/sched.c
index ab42754..586c82c 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -9658,7 +9658,7 @@ void __init sched_init(void)
 #ifdef CONFIG_DEBUG_SPINLOCK_SLEEP
 static inline int preempt_count_equals(int preempt_offset)
 {
-	int nested = preempt_count() & ~PREEMPT_ACTIVE;
+	int nested = (preempt_count() & ~PREEMPT_ACTIVE) + rcu_preempt_depth();
 
 	return (nested == PREEMPT_INATOMIC_BASE + preempt_offset);
 }
-- 
1.6.2.3


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

end of thread, other threads:[~2009-12-17 19:49 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-12-14 22:44 [PATCH] sched: Teach might_sleep about preemptable rcu Frederic Weisbecker
2009-12-14 23:03 ` Paul E. McKenney
2009-12-16  8:18 ` [tip:sched/urgent] sched: Teach might_sleep() about preemptible RCU tip-bot for Frederic Weisbecker
2009-12-16 14:25   ` Ingo Molnar
2009-12-16 15:30     ` Paul E. McKenney
2009-12-16 18:57       ` Frederic Weisbecker
2009-12-16 19:13         ` Frederic Weisbecker
2009-12-16 19:21     ` [PATCH] " Frederic Weisbecker
2009-12-16 19:23       ` Frederic Weisbecker
2009-12-17  1:37         ` Paul E. McKenney
2009-12-17  8:49           ` Ingo Molnar
2009-12-17 19:49             ` Paul E. McKenney
2009-12-17 10:52       ` [tip:sched/urgent] " tip-bot for Frederic Weisbecker

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.