[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAKfTPtCPESw89KLs2HQGtxSM68yqSGoJoaU8FDRKrr00ZHWPWQ@mail.gmail.com>
Date: Thu, 26 Nov 2020 11:17:48 +0100
From: Vincent Guittot <vincent.guittot@...aro.org>
To: Peter Zijlstra <peterz@...radead.org>
Cc: "Joel Fernandes (Google)" <joel@...lfernandes.org>,
Nishanth Aravamudan <naravamudan@...italocean.com>,
Julien Desfossez <jdesfossez@...italocean.com>,
Tim Chen <tim.c.chen@...ux.intel.com>,
Vineeth Pillai <viremana@...ux.microsoft.com>,
Aaron Lu <aaron.lwe@...il.com>,
Aubrey Li <aubrey.intel@...il.com>,
Thomas Gleixner <tglx@...utronix.de>,
linux-kernel <linux-kernel@...r.kernel.org>,
Ingo Molnar <mingo@...nel.org>,
Linus Torvalds <torvalds@...ux-foundation.org>,
Frederic Weisbecker <fweisbec@...il.com>,
Kees Cook <keescook@...omium.org>,
Greg Kerr <kerrnel@...gle.com>, Phil Auld <pauld@...hat.com>,
Valentin Schneider <valentin.schneider@....com>,
Mel Gorman <mgorman@...hsingularity.net>,
Pawan Gupta <pawan.kumar.gupta@...ux.intel.com>,
Paolo Bonzini <pbonzini@...hat.com>, vineeth@...byteword.org,
Chen Yu <yu.c.chen@...el.com>,
Christian Brauner <christian.brauner@...ntu.com>,
Agata Gruza <agata.gruza@...el.com>,
Antonio Gomez Iglesias <antonio.gomez.iglesias@...el.com>,
graf@...zon.com, konrad.wilk@...cle.com, dfaggioli@...e.com,
Paul Turner <pjt@...gle.com>,
Steven Rostedt <rostedt@...dmis.org>,
Patrick Bellasi <derkling@...gle.com>,
Jiang Biao <benbjiang@...cent.com>,
Alexandre Chartre <alexandre.chartre@...cle.com>,
James Bottomley <James.Bottomley@...senpartnership.com>,
OWeisse@...ch.edu, Dhaval Giani <dhaval.giani@...cle.com>,
Junaid Shahid <junaids@...gle.com>, jsbarnes@...gle.com,
"Hyser,Chris" <chris.hyser@...cle.com>,
Ben Segall <bsegall@...gle.com>, Josh Don <joshdon@...gle.com>,
Hao Luo <haoluo@...gle.com>,
Tom Lendacky <thomas.lendacky@....com>,
Aubrey Li <aubrey.li@...ux.intel.com>,
"Paul E. McKenney" <paulmck@...nel.org>,
Tim Chen <tim.c.chen@...el.com>
Subject: Re: [PATCH -tip 02/32] sched: Introduce sched_class::pick_task()
On Thu, 26 Nov 2020 at 10:07, Peter Zijlstra <peterz@...radead.org> wrote:
>
> On Wed, Nov 25, 2020 at 05:28:36PM +0100, Vincent Guittot wrote:
> > On Wed, 18 Nov 2020 at 00:20, Joel Fernandes (Google)
>
> > > +#ifdef CONFIG_SMP
> > > +static struct task_struct *pick_task_fair(struct rq *rq)
> > > +{
> > > + struct cfs_rq *cfs_rq = &rq->cfs;
> > > + struct sched_entity *se;
> > > +
> > > + if (!cfs_rq->nr_running)
> > > + return NULL;
> > > +
> > > + do {
> > > + struct sched_entity *curr = cfs_rq->curr;
> > > +
> > > + se = pick_next_entity(cfs_rq, NULL);
> >
> > Calling pick_next_entity clears buddies. This is fine without
> > coresched because the se will be the next one. But calling
> > pick_task_fair doesn't mean that the se will be used
>
> Urgh, nice one :/
>
> > > +
> > > + if (curr) {
> > > + if (se && curr->on_rq)
> > > + update_curr(cfs_rq);
> > > +
> >
> > Shouldn't you check if cfs_rq is throttled ?
>
> Hmm,... I suppose we do.
>
> > > + if (!se || entity_before(curr, se))
> > > + se = curr;
> > > + }
> > > +
> > > + cfs_rq = group_cfs_rq(se);
> > > + } while (cfs_rq);
> > > +
> > > + return task_of(se);
> > > +}
> > > +#endif
>
> Something like so then?
yes. it seems ok
>
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -4354,6 +4354,8 @@ check_preempt_tick(struct cfs_rq *cfs_rq
> static void
> set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se)
> {
> + clear_buddies(cfs_rq, se);
> +
> /* 'current' is not kept within the tree. */
> if (se->on_rq) {
> /*
> @@ -4440,8 +4442,6 @@ pick_next_entity(struct cfs_rq *cfs_rq,
> se = cfs_rq->last;
> }
>
> - clear_buddies(cfs_rq, se);
> -
> return se;
> }
>
> @@ -6982,20 +6982,29 @@ static void check_preempt_wakeup(struct
> #ifdef CONFIG_SMP
> static struct task_struct *pick_task_fair(struct rq *rq)
> {
> - struct cfs_rq *cfs_rq = &rq->cfs;
> struct sched_entity *se;
> -
> + struct cfs_rq *cfs_rq;
> +
> +again:
> + cfs_rq = &rq->cfs;
> if (!cfs_rq->nr_running)
> return NULL;
>
> do {
> struct sched_entity *curr = cfs_rq->curr;
>
> - if (curr && curr->on_rq)
> - update_curr(cfs_rq);
> + /* When we pick for a remote RQ, we'll not have done put_prev_entity() */
> + if (curr) {
> + if (curr->on_rq)
> + update_curr(cfs_rq);
> + else
> + curr = NULL;
>
> - se = pick_next_entity(cfs_rq, curr);
> + if (unlikely(check_cfs_rq_runtime(cfs_rq)))
> + goto again;
> + }
>
> + se = pick_next_entity(cfs_rq, curr);
> cfs_rq = group_cfs_rq(se);
> } while (cfs_rq);
>
Powered by blists - more mailing lists