Messages in this thread | | | Subject | Re: [RFC PATCH 06/16] sched: Add core wide task selection and scheduling. | From | Tim Chen <> | Date | Wed, 1 Jul 2020 17:54:11 -0700 |
| |
On 7/1/20 4:28 PM, Joel Fernandes wrote: > On Tue, Jun 30, 2020 at 09:32:27PM +0000, Vineeth Remanan Pillai wrote: >> From: Peter Zijlstra <peterz@infradead.org> >> >> Instead of only selecting a local task, select a task for all SMT >> siblings for every reschedule on the core (irrespective which logical >> CPU does the reschedule). >> >> There could be races in core scheduler where a CPU is trying to pick >> a task for its sibling in core scheduler, when that CPU has just been >> offlined. We should not schedule any tasks on the CPU in this case. >> Return an idle task in pick_next_task for this situation. >> >> NOTE: there is still potential for siblings rivalry. >> NOTE: this is far too complicated; but thus far I've failed to >> simplify it further. >> >> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> >> Signed-off-by: Julien Desfossez <jdesfossez@digitalocean.com> >> Signed-off-by: Vineeth Remanan Pillai <vpillai@digitalocean.com> >> Signed-off-by: Aaron Lu <aaron.lu@linux.alibaba.com> >> Signed-off-by: Tim Chen <tim.c.chen@linux.intel.com> > > Hi Peter, Tim, all, the below patch fixes the hotplug issue described in the > below patch's Link tag. Patch description below describes the issues fixed > and it applies on top of this patch. > > ------8<---------- > > From: "Joel Fernandes (Google)" <joel@joelfernandes.org> > Subject: [PATCH] sched: Fix CPU hotplug causing crashes in task selection logic > > The selection logic does not run correctly if the current CPU is not in the > cpu_smt_mask (which it is not because the CPU is offlined when the stopper > finishes running and needs to switch to idle). There are also other issues > fixed by the patch I think such as: if some other sibling set core_pick to > something, however the selection logic on current cpu resets it before > selecting. In this case, we need to run the task selection logic again to > make sure it picks something if there is something to run. It might end up > picking the wrong task. Yet another issue was, if the stopper thread is an > unconstrained pick, then rq->core_pick is set. The next time task selection > logic runs when stopper needs to switch to idle, the current CPU is not in > the smt_mask. This causes the previous ->core_pick to be picked again which > happens to be the unconstrained task! so the stopper keeps getting selected > forever. > > That and there are a few more safe guards and checks around checking/setting > rq->core_pick. To test it, I ran rcutorture and made it tag all torture > threads. Then ran it in hotplug mode (hotplugging every 200ms) and it hit the > issue. Now it runs for an hour or so without issue. (Torture testing debug > changes: https://bit.ly/38htfqK ). > > Various fixes were tried causing varying degrees of crashes. Finally I found > that it is easiest to just add current CPU to the smt_mask's copy always. > This is so that task selection logic always runs on the current CPU which > called schedule().
It looks good to me.
Thanks.
Tim
| |