On 2019-08-21 18:19:05 [-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 <sw...@redhat.com> > --- > 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(-) > > --- 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();
this looks like an ugly hack. This sleeping_lock_inc() is used where we actually hold a sleeping lock and schedule() which is okay. But this would mean we hold a RCU lock and schedule() anyway. Is that okay? > + > return; > } > } Sebastian