From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932553AbcJUMTG (ORCPT ); Fri, 21 Oct 2016 08:19:06 -0400 Received: from foss.arm.com ([217.140.101.70]:42000 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932226AbcJUMTF (ORCPT ); Fri, 21 Oct 2016 08:19:05 -0400 Subject: Re: [PATCH 4/6 v5] sched: propagate load during synchronous attach/detach To: Vincent Guittot , peterz@infradead.org, mingo@kernel.org, linux-kernel@vger.kernel.org References: <1476695653-12309-1-git-send-email-vincent.guittot@linaro.org> <1476695653-12309-5-git-send-email-vincent.guittot@linaro.org> Cc: yuyang.du@intel.com, Morten.Rasmussen@arm.com, linaro-kernel@lists.linaro.org, pjt@google.com, bsegall@google.com, kernellwp@gmail.com From: Dietmar Eggemann Message-ID: Date: Fri, 21 Oct 2016 13:19:01 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.3.0 MIME-Version: 1.0 In-Reply-To: <1476695653-12309-5-git-send-email-vincent.guittot@linaro.org> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 10/17/2016 10:14 AM, Vincent Guittot wrote: > When a task moves from/to a cfs_rq, we set a flag which is then used to > propagate the change at parent level (sched_entity and cfs_rq) during > next update. If the cfs_rq is throttled, the flag will stay pending until > the cfs_rw is unthrottled. minor nit: s/cfs_rw/cfs_rq [...] > @@ -8704,6 +8867,22 @@ static void detach_task_cfs_rq(struct task_struct *p) > update_load_avg(se, 0); > detach_entity_load_avg(cfs_rq, se); > update_tg_load_avg(cfs_rq, false); > + > +#ifdef CONFIG_FAIR_GROUP_SCHED > + /* > + * Propagate the detach across the tg tree to make it visible to the > + * root > + */ > + se = se->parent; > + for_each_sched_entity(se) { > + cfs_rq = cfs_rq_of(se); > + > + if (cfs_rq_throttled(cfs_rq)) > + break; > + > + update_load_avg(se, UPDATE_TG); > + } > +#endif > } > > static void attach_entity_cfs_rq(struct sched_entity *se) > @@ -8722,6 +8901,22 @@ static void attach_entity_cfs_rq(struct sched_entity *se) > update_load_avg(se, sched_feat(ATTACH_AGE_LOAD) ? 0 : SKIP_AGE_LOAD); > attach_entity_load_avg(cfs_rq, se); > update_tg_load_avg(cfs_rq, false); > + > +#ifdef CONFIG_FAIR_GROUP_SCHED > + /* > + * Propagate the attach across the tg tree to make it visible to the > + * root > + */ > + se = se->parent; > + for_each_sched_entity(se) { > + cfs_rq = cfs_rq_of(se); > + > + if (cfs_rq_throttled(cfs_rq)) > + break; > + > + update_load_avg(se, UPDATE_TG); > + } > +#endif > } The 'detach across' and 'attach across' in detach_task_cfs_rq() and attach_entity_cfs_rq() do the same so couldn't you not create a function propagate_foo() for it? This would avoid this ifdef as well. You could further create in your '[PATCH 1/6 v5] sched: factorize attach entity': detach_entity_cfs_rq() { update_load_avg() detach_entity_load_avg() update_tg_load_avg() propagate_load_avg() } and then we would have: attach_task_cfs_rq() -> attach_entity_cfs_rq() -> propagate_foo() detach_task_cfs_rq() -> detach_entity_cfs_rq() -> propagate_foo() I guess you didn't because it would be only called one time but this symmetric approaches are easier to remember (at least for me). [...]