Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp10626524rwd; Thu, 22 Jun 2023 02:32:17 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6Uut7gy/m+RaZV2L2JBET66kc2MzFh8Z4GQ3aU+5+iUvQdlyTdh477sVv4bTxHeK204dfK X-Received: by 2002:a17:902:f90d:b0:1b5:b28:2ff1 with SMTP id kw13-20020a170902f90d00b001b50b282ff1mr26582523plb.10.1687426337570; Thu, 22 Jun 2023 02:32:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687426337; cv=none; d=google.com; s=arc-20160816; b=uRMrc6E9nEWE4EhSY6LLAf19Hb6iuYW6psnP/dUgFteMeJFVsR1YtoriA/MSrzq78c DvyT9joNWZjDiczev0TMObg/gott6bWluQfu7M/ozwZSH+JL9uVbnLncI0UfkvATTLpS v/L8yjWfIwHRt53g5Mh4VfkPHyzY+FkUbYVgWSLbWk2C0uRwGMDFagYHDoF7g2lH7K7B 3E3SgAOG6ECxLdLbNPwhNwB2tNI+9SYjuqgqwykBvkkHKfiIRe6VoR9Xp1P8Px4gg7kB QvV3HxFXiEQ7vr7Fs1KNYvJ56kXHdGSMy8938hfrzFsDmy8NThZfxr+hFl748J+KP2Pn wKvg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date; bh=22qMJV5zJU3rRmX0qVS97YPVbZbi/pXtoEQGFNnjVFs=; b=qi++iB9rpB5mJHcvokKgSxr8L69z+xg308oKraUJF1xOQ3DgYb/mzlUx3jRjET4BJr Dh1Q8SzawLlEs3vIPzQcor5MEOke9h90Gt1biHAA/lQzQz0YbYu5AmBtdjdOrw1hMUeh E9smA6rELDisBhNBIBto+X/rCeALVNz/AK5EgxQu7E8BD9MSlMBiEa0mgRPyKyG1tLU4 iEZ5BQNGuW/sxJsipqGq50Qvic6wxyrhZflgIaG6uaCtat30uK3BHxSoEyG0YPk6hNlc xXqxB9HMKQW/TQUuiMH9sDKDZAhN1kdO6qMwwo8Adwj81svo45aCd54jtSbxeU41PJjz XbYg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id z6-20020a170903018600b001a95b85b070si272215plg.604.2023.06.22.02.32.06; Thu, 22 Jun 2023 02:32:17 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232272AbjFVJLV (ORCPT + 99 others); Thu, 22 Jun 2023 05:11:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53132 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231548AbjFVJKu (ORCPT ); Thu, 22 Jun 2023 05:10:50 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id C65E95FE2; Thu, 22 Jun 2023 02:01:50 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 460231042; Thu, 22 Jun 2023 02:02:34 -0700 (PDT) Received: from localhost (ionvoi01-desktop.cambridge.arm.com [10.2.78.69]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id F2BCF3F663; Thu, 22 Jun 2023 02:01:49 -0700 (PDT) Date: Thu, 22 Jun 2023 10:01:48 +0100 From: Ionela Voinescu To: Ricardo Neri Cc: "Peter Zijlstra (Intel)" , Juri Lelli , Vincent Guittot , Ricardo Neri , "Ravi V. Shankar" , Ben Segall , Daniel Bristot de Oliveira , Dietmar Eggemann , Len Brown , Mel Gorman , "Rafael J. Wysocki" , Srinivas Pandruvada , Steven Rostedt , Tim Chen , Valentin Schneider , Lukasz Luba , Zhao Liu , "Yuan, Perry" , x86@kernel.org, "Joel Fernandes (Google)" , linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, "Tim C . Chen" , Zhao Liu Subject: Re: [PATCH v4 06/24] sched/fair: Collect load-balancing stats for IPC classes Message-ID: References: <20230613042422.5344-1-ricardo.neri-calderon@linux.intel.com> <20230613042422.5344-7-ricardo.neri-calderon@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20230613042422.5344-7-ricardo.neri-calderon@linux.intel.com> X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Ricardo, On Monday 12 Jun 2023 at 21:24:04 (-0700), Ricardo Neri wrote: > When selecting the busiest scheduling group between two otherwise identical > groups of types asym_packing or fully_busy, IPC classes can be used to > break the tie. > > Compute the IPC class performance score for a scheduling group. It is > defined as the sum of the IPC scores of the tasks at the back of each > runqueue in the group. Load balancing starts by pulling tasks from the back > of the runqueue first, making this tiebreaker more useful. > > Also, track the IPC class with the lowest score in the scheduling group. A > task of this class will be pulled when the destination CPU has lower > priority than the fully_busy busiest group. > > These two metrics will be used during idle load balancing to compute the > current and the potential IPC class score of a scheduling group in a > subsequent changeset. > > Cc: Ben Segall > Cc: Daniel Bristot de Oliveira > Cc: Dietmar Eggemann > Cc: Ionela Voinescu > Cc: Joel Fernandes (Google) > Cc: Len Brown > Cc: Lukasz Luba > Cc: Mel Gorman > Cc: Perry Yuan > Cc: Rafael J. Wysocki > Cc: Srinivas Pandruvada > Cc: Steven Rostedt > Cc: Tim C. Chen > Cc: Valentin Schneider > Cc: Zhao Liu > Cc: x86@kernel.org > Cc: linux-pm@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > Signed-off-by: Ricardo Neri > --- > Changes since v3: > * Do not compute the IPCC stats using the current tasks of runqueues. > Instead, use the tasks at the back of the queue. These are the tasks > that will be pulled first during load balance. (Vincent) > > Changes since v2: > * Also excluded deadline and realtime tasks from IPCC stats. (Dietmar) > * Also excluded tasks that cannot run on the destination CPU from the > IPCC stats. > * Folded struct sg_lb_ipcc_stats into struct sg_lb_stats. (Dietmar) > * Reworded description sg_lb_stats::min_ipcc. (Ionela) > * Handle errors of arch_get_ipcc_score(). (Ionela) > > Changes since v1: > * Implemented cleanups and reworks from PeterZ. Thanks! > * Used the new interface names. > --- > kernel/sched/fair.c | 79 +++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 79 insertions(+) > > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c > index 6189d1a45635..c0cab5e501b6 100644 > --- a/kernel/sched/fair.c > +++ b/kernel/sched/fair.c > @@ -9110,6 +9110,11 @@ struct sg_lb_stats { > unsigned int nr_numa_running; > unsigned int nr_preferred_running; > #endif > +#ifdef CONFIG_IPC_CLASSES > + unsigned long min_score; /* Min(score(rq->curr->ipcc)) */ ^^^^^^^^^^^^^^ > + unsigned short min_ipcc; /* Class of the task with the minimum IPCC score in the rq */ > + unsigned long sum_score; /* Sum(score(rq->curr->ipcc)) */ ^^^^^^^^^^^^^^ These no longer apply. It might be easier to describe them all in a comment just above their declaration. Something like: "The sum, min and its class of the IPC scores of the tasks at the back of each runqueue in the group." > +#endif > }; > > /* > @@ -9387,6 +9392,77 @@ group_type group_classify(unsigned int imbalance_pct, > return group_has_spare; > } > > +#ifdef CONFIG_IPC_CLASSES > +static void init_rq_ipcc_stats(struct sg_lb_stats *sgs) > +{ > + /* All IPCC stats have been set to zero in update_sg_lb_stats(). */ > + sgs->min_score = ULONG_MAX; > +} > + > +static int rq_last_task_ipcc(int dst_cpu, struct rq *rq, unsigned short *ipcc) > +{ > + struct list_head *tasks = &rq->cfs_tasks; > + struct task_struct *p; > + struct rq_flags rf; > + int ret = -EINVAL; > + It's more typical of ret to be initialised to 0 and changed to an error value when there's an error case. > + rq_lock_irqsave(rq, &rf); > + if (list_empty(tasks)) > + goto out; > + > + p = list_last_entry(tasks, struct task_struct, se.group_node); > + if (p->flags & PF_EXITING || is_idle_task(p) || > + !cpumask_test_cpu(dst_cpu, p->cpus_ptr)) > + goto out; > + > + ret = 0; > + *ipcc = p->ipcc; > +out: > + rq_unlock(rq, &rf); > + return ret; > +} > + > +/* Called only if cpu_of(@rq) is not idle and has tasks running. */ > +static void update_sg_lb_ipcc_stats(int dst_cpu, struct sg_lb_stats *sgs, > + struct rq *rq) > +{ > + unsigned short ipcc; > + unsigned long score; > + > + if (!sched_ipcc_enabled()) > + return; > + > + if (rq_last_task_ipcc(dst_cpu, rq, &ipcc)) > + return; > + > + score = arch_get_ipcc_score(ipcc, cpu_of(rq)); > + > + /* > + * Ignore tasks with invalid scores. When finding the busiest group, we > + * prefer those with higher sum_score. This group will not be selected. > + */ nit: the comment is unnecessary, and a bit misleading, IMO. The comment says "This group will not be selected." but the only way to guarantee that here is to reset the sum_score to 0 when you find an invalid score, which I don't believe is your intention. Also the use of sum_score is captured in later functions, so I don't believe there's a need for additional comments here. Hope it helps, Ionela. > + if (IS_ERR_VALUE(score)) > + return; > + > + sgs->sum_score += score; > + > + if (score < sgs->min_score) { > + sgs->min_score = score; > + sgs->min_ipcc = ipcc; > + } > +} > + > +#else /* CONFIG_IPC_CLASSES */ > +static void update_sg_lb_ipcc_stats(int dst_cpu, struct sg_lb_stats *sgs, > + struct rq *rq) > +{ > +} > + > +static void init_rq_ipcc_stats(struct sg_lb_stats *sgs) > +{ > +} > +#endif /* CONFIG_IPC_CLASSES */ > + > /** > * sched_use_asym_prio - Check whether asym_packing priority must be used > * @sd: The scheduling domain of the load balancing > @@ -9477,6 +9553,7 @@ static inline void update_sg_lb_stats(struct lb_env *env, > int i, nr_running, local_group; > > memset(sgs, 0, sizeof(*sgs)); > + init_rq_ipcc_stats(sgs); > > local_group = group == sds->local; > > @@ -9526,6 +9603,8 @@ static inline void update_sg_lb_stats(struct lb_env *env, > if (sgs->group_misfit_task_load < load) > sgs->group_misfit_task_load = load; > } > + > + update_sg_lb_ipcc_stats(env->dst_cpu, sgs, rq); > } > > sgs->group_capacity = group->sgc->capacity; > -- > 2.25.1 >