Re: [PATCH RT v2 2/3] sched: migrate_enable: Use sleeping_lock to indicate involuntary sleep

From: Scott Wood
Date: Fri Aug 23 2019 - 15:28:57 EST


On Fri, 2019-08-23 at 18:20 +0200, Sebastian Andrzej Siewior wrote:
> 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 <swood@xxxxxxxxxx>
> > ---
> > 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?

Perhaps the name should be changed, but the concept is the same -- RT-
specific sleeping which should be considered involuntary for the purpose of
debug checks. Voluntary sleeping is not allowed in an RCU critical section
because it will break the critical section on certain flavors of RCU, but
that doesn't apply to the flavor used on RT. Sleeping for a long time in an
RCU critical section would also be a bad thing, but that also doesn't apply
here.

-Scott