On Wed, Aug 21, 2019 at 06:19:05PM -0500, Scott Wood wrote: > Without this, rcu_note_context_switch() will complain if an RCU read > lock is held when migrate_enable() calls stop_one_cpu(). > > Signed-off-by: Scott Wood <swood@xxxxxxxxxx> I have to ask... Both sleeping_lock_inc() and sleeping_lock_dec() are no-ops if not CONFIG_PREEMPT_RT_BASE? Thanx, Paul > --- > v2: Added comment. > > If my migrate disable changes aren't taken, then pin_current_cpu() > will also need to use sleeping_lock_inc() because calling > __read_rt_lock() bypasses the usual place it's done. > > include/linux/sched.h | 4 ++-- > kernel/rcu/tree_plugin.h | 2 +- > kernel/sched/core.c | 8 ++++++++ > 3 files changed, 11 insertions(+), 3 deletions(-) > > diff --git a/include/linux/sched.h b/include/linux/sched.h > index 7e892e727f12..1ebc97f28009 100644 > --- a/include/linux/sched.h > +++ b/include/linux/sched.h > @@ -673,7 +673,7 @@ struct task_struct { > int migrate_disable_atomic; > # endif > #endif > -#ifdef CONFIG_PREEMPT_RT_FULL > +#ifdef CONFIG_PREEMPT_RT_BASE > int sleeping_lock; > #endif > > @@ -1881,7 +1881,7 @@ static __always_inline bool need_resched(void) > return unlikely(tif_need_resched()); > } > > -#ifdef CONFIG_PREEMPT_RT_FULL > +#ifdef CONFIG_PREEMPT_RT_BASE > static inline void sleeping_lock_inc(void) > { > current->sleeping_lock++; > diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h > index 23a54e4b649c..7a3aa085ce2c 100644 > --- a/kernel/rcu/tree_plugin.h > +++ b/kernel/rcu/tree_plugin.h > @@ -292,7 +292,7 @@ void rcu_note_context_switch(bool preempt) > barrier(); /* Avoid RCU read-side critical sections leaking down. */ > trace_rcu_utilization(TPS("Start context switch")); > lockdep_assert_irqs_disabled(); > -#if defined(CONFIG_PREEMPT_RT_FULL) > +#if defined(CONFIG_PREEMPT_RT_BASE) > sleeping_l = t->sleeping_lock; > #endif > WARN_ON_ONCE(!preempt && t->rcu_read_lock_nesting > 0 && !sleeping_l); > diff --git a/kernel/sched/core.c b/kernel/sched/core.c > index e1bdd7f9be05..0758ee85634e 100644 > --- a/kernel/sched/core.c > +++ b/kernel/sched/core.c > @@ -7405,7 +7405,15 @@ void migrate_enable(void) > unpin_current_cpu(); > preempt_lazy_enable(); > preempt_enable(); > + > + /* > + * sleeping_lock_inc suppresses a debug check for > + * sleeping inside an RCU read side critical section > + */ > + sleeping_lock_inc(); > stop_one_cpu(task_cpu(p), migration_cpu_stop, &arg); > + sleeping_lock_dec(); > + > return; > } > } > -- > 1.8.3.1 >