On 2019-07-27 00:56:36 [-0500], Scott Wood wrote: > If migrate_enable() is called while a task is preparing to sleep > (state != TASK_RUNNING), that triggers a debug check in stop_one_cpu(). > Explicitly reset state to acknowledge that we're accepting the spurious > wakeup. > > Signed-off-by: Scott Wood <sw...@redhat.com> > --- > kernel/sched/core.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/kernel/sched/core.c b/kernel/sched/core.c > index 38a9a9df5638..eb27a9bf70d7 100644 > --- a/kernel/sched/core.c > +++ b/kernel/sched/core.c > @@ -7396,6 +7396,14 @@ void migrate_enable(void) > unpin_current_cpu(); > preempt_lazy_enable(); > preempt_enable(); > + > + /* > + * Avoid sleeping with an existing non-running > + * state. This will result in a spurious wakeup > + * for the calling context. > + */ > + __set_current_state(TASK_RUNNING);
Do you have an example for this? I'm not too sure if we are not using a state by doing this. Actually we were losing it and get yelled at. We do: |rt_spin_unlock() |{ | rt_spin_lock_fastunlock(); | migrate_enable(); |} So save the state as part of the locking process and lose it as part of migrate_enable() if the CPU mask was changed. I *think* we need to preserve that state until after the migration to the other CPU. > sleeping_lock_inc(); > stop_one_cpu(task_cpu(p), migration_cpu_stop, &arg); > sleeping_lock_dec(); Sebastian