On 26-Apr-2019 05:03:37 PM, Peter Zijlstra wrote:
> On Tue, Apr 23, 2019 at 04:18:21PM +0000, Vineeth Remanan Pillai wrote:
> 
> (you lost From: Julien)
> 
> > During core scheduling, it can happen that the current rq selects a
> > non-tagged process while the sibling might be idling even though it
> > had something to run (because the sibling selected idle to match the
> > tagged process in previous tag matching iteration). We need to wake up
> > the sibling if such a situation arise.
> > 
> > Signed-off-by: Vineeth Remanan Pillai <vpil...@digitalocean.com>
> > Signed-off-by: Julien Desfossez <jdesfos...@digitalocean.com>
> > ---
> >  kernel/sched/core.c | 15 +++++++++++++++
> >  1 file changed, 15 insertions(+)
> > 
> > diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> > index e8f5ec641d0a..0e3c51a1b54a 100644
> > --- a/kernel/sched/core.c
> > +++ b/kernel/sched/core.c
> > @@ -3775,6 +3775,21 @@ pick_next_task(struct rq *rq, struct task_struct 
> > *prev, struct rq_flags *rf)
> >                      */
> >                     if (i == cpu && !rq->core->core_cookie && 
> > !p->core_cookie) {
> >                             next = p;
> > +                           rq->core_pick = NULL;
> > + 
> > +                           /*
> > +                            * If the sibling is idling, we might want to 
> > wake it
> > +                            * so that it can check for any runnable tasks 
> > that did
> > +                            * not get a chance to run due to previous task 
> > matching.
> > +                            */
> > +                           for_each_cpu(j, smt_mask) {
> > +                                   struct rq *rq_j = cpu_rq(j);
> > +                                   rq_j->core_pick = NULL;
> > +                                   if (j != cpu &&
> > +                                       is_idle_task(rq_j->curr) && 
> > rq_j->nr_running) {
> > +                                           resched_curr(rq_j);
> > +                                   }
> > +                           }
> >                             goto done;
> >                     }
> 
> Anyway, as written here:
> 
>   
> https://lkml.kernel.org/r/20190410150116.gi2...@worktop.programming.kicks-ass.net
> 
> I think this isn't quite right. Does the below patch (which actually
> removes lines) also work?
> 
> As written before; the intent was to not allow that optimization if the
> last pick had a cookie; thereby doing a (last) core wide selection when
> we go to a 0-cookie, and this then includes kicking forced-idle cores.

It works and the performance is similar to our previous solution :-)

Thanks,

Julien

Reply via email to