Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp1704446pxf; Fri, 19 Mar 2021 13:34:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwY4SQjthzxFW8wsyxeEJWzbAkogHQGk4UiMCKKWwVbwT1ovtIrBOgGtxlI+cJrX5tOykuW X-Received: by 2002:a17:906:fa0e:: with SMTP id lo14mr6416680ejb.263.1616186097260; Fri, 19 Mar 2021 13:34:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1616186097; cv=none; d=google.com; s=arc-20160816; b=Q25RAmIb8TYK4YPURMG/razNqL+78H9Xn4/LdHdwwypVmesxAyarGKZKArWGfiVWgR DSYabdbdMwbz/uJlXodhBsxciGTNLVTStpPIYOntcD1fGsbaXJdkdeTK/tqKhYsbhfzp JpM3XG7Wm9ixHMmqVBYehf/Yn0aWC4GGvcGPOU8RpKQrskM6AoRNL/A2nj4G4gYGV1T1 Maw7hFlZBExWQignbgDO7sZH6Ix4dFNjM8P/7pa+ytt037HWrqfL+5TUIL98DGX05WEr ZWGiJEPCl2svzo2UIVxCQEOmTLiiuwJA/l+ZCMhiRPvff8efA5T2XWfV4z2GeGvwyGN8 FePQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=6o4Vm8fkAZuiaagoTLfJbjClab2iXufGEzkQQzqEwU0=; b=Igx0XYDvzbXvII6Q+fjj8yY8EN9UYJCl5cgIxspl8+x92PHYJQEUjnNnSTucqfgn0D XR8PINR73l/5jxOzn3MX7t0SVqdfx8kkOScqEzcdViZ9guJ/cOEMLUaxlv9q6fIDoK1a EhAPUy7O3RCh/TmtO+YP7ch+FnB3ZEtuUa0NpJVg96X0pSoH/dGjfsrOy1G8rMlVdBum M4GuPQPVIbBzFQ3o9rmSfqK0CwKw5Sjv5Yj0ALRkpZpt8kspAHhhc+JQnCvnps3EVzsn +L20AwoH3vrqjlE1jhczX6NM/gTuf8KhQOkT+LCIVpmJlx5Y1fFmr7g0OdtURlVm95ct Fn7A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b=XBm+nJo9; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b65si5604017edf.391.2021.03.19.13.34.34; Fri, 19 Mar 2021 13:34:57 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b=XBm+nJo9; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230456AbhCSUdb (ORCPT + 99 others); Fri, 19 Mar 2021 16:33:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49326 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230288AbhCSUdC (ORCPT ); Fri, 19 Mar 2021 16:33:02 -0400 Received: from mail-qv1-xf30.google.com (mail-qv1-xf30.google.com [IPv6:2607:f8b0:4864:20::f30]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5F0DEC06175F for ; Fri, 19 Mar 2021 13:33:02 -0700 (PDT) Received: by mail-qv1-xf30.google.com with SMTP id x16so5709547qvk.3 for ; Fri, 19 Mar 2021 13:33:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joelfernandes.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=6o4Vm8fkAZuiaagoTLfJbjClab2iXufGEzkQQzqEwU0=; b=XBm+nJo9eBXsyMiilzw4Qmne/6XU3IswJn2qIlWI50Q4tgkVh/Bw1Z9BJJAX0u3+px zCNpBmo1xxiL4QECNHcStbKcM/i4WXsh6LTomhBEF2cEYExjOx/j+3XVVSIW2Hhtagbc MpgpCsF1Qk2SxR2c1Dly8CLgoyOBIrtgjqC0c= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=6o4Vm8fkAZuiaagoTLfJbjClab2iXufGEzkQQzqEwU0=; b=hKu6tw4HeIyzzxWMU7liv00LLlwpSUxbmfjA8/5+5+iBCjnTSxSjmEj5815oBJA5uC YKZ9vQqb3S5HxvShXFZEpyU/iSSEKcLYz0W0ffXtOyvh3D2TsiKY57FsxsDzTS0ME8va eovmUsCBGp0P20hqIwmDFh+ogfq2GgUf0ufkWsuCBywFSKM3WCyxbFkxionpR+rkWnzr HgLwD2GqktwffAv2cqIhCg18aGWKZhyW6XbqWfC22pyGD34JO8SToK0Tha7zTKgX3zNw UUMZbJX+Pa2bUWIgjWX+q1/UTWOvM3qT0IaFEA5GZ4+SMWL4rgT7QG8k+xlxnCsGlBm5 +L8w== X-Gm-Message-State: AOAM531PRyC50xkRoRFKKGvxrGAnY5GQFaq1P9t+27rNfMCx4fPIpDOR B0MYtyep5z1dbOUsjPL590RB9w== X-Received: by 2002:a0c:a1c2:: with SMTP id e60mr11029708qva.41.1616185981618; Fri, 19 Mar 2021 13:33:01 -0700 (PDT) Received: from joelaf.cam.corp.google.com ([2620:15c:6:411:7422:5a6f:e616:23c9]) by smtp.gmail.com with ESMTPSA id j26sm4588187qtp.30.2021.03.19.13.33.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Mar 2021 13:33:01 -0700 (PDT) From: "Joel Fernandes (Google)" To: Nishanth Aravamudan , Julien Desfossez , Peter Zijlstra , Tim Chen , Vineeth Pillai , Aaron Lu , Aubrey Li , tglx@linutronix.de, linux-kernel@vger.kernel.org Cc: mingo@kernel.org, torvalds@linux-foundation.org, fweisbec@gmail.com, keescook@chromium.org, Phil Auld , Valentin Schneider , Mel Gorman , Pawan Gupta , Paolo Bonzini , joel@joelfernandes.org, vineeth@bitbyteword.org, Chen Yu , Christian Brauner , Agata Gruza , Antonio Gomez Iglesias , graf@amazon.com, konrad.wilk@oracle.com, dfaggioli@suse.com, rostedt@goodmis.org, benbjiang@tencent.com, Alexandre Chartre , James.Bottomley@hansenpartnership.com, OWeisse@umich.edu, Dhaval Giani , chris.hyser@oracle.com, Josh Don , Hao Luo , Tom Lendacky , Aubrey Li , Aubrey Li Subject: [PATCH 1/6] sched: migration changes for core scheduling Date: Fri, 19 Mar 2021 16:32:48 -0400 Message-Id: <20210319203253.3352417-2-joel@joelfernandes.org> X-Mailer: git-send-email 2.31.0.rc2.261.g7f71774620-goog In-Reply-To: <20210319203253.3352417-1-joel@joelfernandes.org> References: <20210319203253.3352417-1-joel@joelfernandes.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Aubrey Li - Don't migrate if there is a cookie mismatch Load balance tries to move task from busiest CPU to the destination CPU. When core scheduling is enabled, if the task's cookie does not match with the destination CPU's core cookie, this task will be skipped by this CPU. This mitigates the forced idle time on the destination CPU. - Select cookie matched idle CPU In the fast path of task wakeup, select the first cookie matched idle CPU instead of the first idle CPU. - Find cookie matched idlest CPU In the slow path of task wakeup, find the idlest CPU whose core cookie matches with task's cookie - Don't migrate task if cookie not match For the NUMA load balance, don't migrate task to the CPU whose core cookie does not match with task's cookie Tested-by: Julien Desfossez Signed-off-by: Aubrey Li Signed-off-by: Tim Chen Signed-off-by: Vineeth Remanan Pillai Signed-off-by: Joel Fernandes (Google) --- kernel/sched/fair.c | 33 +++++++++++++++++--- kernel/sched/sched.h | 72 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 4 deletions(-) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index d7f90765f7fd..fddd7c44bbf3 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -1921,6 +1921,13 @@ static void task_numa_find_cpu(struct task_numa_env *env, if (!cpumask_test_cpu(cpu, env->p->cpus_ptr)) continue; + /* + * Skip this cpu if source task's cookie does not match + * with CPU's core cookie. + */ + if (!sched_core_cookie_match(cpu_rq(cpu), env->p)) + continue; + env->dst_cpu = cpu; if (task_numa_compare(env, taskimp, groupimp, maymove)) break; @@ -5867,11 +5874,15 @@ find_idlest_group_cpu(struct sched_group *group, struct task_struct *p, int this /* Traverse only the allowed CPUs */ for_each_cpu_and(i, sched_group_span(group), p->cpus_ptr) { + struct rq *rq = cpu_rq(i); + + if (!sched_core_cookie_match(rq, p)) + continue; + if (sched_idle_cpu(i)) return i; if (available_idle_cpu(i)) { - struct rq *rq = cpu_rq(i); struct cpuidle_state *idle = idle_get_state(rq); if (idle && idle->exit_latency < min_exit_latency) { /* @@ -6129,7 +6140,9 @@ static int select_idle_cpu(struct task_struct *p, struct sched_domain *sd, int t for_each_cpu_wrap(cpu, cpus, target) { if (!--nr) return -1; - if (available_idle_cpu(cpu) || sched_idle_cpu(cpu)) + + if ((available_idle_cpu(cpu) || sched_idle_cpu(cpu)) && + sched_cpu_cookie_match(cpu_rq(cpu), p)) break; } @@ -7530,8 +7543,9 @@ int can_migrate_task(struct task_struct *p, struct lb_env *env) * We do not migrate tasks that are: * 1) throttled_lb_pair, or * 2) cannot be migrated to this CPU due to cpus_ptr, or - * 3) running (obviously), or - * 4) are cache-hot on their current CPU. + * 3) task's cookie does not match with this CPU's core cookie + * 4) running (obviously), or + * 5) are cache-hot on their current CPU. */ if (throttled_lb_pair(task_group(p), env->src_cpu, env->dst_cpu)) return 0; @@ -7566,6 +7580,13 @@ int can_migrate_task(struct task_struct *p, struct lb_env *env) return 0; } + /* + * Don't migrate task if the task's cookie does not match + * with the destination CPU's core cookie. + */ + if (!sched_core_cookie_match(cpu_rq(env->dst_cpu), p)) + return 0; + /* Record that we found atleast one task that could run on dst_cpu */ env->flags &= ~LBF_ALL_PINNED; @@ -8792,6 +8813,10 @@ find_idlest_group(struct sched_domain *sd, struct task_struct *p, int this_cpu) p->cpus_ptr)) continue; + /* Skip over this group if no cookie matched */ + if (!sched_group_cookie_match(cpu_rq(this_cpu), p, group)) + continue; + local_group = cpumask_test_cpu(this_cpu, sched_group_span(group)); diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index d563b3f97789..877f77044b39 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -1125,6 +1125,7 @@ static inline bool is_migration_disabled(struct task_struct *p) #ifdef CONFIG_SCHED_CORE DECLARE_STATIC_KEY_FALSE(__sched_core_enabled); +static inline struct cpumask *sched_group_span(struct sched_group *sg); static inline bool sched_core_enabled(struct rq *rq) { @@ -1141,6 +1142,61 @@ static inline raw_spinlock_t *rq_lockp(struct rq *rq) bool cfs_prio_less(struct task_struct *a, struct task_struct *b, bool fi); +/* + * Helpers to check if the CPU's core cookie matches with the task's cookie + * when core scheduling is enabled. + * A special case is that the task's cookie always matches with CPU's core + * cookie if the CPU is in an idle core. + */ +static inline bool sched_cpu_cookie_match(struct rq *rq, struct task_struct *p) +{ + /* Ignore cookie match if core scheduler is not enabled on the CPU. */ + if (!sched_core_enabled(rq)) + return true; + + return rq->core->core_cookie == p->core_cookie; +} + +static inline bool sched_core_cookie_match(struct rq *rq, struct task_struct *p) +{ + bool idle_core = true; + int cpu; + + /* Ignore cookie match if core scheduler is not enabled on the CPU. */ + if (!sched_core_enabled(rq)) + return true; + + for_each_cpu(cpu, cpu_smt_mask(cpu_of(rq))) { + if (!available_idle_cpu(cpu)) { + idle_core = false; + break; + } + } + + /* + * A CPU in an idle core is always the best choice for tasks with + * cookies. + */ + return idle_core || rq->core->core_cookie == p->core_cookie; +} + +static inline bool sched_group_cookie_match(struct rq *rq, + struct task_struct *p, + struct sched_group *group) +{ + int cpu; + + /* Ignore cookie match if core scheduler is not enabled on the CPU. */ + if (!sched_core_enabled(rq)) + return true; + + for_each_cpu_and(cpu, sched_group_span(group), p->cpus_ptr) { + if (sched_core_cookie_match(rq, p)) + return true; + } + return false; +} + extern void queue_core_balance(struct rq *rq); bool cfs_prio_less(struct task_struct *a, struct task_struct *b, bool fi); @@ -1161,6 +1217,22 @@ static inline void queue_core_balance(struct rq *rq) { } +static inline bool sched_cpu_cookie_match(struct rq *rq, struct task_struct *p) +{ + return true; +} + +static inline bool sched_core_cookie_match(struct rq *rq, struct task_struct *p) +{ + return true; +} + +static inline bool sched_group_cookie_match(struct rq *rq, + struct task_struct *p, + struct sched_group *group) +{ + return true; +} #endif /* CONFIG_SCHED_CORE */ #ifdef CONFIG_SCHED_SMT -- 2.31.0.rc2.261.g7f71774620-goog