| Subject: sched-might-sleep-do-not-account-rcu-depth.patch |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Tue, 07 Jun 2011 09:19:06 +0200 |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| --- |
| include/linux/rcupdate.h | 7 +++++++ |
| kernel/sched/core.c | 3 ++- |
| 2 files changed, 9 insertions(+), 1 deletion(-) |
| |
| Index: linux-stable/include/linux/rcupdate.h |
| =================================================================== |
| --- linux-stable.orig/include/linux/rcupdate.h |
| +++ linux-stable/include/linux/rcupdate.h |
| @@ -190,6 +190,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 */ |
| |
| @@ -213,6 +218,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 */ |
| Index: linux-stable/kernel/sched/core.c |
| =================================================================== |
| --- linux-stable.orig/kernel/sched/core.c |
| +++ linux-stable/kernel/sched/core.c |
| @@ -7146,7 +7146,8 @@ void __init sched_init(void) |
| #ifdef CONFIG_DEBUG_ATOMIC_SLEEP |
| static inline int preempt_count_equals(int preempt_offset) |
| { |
| - int nested = (preempt_count() & ~PREEMPT_ACTIVE) + rcu_preempt_depth(); |
| + int nested = (preempt_count() & ~PREEMPT_ACTIVE) + |
| + sched_rcu_preempt_depth(); |
| |
| return (nested == preempt_offset); |
| } |