linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Scott Wood <swood@redhat.com>
To: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: Thomas Gleixner <tglx@linutronix.de>,
	Steven Rostedt <rostedt@goodmis.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Juri Lelli <juri.lelli@redhat.com>,
	Daniel Bristot de Oliveira <bristot@redhat.com>,
	Clark Williams <williams@redhat.com>,
	linux-kernel@vger.kernel.org, linux-rt-users@vger.kernel.org
Subject: Re: [PATCH RT 6/8] sched: migrate_enable: Set state to TASK_RUNNING
Date: Tue, 17 Sep 2019 12:54:04 -0500	[thread overview]
Message-ID: <e7ffe570911adffcbc69c05a26e5b670c1dcc3f6.camel@redhat.com> (raw)
In-Reply-To: <20190917153110.fgi6ilb6mpfkcwbr@linutronix.de>

On Tue, 2019-09-17 at 17:31 +0200, Sebastian Andrzej Siewior wrote:
> 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 <swood@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?

Unfortunately I didn't save the traceback of where I originally saw it, but
I ran it again and hit the warning in prepare_to_wait_event().

>  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.

Preserving the state would be ideal, though in most cases occasionally
losing the state should be tolerable as long as it doesn't happen
persistently.  TASK_DEAD is an exception but that doesn't do anything before
schedule() that could end up here.  I suppose there could be some places
that use TASK_UNINTERRUPTIBLE without checking the actual condition after
schedule(), and which do something that can end up here before schedule()...

We can't use saved_state here though, because we can get here inside the
rtmutex code (e.g. from debug_rt_mutex_print_deadlock)... and besides, the
waker won't have WF_LOCK_SLEEPER and so saved_state will get cleared.

-Scott



  reply	other threads:[~2019-09-17 17:54 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-27  5:56 [RT PATCH 0/8] migrate disable fixes and performance Scott Wood
2019-07-27  5:56 ` [PATCH RT 1/8] sched: migrate_enable: Use sleeping_lock to indicate involuntary sleep Scott Wood
2019-07-29 13:26   ` Steven Rostedt
2019-07-27  5:56 ` [PATCH RT 2/8] sched: __set_cpus_allowed_ptr: Check cpus_mask, not cpus_ptr Scott Wood
2019-09-17 14:57   ` Sebastian Andrzej Siewior
2019-09-17 15:23     ` Scott Wood
2019-07-27  5:56 ` [PATCH RT 3/8] sched: Remove dead __migrate_disabled() check Scott Wood
2019-07-27  5:56 ` [PATCH RT 4/8] sched: migrate disable: Protect cpus_ptr with lock Scott Wood
2019-09-26 16:39   ` Sebastian Andrzej Siewior
2019-09-26 16:52     ` Scott Wood
2019-09-27 12:19       ` Sebastian Andrzej Siewior
2019-09-27 20:02         ` Scott Wood
2019-07-27  5:56 ` [PATCH RT 5/8] sched/deadline: Reclaim cpuset bandwidth in .migrate_task_rq() Scott Wood
2019-09-17 15:10   ` Sebastian Andrzej Siewior
2019-09-27  8:11   ` Juri Lelli
2019-09-27 16:40     ` Scott Wood
2019-09-30  7:12       ` Juri Lelli
2019-09-30 16:24         ` Scott Wood
2019-10-01  8:52           ` Juri Lelli
2019-10-09  6:25             ` Scott Wood
2019-10-09  7:27               ` Juri Lelli
2019-10-09 19:12                 ` Scott Wood
2019-10-10  8:18                   ` Juri Lelli
2019-07-27  5:56 ` [PATCH RT 6/8] sched: migrate_enable: Set state to TASK_RUNNING Scott Wood
2019-09-17 15:31   ` Sebastian Andrzej Siewior
2019-09-17 17:54     ` Scott Wood [this message]
2019-07-27  5:56 ` [PATCH RT 7/8] sched: migrate_enable: Use select_fallback_rq() Scott Wood
2019-09-17 16:00   ` Sebastian Andrzej Siewior
2019-09-24 18:05     ` Scott Wood
2019-07-27  5:56 ` [PATCH RT 8/8] sched: Lazy migrate_disable processing Scott Wood
2019-09-17 16:50   ` Sebastian Andrzej Siewior
2019-09-17 17:06     ` Scott Wood

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e7ffe570911adffcbc69c05a26e5b670c1dcc3f6.camel@redhat.com \
    --to=swood@redhat.com \
    --cc=bigeasy@linutronix.de \
    --cc=bristot@redhat.com \
    --cc=juri.lelli@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rt-users@vger.kernel.org \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=williams@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).