From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757687AbcFAMbs (ORCPT ); Wed, 1 Jun 2016 08:31:48 -0400 Received: from merlin.infradead.org ([205.233.59.134]:49570 "EHLO merlin.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757430AbcFAMbq (ORCPT ); Wed, 1 Jun 2016 08:31:46 -0400 Date: Wed, 1 Jun 2016 14:31:40 +0200 From: Peter Zijlstra To: Vincent Guittot Cc: mingo@kernel.org, linux-kernel@vger.kernel.org, pjt@google.com, yuyang.du@intel.com, dietmar.eggemann@arm.com, bsegall@google.com Subject: Re: [RFC PATCH] sched: fix hierarchical order in rq->leaf_cfs_rq_list Message-ID: <20160601123140.GW3192@twins.programming.kicks-ass.net> References: <1464080135-17112-1-git-send-email-vincent.guittot@linaro.org> <1464083710-4370-1-git-send-email-vincent.guittot@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1464083710-4370-1-git-send-email-vincent.guittot@linaro.org> User-Agent: Mutt/1.5.21 (2012-12-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, May 24, 2016 at 11:55:10AM +0200, Vincent Guittot wrote: > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c > index 218f8e8..6d3fbf2 100644 > --- a/kernel/sched/fair.c > +++ b/kernel/sched/fair.c > @@ -290,15 +290,31 @@ static inline void list_add_leaf_cfs_rq(struct cfs_rq *cfs_rq) > * Ensure we either appear before our parent (if already > * enqueued) or force our parent to appear after us when it is > * enqueued. The fact that we always enqueue bottom-up > + * reduces this to two cases and a specila case for the root 'special' > + * cfs_rq. > */ > if (cfs_rq->tg->parent && > cfs_rq->tg->parent->cfs_rq[cpu_of(rq_of(cfs_rq))]->on_list) { > + /* Add the child just before its parent */ > + list_add_tail_rcu(&cfs_rq->leaf_cfs_rq_list, > + &(cfs_rq->tg->parent->cfs_rq[cpu_of(rq_of(cfs_rq))]->leaf_cfs_rq_list)); > + rq_of(cfs_rq)->leaf_alone = &rq_of(cfs_rq)->leaf_cfs_rq_list; > + } else if (!cfs_rq->tg->parent) { > + /* > + * cfs_rq without parent should be > + * at the end of the list > + */ > list_add_tail_rcu(&cfs_rq->leaf_cfs_rq_list, > &rq_of(cfs_rq)->leaf_cfs_rq_list); > + rq_of(cfs_rq)->leaf_alone = &rq_of(cfs_rq)->leaf_cfs_rq_list; > + } else { > + /* > + * Our parent has not already been added so make sure > + * that it will be put after us > + */ > + list_add_rcu(&cfs_rq->leaf_cfs_rq_list, > + rq_of(cfs_rq)->leaf_alone); > + rq_of(cfs_rq)->leaf_alone = &cfs_rq->leaf_cfs_rq_list; > } > > cfs_rq->on_list = 1; Paul, Ben ? This used to be critical for update_shares() (now update_blocked_averages), but IIRC is not critical for that since PELT. I find its more readable with like so.. Also; I feel the comments can use more love; my head hurts ;-) --- --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -286,35 +286,38 @@ static inline struct cfs_rq *group_cfs_r static inline void list_add_leaf_cfs_rq(struct cfs_rq *cfs_rq) { if (!cfs_rq->on_list) { + struct rq *rq = rq_of(cfs_rq); + int cpu = cpu_of(rq); + /* * Ensure we either appear before our parent (if already * enqueued) or force our parent to appear after us when it is * enqueued. The fact that we always enqueue bottom-up - * reduces this to two cases and a specila case for the root + * reduces this to two cases and a special case for the root * cfs_rq. */ if (cfs_rq->tg->parent && - cfs_rq->tg->parent->cfs_rq[cpu_of(rq_of(cfs_rq))]->on_list) { + cfs_rq->tg->parent->cfs_rq[cpu]->on_list) { /* Add the child just before its parent */ list_add_tail_rcu(&cfs_rq->leaf_cfs_rq_list, - &(cfs_rq->tg->parent->cfs_rq[cpu_of(rq_of(cfs_rq))]->leaf_cfs_rq_list)); - rq_of(cfs_rq)->leaf_alone = &rq_of(cfs_rq)->leaf_cfs_rq_list; + &(cfs_rq->tg->parent->cfs_rq[cpu]->leaf_cfs_rq_list)); + rq->leaf_alone = &rq->leaf_cfs_rq_list; } else if (!cfs_rq->tg->parent) { /* * cfs_rq without parent should be * at the end of the list */ list_add_tail_rcu(&cfs_rq->leaf_cfs_rq_list, - &rq_of(cfs_rq)->leaf_cfs_rq_list); - rq_of(cfs_rq)->leaf_alone = &rq_of(cfs_rq)->leaf_cfs_rq_list; + &rq->leaf_cfs_rq_list); + rq->leaf_alone = &rq->leaf_cfs_rq_list; } else { /* * Our parent has not already been added so make sure * that it will be put after us */ list_add_rcu(&cfs_rq->leaf_cfs_rq_list, - rq_of(cfs_rq)->leaf_alone); - rq_of(cfs_rq)->leaf_alone = &cfs_rq->leaf_cfs_rq_list; + rq->leaf_alone); + rq->leaf_alone = &cfs_rq->leaf_cfs_rq_list; } cfs_rq->on_list = 1;