From: Peter Zijlstra <peterz@infradead.org>
To: Mike Galbraith <umgwanakikbuti@gmail.com>
Cc: LKML <linux-kernel@vger.kernel.org>, Ingo Molnar <mingo@elte.hu>,
ktkhai@parallels.com
Subject: Re: sched_setscheduler() vs idle_balance() race
Date: Thu, 28 May 2015 13:51:18 +0200 [thread overview]
Message-ID: <20150528115118.GG3644@twins.programming.kicks-ass.net> (raw)
In-Reply-To: <1432799032.3237.119.camel@gmail.com>
On Thu, May 28, 2015 at 09:43:52AM +0200, Mike Galbraith wrote:
> Hi Peter,
>
> I'm not seeing what prevents pull_task() from yanking a task out from
> under __sched_setscheduler(). A box sprinkling smoldering 3.0 kernel
> wreckage all over my bugzilla mbox isn't seeing it either ;-)
>
> Scenario: rt task forks, wakes child to CPU foo, immediately tries to
> change child to fair class, calls switched_from_rt(), that leads to
> pull_rt_task() -> double_lock_balance() which momentarily drops child's
> rq->lock, letting some prick doing idle balancing over on CPU bar in to
> migrate the child. Rt parent then calls switched_to_fair(), and box
> explodes when we use the passed rq as if the child still lived there.
>
> I sent a patchlet to verify that the diagnosis is really really correct
> (can_migrate_task() says no if ->pi_lock is held), but I think it is,
> the 8x10 color glossy with circles and arrows clearly shows both tasks
> with their grubby mitts on that child at the same time, each thinking it
> has that child locked down tight.
>
> Not seeing what should prevent that in mainline either, I'll just ask
> while I wait to (hopefully) hear "yup, all better".
The last patch to come close is 67dfa1b756f2 ("sched/deadline: Implement
cancel_dl_timer() to use in switched_from_dl()")
Which places the comment /* Possible rq-lock hole */ between
switched_from() and switched_to().
Which is exactly the hole you mean, right?
And that commit talks about how all that is 'safe' because all scheduler
operations take ->pi_lock, which is true, except for load-balancing,
which only uses rq->lock.
Furthermore, we call check_class_changed() _after_ we enqueue the task
on the new class, so balancing can indeed occur.
Lemme go stare at this; ideally we'd call check_class_changed() at
__setscheduler() time where the task is off all rqs, but I suspect
there's 'obvious' problems with that..
next prev parent reply other threads:[~2015-05-28 11:51 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-28 7:43 sched_setscheduler() vs idle_balance() race Mike Galbraith
2015-05-28 11:51 ` Peter Zijlstra [this message]
2015-05-28 12:04 ` Mike Galbraith
2015-05-28 12:06 ` Peter Zijlstra
2015-05-28 12:32 ` Mike Galbraith
2015-05-28 13:53 ` Peter Zijlstra
2015-05-28 14:54 ` Mike Galbraith
2015-05-28 15:24 ` Peter Zijlstra
2015-05-29 18:30 ` Mike Galbraith
2015-05-29 18:48 ` Mike Galbraith
2015-06-01 8:14 ` Peter Zijlstra
2015-06-01 8:16 ` Peter Zijlstra
2015-06-01 10:00 ` Mike Galbraith
2015-05-28 16:59 ` Kirill Tkhai
2015-05-30 13:08 ` Mike Galbraith
2015-05-31 6:39 ` Mike Galbraith
2015-06-01 8:24 ` Peter Zijlstra
2015-06-01 8:19 ` Peter Zijlstra
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=20150528115118.GG3644@twins.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=ktkhai@parallels.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=umgwanakikbuti@gmail.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.