| Subject: sched: Do not account rcu_preempt_depth on RT in might_sleep() |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Tue, 07 Jun 2011 09:19:06 +0200 |
| |
| RT changes the rcu_preempt_depth semantics, so we cannot check for it |
| in might_sleep(). |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| --- |
| include/linux/rcupdate.h | 7 +++++++ |
| kernel/sched/core.c | 2 +- |
| 2 files changed, 8 insertions(+), 1 deletion(-) |
| |
| --- a/include/linux/rcupdate.h |
| +++ b/include/linux/rcupdate.h |
| @@ -261,6 +261,11 @@ void synchronize_rcu(void); |
| * types of kernel builds, the rcu_read_lock() nesting depth is unknowable. |
| */ |
| #define rcu_preempt_depth() (current->rcu_read_lock_nesting) |
| +#ifndef CONFIG_PREEMPT_RT_FULL |
| +#define sched_rcu_preempt_depth() rcu_preempt_depth() |
| +#else |
| +static inline int sched_rcu_preempt_depth(void) { return 0; } |
| +#endif |
| |
| #else /* #ifdef CONFIG_PREEMPT_RCU */ |
| |
| @@ -286,6 +291,8 @@ static inline int rcu_preempt_depth(void |
| return 0; |
| } |
| |
| +#define sched_rcu_preempt_depth() rcu_preempt_depth() |
| + |
| #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ |
| |
| /* Internal to kernel */ |
| --- a/kernel/sched/core.c |
| +++ b/kernel/sched/core.c |
| @@ -6270,7 +6270,7 @@ void __init sched_init(void) |
| #ifdef CONFIG_DEBUG_ATOMIC_SLEEP |
| static inline int preempt_count_equals(int preempt_offset) |
| { |
| - int nested = preempt_count() + rcu_preempt_depth(); |
| + int nested = preempt_count() + sched_rcu_preempt_depth(); |
| |
| return (nested == preempt_offset); |
| } |