Received: by 2002:ab2:788f:0:b0:1ee:8f2e:70ae with SMTP id b15csp47947lqi; Wed, 6 Mar 2024 09:40:28 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCWbiLyw2uNrDnTO6s4lbJeT/d1I9sxF7+X9B0Ss2MQ6ENPqY228ulRyUCBJ4bGjf+csqXSrIP55nSA4R4gknMXNOUrIkse8kWibuy/P0A== X-Google-Smtp-Source: AGHT+IFTUVOsszV/0u/J5LrFWkWaAm/oD0mF0Tv6M9HJQFmcn2bs7YFgQjXLncpPG0YKF844G4K2 X-Received: by 2002:a17:902:edc2:b0:1dc:8e13:74ce with SMTP id q2-20020a170902edc200b001dc8e1374cemr5077744plk.17.1709746828385; Wed, 06 Mar 2024 09:40:28 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1709746828; cv=pass; d=google.com; s=arc-20160816; b=f0w70Uezw0Hkre0pv7QzngUi74ZYKWYyst0kDLVJoeRsfHxIc2LqSmphClxiL6p7H5 TX3vi2v4Zjb3DAd7QDKw+JnGHJNFcix3vwfq1edDwU5g9fhhqOSDJl5u48WnAgkMMuf+ PzPP6GoCVO4m/zyuSSb3n01AXnsv2t+Dp0zKaHgyuWy7ZZnEZP46YcUy264zT9V28p3C 3GhAYqu0vCbbdGolxOnYb2J28nuMue3AoKSuyZSHRS6vkSwH1icZW5dHj2RcF9BlXRlJ tOq9QVNFCfATeV8epbUuSATqNQaIwjzvf8ykdd/T65TUi5/FFOngZsBu9IBFwILvh3Cu Xzrw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:list-unsubscribe:list-subscribe:list-id:precedence :dkim-signature; bh=9jjEQ2qy4p9w+zhcqLZMn3ai4LJLFbv1uViASPRI0Mg=; fh=a1kCPQDpOhNOfOjPT0Wi1Ha0lyK3vhwByuSfQpssu5g=; b=Xu1nt5TnDc/cty5vduA/HCjVPAmvL3z1HfglbUeZ0frzvyt2QFSoLxxAj6jTBhHVBe BJY2iXwHdc692jK4UokxfmfulbtdTTlW6tZdqiiLdv/tWvK/qQSbCLZB8qRN8EeOoI9L eKBBs6jR/8i7UQqOuAtatbN62upt2Kzq9Gc3Em4cz43p453xLP8e/kFuNamMAPTOsTEu vMMzcgKuR0XA41EjIPcSb5OIbjCO72c3pM/j8C1AvozQ4jgu6aWUn14Gkv0BohZyPDFx ZvB29CBPWTTjPUQfpY+pUylnEaeA94ySrWm7ZYR0BaVso2so0iGee5vD83tJzwP4g1im aWTQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=T4HDI7Rc; arc=pass (i=1 spf=pass spfdomain=linaro.org dkim=pass dkdomain=linaro.org dmarc=pass fromdomain=linaro.org); spf=pass (google.com: domain of linux-kernel+bounces-94338-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-94338-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id b6-20020a170902e94600b001dd3da3151bsi1404410pll.64.2024.03.06.09.40.28 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Mar 2024 09:40:28 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-94338-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=T4HDI7Rc; arc=pass (i=1 spf=pass spfdomain=linaro.org dkim=pass dkdomain=linaro.org dmarc=pass fromdomain=linaro.org); spf=pass (google.com: domain of linux-kernel+bounces-94338-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-94338-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 0C649283347 for ; Wed, 6 Mar 2024 17:40:28 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 94D3A13BAE4; Wed, 6 Mar 2024 17:40:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="T4HDI7Rc" Received: from mail-pg1-f179.google.com (mail-pg1-f179.google.com [209.85.215.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D5E9F5E08B for ; Wed, 6 Mar 2024 17:40:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.179 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709746822; cv=none; b=WWLgyXnsc24VyeNIxeuM+wCPIszL/Yphrwf0r8tpGeHF5e/5wSTiHX/HhhfGb65Az/os3qR0g8zXFinnt/1zys1mwGkUosmGQ4hQlSXu16kTWC4VVFIdltb1cGhhkXZdGbmVCQzNoeIYOBYO4fxgty/amqXPBjXdQuf1NqFgUmQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709746822; c=relaxed/simple; bh=+UXpkKd9uBAwhOreKKmpmRBiXdMvt3tWxYP+26JRLzU=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=EuTIlnbv/DvAizIkZiepUUA4CaeyluM7ZY4Zf/bBRi8dUVUpu2Y4HQdeJi+zcsXKNg05J0z1Zrlje6DBTnnhjotCmWwMosoymVNk6SUoy/umHJddyexKQb5CxI9T2s8Ch6+0jh9Wc4DzW++Dja4TLDEd9//VG8dq96o8+XsgA5g= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=T4HDI7Rc; arc=none smtp.client-ip=209.85.215.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Received: by mail-pg1-f179.google.com with SMTP id 41be03b00d2f7-5bdbe2de25fso6195774a12.3 for ; Wed, 06 Mar 2024 09:40:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1709746820; x=1710351620; darn=vger.kernel.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=9jjEQ2qy4p9w+zhcqLZMn3ai4LJLFbv1uViASPRI0Mg=; b=T4HDI7RcVelCcR33jxBSpxLJjocVvUAocLtKUdGEP08t5tFnCRGzBUPAu/pBxCVW7z iwM9qya+CUE9xY6yhaR5mRQ6ADrd57uQVaOUmSQkNlWyua/vYarBo7l6wI1AqhR6pGVO g+XTKCMDMmwxAsdjEzT7186mnfO6WBgLbUKFt/yP5hd6v3kpRxfDgbrB2IXQxJcQT/Bj OMmvmNeRwdqhSxLjWJP0P1DHLiwZdHD696SGB269n/zUU5Xs/N58dTwC+9ZMYmR6SMH0 EXAbmPdSl6VjbyPFhN3z+vDbeklpfFMvSRiuAG6ooYINplZyHiSzU1XegI0feJO1Mpwp ImTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709746820; x=1710351620; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=9jjEQ2qy4p9w+zhcqLZMn3ai4LJLFbv1uViASPRI0Mg=; b=NxCPBCkzMDk5I5WoDy1Qo6FZ9uWuRah9Lj7PWQqn3XVrcSrRiF/B8fCSMOX6PyOmgE GZ51hfGvOuBw0CscxO+PfskEjCfd5dzaSW/V3qb5KQzaQhi7Weav/45cq3gxi+oJc9xc Ah7xNgFH4XxZ1ijJuwuM6hqdLSlu53bkYendwK+/a2k3L6iPSAFGzD26X7V/E9gDIUo3 GaO7Gs+jcJqOQ5h0/iv4HEbcKGud8DxUndfWUALRJdlHx7Uapvct8qYSzenPAyxJ8Jvn hhLKdzSz6UqCnNzXnDhwDQOxgHODolkKKv7V9lcwBcVJYzSdquAJQKHLgjSvEOLONGHZ YajA== X-Forwarded-Encrypted: i=1; AJvYcCW35YOuPJD/U+R9IV/RlxtjAdqJdc0E1zDGRKABr1KmLWBqDFXv+oedla4JziJ3gms671jhssg6Dmwou5V8+nFPSGQ8BT5KfQoTFRKI X-Gm-Message-State: AOJu0YwxUC7YFX+4PuNngySOrNvI64Cdtk5LGBgIY/kKWDeedE6FAaJq Fp6xETHc+XVXG8W1HJ/sW2ahLxalL8YUDXUc8svip+6mcInwbG3JmOJLbU3vohTrrPrezEESzqV G6PiodwZj6PQPEV+ZKyI9Khxg5LK3KThg5KC6dw== X-Received: by 2002:a17:90a:fb81:b0:29a:1708:9878 with SMTP id cp1-20020a17090afb8100b0029a17089878mr15023639pjb.38.1709746820080; Wed, 06 Mar 2024 09:40:20 -0800 (PST) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: <20240306102454.341014-1-sshegde@linux.ibm.com> <20240306102454.341014-2-sshegde@linux.ibm.com> In-Reply-To: <20240306102454.341014-2-sshegde@linux.ibm.com> From: Vincent Guittot Date: Wed, 6 Mar 2024 18:40:08 +0100 Message-ID: Subject: Re: [PATCH v5 1/3] sched/fair: Add EAS checks before updating overutilized To: Shrikanth Hegde Cc: mingo@kernel.org, peterz@infradead.org, yu.c.chen@intel.com, dietmar.eggemann@arm.com, linux-kernel@vger.kernel.org, nysal@linux.ibm.com, aboorvad@linux.ibm.com, srikar@linux.ibm.com, vschneid@redhat.com, pierre.gondois@arm.com, qyousef@layalina.io Content-Type: text/plain; charset="UTF-8" On Wed, 6 Mar 2024 at 11:25, Shrikanth Hegde wrote: > > Overutilized field of root domain is only used for EAS(energy aware scheduler) > to decide whether to do load balance or not. It is not used if EAS > not possible. > > Currently enqueue_task_fair and task_tick_fair accesses, sometime updates > this field. In update_sd_lb_stats it is updated often. This causes cache > contention due to true sharing and burns a lot of cycles. overload and > overutilized are part of the same cacheline. Updating it often invalidates > the cacheline. That causes access to overload to slow down due to > false sharing. Hence add EAS check before accessing/updating this field. > EAS check is optimized at compile time or it is a static branch. > Hence it shouldn't cost much. > > With the patch, both enqueue_task_fair and newidle_balance don't show > up as hot routines in perf profile. > > 6.8-rc4: > 7.18% swapper [kernel.vmlinux] [k] enqueue_task_fair > 6.78% s [kernel.vmlinux] [k] newidle_balance > +patch: > 0.14% swapper [kernel.vmlinux] [k] enqueue_task_fair > 0.00% swapper [kernel.vmlinux] [k] newidle_balance > > Minor change: trace_sched_overutilized_tp expect that second argument to > be bool. So do a int to bool conversion for that. > > Fixes: 2802bf3cd936 ("sched/fair: Add over-utilization/tipping point indicator") > Reviewed-by: Qais Yousef > Reviewed-by: Srikar Dronamraju > Signed-off-by: Shrikanth Hegde > --- > kernel/sched/fair.c | 62 +++++++++++++++++++++++++++++++-------------- > 1 file changed, 43 insertions(+), 19 deletions(-) > > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c > index 6a16129f9a5c..997e570d9423 100644 > --- a/kernel/sched/fair.c > +++ b/kernel/sched/fair.c > @@ -6663,22 +6663,51 @@ static inline void hrtick_update(struct rq *rq) > #ifdef CONFIG_SMP > static inline bool cpu_overutilized(int cpu) > { > - unsigned long rq_util_min = uclamp_rq_get(cpu_rq(cpu), UCLAMP_MIN); > - unsigned long rq_util_max = uclamp_rq_get(cpu_rq(cpu), UCLAMP_MAX); > + unsigned long rq_util_min, rq_util_max; > + > + if (!sched_energy_enabled()) > + return false; > + > + rq_util_min = uclamp_rq_get(cpu_rq(cpu), UCLAMP_MIN); > + rq_util_max = uclamp_rq_get(cpu_rq(cpu), UCLAMP_MAX); > > /* Return true only if the utilization doesn't fit CPU's capacity */ > return !util_fits_cpu(cpu_util_cfs(cpu), rq_util_min, rq_util_max, cpu); > } > > -static inline void update_overutilized_status(struct rq *rq) > +static inline void set_rd_overutilized_status(struct root_domain *rd, > + unsigned int status) > { > - if (!READ_ONCE(rq->rd->overutilized) && cpu_overutilized(rq->cpu)) { > - WRITE_ONCE(rq->rd->overutilized, SG_OVERUTILIZED); > - trace_sched_overutilized_tp(rq->rd, SG_OVERUTILIZED); > - } > + if (!sched_energy_enabled()) > + return; > + > + WRITE_ONCE(rd->overutilized, status); > + trace_sched_overutilized_tp(rd, !!status); > +} > + > +static inline void check_update_overutilized_status(struct rq *rq) > +{ > + /* > + * overutilized field is used for load balancing decisions only > + * if energy aware scheduler is being used > + */ > + if (!sched_energy_enabled()) > + return; > + > + if (!READ_ONCE(rq->rd->overutilized) && cpu_overutilized(rq->cpu)) > + set_rd_overutilized_status(rq->rd, SG_OVERUTILIZED); > } > #else > -static inline void update_overutilized_status(struct rq *rq) { } > +static inline void check_update_overutilized_status(struct rq *rq) > +{ > + return 0; > +} static inline void check_update_overutilized_status(struct rq *rq) { } > + > +static inline void set_rd_overutilized_status(struct root_domain *rd, > + unsigned int status) > +{ > + return 0; > +} static inline void set_rd_overutilized_status(struct rq *rq) { } my comment on v4 about {return 0; } applies only for static inline int is_rd_overutilized(struct root_domain *rd) Also, I don't think that set_rd_overutilized_status() is called outside #ifdef CONFIG_SMP so you can remove it. > #endif > > /* Runqueue only has SCHED_IDLE tasks enqueued */ > @@ -6779,7 +6808,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) > * and the following generally works well enough in practice. > */ > if (!task_new) > - update_overutilized_status(rq); > + check_update_overutilized_status(rq); > > enqueue_throttle: > assert_list_leaf_cfs_rq(rq); > @@ -10596,19 +10625,14 @@ static inline void update_sd_lb_stats(struct lb_env *env, struct sd_lb_stats *sd > env->fbq_type = fbq_classify_group(&sds->busiest_stat); > > if (!env->sd->parent) { > - struct root_domain *rd = env->dst_rq->rd; > - > /* update overload indicator if we are at root domain */ > - WRITE_ONCE(rd->overload, sg_status & SG_OVERLOAD); > + WRITE_ONCE(env->dst_rq->rd->overload, sg_status & SG_OVERLOAD); > > /* Update over-utilization (tipping point, U >= 0) indicator */ > - WRITE_ONCE(rd->overutilized, sg_status & SG_OVERUTILIZED); > - trace_sched_overutilized_tp(rd, sg_status & SG_OVERUTILIZED); > + set_rd_overutilized_status(env->dst_rq->rd, > + sg_status & SG_OVERUTILIZED); > } else if (sg_status & SG_OVERUTILIZED) { > - struct root_domain *rd = env->dst_rq->rd; > - > - WRITE_ONCE(rd->overutilized, SG_OVERUTILIZED); > - trace_sched_overutilized_tp(rd, SG_OVERUTILIZED); > + set_rd_overutilized_status(env->dst_rq->rd, SG_OVERUTILIZED); > } > > update_idle_cpu_scan(env, sum_util); > @@ -12609,7 +12633,7 @@ static void task_tick_fair(struct rq *rq, struct task_struct *curr, int queued) > task_tick_numa(rq, curr); > > update_misfit_status(curr, rq); > - update_overutilized_status(task_rq(curr)); > + check_update_overutilized_status(task_rq(curr)); > > task_tick_core(rq, curr); > } > -- > 2.39.3 >