From nobody Mon May 25 00:09:40 2026 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ED60E3B6360; Wed, 20 May 2026 08:34:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779266067; cv=none; b=lIZftAAA6w9f0BqZ+4uXJ9L3vrdC2jLIDrhDWkbkF23hzksXtv+oa8lN9Rmq58wVF7QSm5ZsOmbNSCndYbYlGkVRc4v1oGb54KYeTOA7M7oiB4I5nK9MNcZDND/9G5/gRk95f2yxcme8Z+jUJi+1W/8e8GlGdSJiJaBQAEHmJjA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779266067; c=relaxed/simple; bh=5bDVR6uto3xCEIvIAb8GsXst9BIPS/LBKinaP7S43rk=; h=Date:From:To:Subject:Cc:In-Reply-To:References:MIME-Version: Message-ID:Content-Type; b=Q86TJ6pNxXD2WiS1uDFsp3vFYRf1E6YNDhtUO1z0ANjlY5618nXCl5qdrMmxYWFjLTzIeZgqL4+IPbMhHedjmz5N61eat2gJdXBYSWGrhaX7KRq9cMeFbSqEkHzu27tXAw02t4nMCARw11D5nZHqvPhPBfoUylfdY7Ox/4QfOE0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=NBJa9ips; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=FQ0g0rrS; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="NBJa9ips"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="FQ0g0rrS" Date: Wed, 20 May 2026 08:34:23 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1779266064; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=RZzVANk92IJHCIueGyN6PMsdfEzl81VCwlz/w6jTa+o=; b=NBJa9ipsRr+PtY5G0o3fucL2uW3ZLv6chDHKqe0ddlGT8p6bsr3z8o7AwCxxahxox0k+a/ Zvnwe6PElAXgc5/nAhg6JI8NqzZmX7Q8rF7ds++342AHTkaUXXJkxHTx9KCdxp2MsEn6hZ /8AJKXbdoVGqTcBM5bRsx5q119RiWbA0PcVKH+HS7HYOPDFAeLWwSObA8eCWoCv2wM88/D AcgeVRQue0GYNcoy9wr3UwZWUyXbnHrv2z35SqS2Lw2DNnHilbadcZr54F7tl3OCC+FdB0 BLQlMfOSH2e8wxB9lR6B/oVNQd+3fGas0kblpUFeb6NYqN6B87H0S30tCGSOzA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1779266064; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=RZzVANk92IJHCIueGyN6PMsdfEzl81VCwlz/w6jTa+o=; b=FQ0g0rrSmDttvcFDaOrlk2MhoxH+qHmLsG6adfBCGM5x98NAoeiI5rYSvRCMtCzkfg80zy fcbaKbTv/ZS7JADg== From: "tip-bot2 for Chen Yu" Sender: tip-bot2@linutronix.de Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: sched/core] sched/cache: Fix has_multi_llcs iff at least one partition has multiple LLCs Cc: Chen Yu , Tim Chen , "Peter Zijlstra (Intel)" , x86@kernel.org, linux-kernel@vger.kernel.org In-Reply-To: =?utf-8?q?=3Cc541af2547d54509fbfd3b3a1e8072e2e5c7ff68=2E1778703?= =?utf-8?q?694=2Egit=2Etim=2Ec=2Echen=40linux=2Eintel=2Ecom=3E?= References: =?utf-8?q?=3Cc541af2547d54509fbfd3b3a1e8072e2e5c7ff68=2E17787036?= =?utf-8?q?94=2Egit=2Etim=2Ec=2Echen=40linux=2Eintel=2Ecom=3E?= Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-ID: <177926606322.711.728182158344456888.tip-bot2@tip-bot2> Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Precedence: bulk Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable The following commit has been merged into the sched/core branch of tip: Commit-ID: a7660ce1590fc1316a44cc2af53a07a21dfc25da Gitweb: https://git.kernel.org/tip/a7660ce1590fc1316a44cc2af53a07a21= dfc25da Author: Chen Yu AuthorDate: Wed, 13 May 2026 13:39:25 -07:00 Committer: Peter Zijlstra CommitterDate: Mon, 18 May 2026 21:33:18 +02:00 sched/cache: Fix has_multi_llcs iff at least one partition has multiple LLCs sched_cache_present is a global static key, but build_sched_domains() is called per partition from the "Build new domains" loop in partition_sched_domains_locked(). Each call unconditionally sets the key based solely on the has_multi_llcs local variable for that partition. The call to the last partition set the value even when there are previous partitions with multiple LLCs. If partition A (multi-LLC) is built first, the key is enabled. Then when partition B (single-LLC) is built, the key is disabled. The multi-LLC partition A is still active but the key is now off. Fix it by doing a similar thing as sched_energy_present: check the multi-LLCs during the iteration over all the partitions rather than checking it on a single partition. This bug was reported by sashiko. Fixes: d59f4fd1d303 ("sched/cache: Enable cache aware scheduling for multi = LLCs NUMA node") Signed-off-by: Chen Yu Co-developed-by: Tim Chen Signed-off-by: Tim Chen Signed-off-by: Peter Zijlstra (Intel) Link: https://patch.msgid.link/c541af2547d54509fbfd3b3a1e8072e2e5c7ff68.177= 8703694.git.tim.c.chen@linux.intel.com --- kernel/sched/topology.c | 69 ++++++++++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 16 deletions(-) diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c index 4b7c64c..e47a3f7 100644 --- a/kernel/sched/topology.c +++ b/kernel/sched/topology.c @@ -951,6 +951,7 @@ static void _sched_cache_active_set(void) } } =20 +/* used by debugfs */ void sched_cache_active_set(void) { cpus_read_lock(); @@ -1000,12 +1001,27 @@ void sched_update_llc_bytes(unsigned int cpu) unlock: sched_domains_mutex_unlock(); } + +static void sched_cache_set(bool has_multi_llcs) +{ + /* + * TBD: check before writing to it. sched domain rebuild + * is not in the critical path, leave as-is for now. + */ + if (has_multi_llcs) + static_branch_enable_cpuslocked(&sched_cache_present); + else + static_branch_disable_cpuslocked(&sched_cache_present); + + _sched_cache_active_set(); +} #else static bool alloc_sd_llc(const struct cpumask *cpu_map, struct s_data *d) { return false; } +static inline void sched_cache_set(bool has_multi_llcs) { } #endif =20 /* @@ -2950,7 +2966,8 @@ void sched_domains_free_llc_id(int cpu) * to the individual CPUs */ static int -build_sched_domains(const struct cpumask *cpu_map, struct sched_domain_att= r *attr) +build_sched_domains(const struct cpumask *cpu_map, struct sched_domain_att= r *attr, + bool *multi_llcs) { enum s_alloc alloc_state =3D sa_none; bool has_multi_llcs =3D false; @@ -3094,18 +3111,7 @@ build_sched_domains(const struct cpumask *cpu_map, s= truct sched_domain_attr *att =20 ret =3D 0; error: -#ifdef CONFIG_SCHED_CACHE - /* - * TBD: check before writing to it. sched domain rebuild - * is not in the critical path, leave as-is for now. - */ - if (!ret && has_multi_llcs) - static_branch_enable_cpuslocked(&sched_cache_present); - else - static_branch_disable_cpuslocked(&sched_cache_present); - - _sched_cache_active_set(); -#endif + *multi_llcs =3D has_multi_llcs; __free_domain_allocs(&d, alloc_state, cpu_map); =20 return ret; @@ -3168,6 +3174,7 @@ void free_sched_domains(cpumask_var_t doms[], unsigne= d int ndoms) */ int __init sched_init_domains(const struct cpumask *cpu_map) { + bool multi_llcs; int err; =20 zalloc_cpumask_var(&sched_domains_llc_id_allocmask, GFP_KERNEL); @@ -3182,7 +3189,9 @@ int __init sched_init_domains(const struct cpumask *c= pu_map) if (!doms_cur) doms_cur =3D &fallback_doms; cpumask_and(doms_cur[0], cpu_map, housekeeping_cpumask(HK_TYPE_DOMAIN)); - err =3D build_sched_domains(doms_cur[0], NULL); + err =3D build_sched_domains(doms_cur[0], NULL, &multi_llcs); + if (!err) + sched_cache_set(multi_llcs); =20 return err; } @@ -3255,6 +3264,7 @@ static void partition_sched_domains_locked(int ndoms_= new, cpumask_var_t doms_new struct sched_domain_attr *dattr_new) { bool __maybe_unused has_eas =3D false; + bool has_multi_llcs =3D false, multi_llcs; int i, j, n; int new_topology; =20 @@ -3304,14 +3314,41 @@ match1: for (i =3D 0; i < ndoms_new; i++) { for (j =3D 0; j < n && !new_topology; j++) { if (cpumask_equal(doms_new[i], doms_cur[j]) && - dattrs_equal(dattr_new, i, dattr_cur, j)) + dattrs_equal(dattr_new, i, dattr_cur, j)) { + /* + * Reused partition has to be taken care + * of here, because there could be a corner + * case that if the reused partition is skipped + * and only new partition is considered, an + * incorrect has_multi_llcs would be set. For + * example: + * If the only multi-LLC partition is reused + * and a new single-LLC partition is built, + * sched_cache_set(false) disables cache-aware + * scheduling globally despite the reused + * multi-LLC partition still being active. + */ + struct sched_domain *sd; + int cpu =3D cpumask_first(doms_cur[j]); + + guard(rcu)(); + sd =3D rcu_dereference(cpu_rq(cpu)->sd); + while (sd && sd->parent && (sd->parent->flags & SD_SHARE_LLC)) + sd =3D sd->parent; + if (sd && (sd->flags & SD_SHARE_LLC) && sd->parent && + sd_in_multi_llcs(sd)) + has_multi_llcs =3D true; goto match2; + } } /* No match - add a new doms_new */ - build_sched_domains(doms_new[i], dattr_new ? dattr_new + i : NULL); + build_sched_domains(doms_new[i], dattr_new ? dattr_new + i : NULL, + &multi_llcs); + has_multi_llcs |=3D multi_llcs; match2: ; } + sched_cache_set(has_multi_llcs); =20 #if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL) /* Build perf domains: */