From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from CY3PR05CU001.outbound.protection.outlook.com (mail-westcentralusazon11013033.outbound.protection.outlook.com [40.93.201.33]) (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 8B3E064AA4 for ; Tue, 19 May 2026 06:43:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.201.33 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779173028; cv=fail; b=ZsRWHLp2vaFv5rRcjXSF7fZLa0WMtrKstz9Clm67Pix+dOc/gPmod4YEspy9OPPesDY5jtvA9p/4lw2o5EyrilXPpFfe2FA8d52TWEGBWBt6LrZT38vqwBVrVbwzWjvsqr526VQ+myS0gRkZvL33ky9cgfT8m/9OGQLBBGCEIbM= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779173028; c=relaxed/simple; bh=JSd3h0YREHC2yx+59t1eaC6COYBZZ93bqs25pR7MVuE=; h=Date:From:To:Cc:Subject:Message-ID:References:Content-Type: Content-Disposition:In-Reply-To:MIME-Version; b=mA8Y5sU3bkq8Z24zEAqQ59IVZ1mLDbpufo2ETGLOHJ/32iUPLYGWWurIhpGKFpj8MEI11N5kemTCvSk+uC+MXw5pazLaX8mtzvGlH3LqrHd7Ky1x5PrPGu5zgFWwzMRuSdEfcqwIvCcFt4itRrmf92w8ZVQIlD2ZxAz+37akJRU= ARC-Authentication-Results:i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=lmvWCut0; arc=fail smtp.client-ip=40.93.201.33 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="lmvWCut0" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=chJVkn9AXsnmJM4Cvvt6ZadVFRumh7+Kjvg96QnRB2fxXits4DUIQP00kOUKH3OzZAXJT2pByJ6hL5EatCePYxUW2eeoEuvrqW+I47mIbVpR1Vlwz+LiNhQK0euUNSWlJy79XD29c+AZGAcCukVFDGOA/XOhPOw1ivVgmaAPtwt4twzhqNPH6Sd6HJ8PztyYD7q00KE96ILSabcts9hFdgmwhKVtlMaub4b1YICM3gyx1CU1O9oBVClAlyG4yGTnL/1MCjilmBQy8h1MXD7L+o9hR0nmtzawIlgRVMT5rfB/Ea09HFd2NvkrmhQcYb8j2e8msdjTq5TCI64f1y4dSg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=lOGbHvuHtCmCq1OAgo8nARZhnPGQlGLJWDzWiY04f3c=; b=GxIUS077oIZmOLLqnwFc43LoWOWrDu2StjcdKwDNgGjHOPjG7YHk2Adozyu2m6kqeCEH7OlYchqJkeoCXVmQWx+tknqhOwjllE5E61JmkEr596i6aqe6ymh0yPw3I5vh4RwQ4/dYP8CJClw8IJ66SWds8M56fyHknFR+T+wBXLxU0+cZFy4F7xOufW37qGhatD4SBPh+kv10jk3Qej/jlhSq15l9EEgvSft+oYVrp9QkR5lKbOMHEypv5UFtQNfBcUNh01/yV5vKiVNGnA5HQESMT/cRJDXSaMzvAmCk/LfqQP8nZ0KrgfJ2iTIeHji0sJPhGAC1OG4YyB9nx2a3JA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lOGbHvuHtCmCq1OAgo8nARZhnPGQlGLJWDzWiY04f3c=; b=lmvWCut0WjqYvUL5N+AvmJMfH6z4kATcy86V+oxXC+xtdtz9P8LsWadSO9ttLlnyi9K2bc/IyPfLD31O0TK54F9Woj3TITgG1vELg884ppXcUFHLP5E5vH6n8harKuaQeo6vjD+OMcRHk4wDvrWaRSOaOFMenmVXg7x9cAi7/mlpinTDrB6kF3uFypCyB6z1NYFkTJf3xka5i9ZNETC7HhwV6UyKoIWEz91xo14A1lNf2K2+luK+awK04SxtBoa/sjSIfAYWzUR4Ko6vUTEWnUr0TxPaBtU4/nSUxsH7/PO8MAUxG4hZa7FWAbBGgyW//4N1+LzBMfEt8YxwuW8plQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DM6PR12MB4827.namprd12.prod.outlook.com (2603:10b6:5:1d6::14) by SJ0PR12MB7006.namprd12.prod.outlook.com (2603:10b6:a03:486::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.25.24; Tue, 19 May 2026 06:43:42 +0000 Received: from DM6PR12MB4827.namprd12.prod.outlook.com ([fe80::6261:3040:864b:159c]) by DM6PR12MB4827.namprd12.prod.outlook.com ([fe80::6261:3040:864b:159c%4]) with mapi id 15.20.9913.009; Tue, 19 May 2026 06:43:42 +0000 Date: Tue, 19 May 2026 08:43:35 +0200 From: Andrea Righi To: K Prateek Nayak Cc: Peter Zijlstra , Ingo Molnar , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Christian Loehle , Phil Auld , Koba Ko , Felix Abecassis , Balbir Singh , Joel Fernandes , Shrikanth Hegde , linux-kernel@vger.kernel.org, tim.c.chen@linux.intel.com, yu.c.chen@intel.com Subject: Re: [PATCH v2 2/5] sched/fair: Attach sched_domain_shared to sd_asym_cpucapacity Message-ID: References: <20260516055850.1345932-1-arighi@nvidia.com> <20260518205859.GY3126523@noisy.programming.kicks-ass.net> <81583f79-facf-473e-b756-31af724245bc@amd.com> Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <81583f79-facf-473e-b756-31af724245bc@amd.com> X-ClientProxiedBy: MI0P293CA0011.ITAP293.PROD.OUTLOOK.COM (2603:10a6:290:44::11) To DM6PR12MB4827.namprd12.prod.outlook.com (2603:10b6:5:1d6::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM6PR12MB4827:EE_|SJ0PR12MB7006:EE_ X-MS-Office365-Filtering-Correlation-Id: 749f4b68-6b97-4977-2dc6-08deb571f753 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|366016|1800799024|22082099003|18002099003|56012099003|4143699003|11063799003; X-Microsoft-Antispam-Message-Info: +GGuLdr/+oJ0oP4fRv/wW/lI6VxrcSj6Zu17XSv+Dkty4Rds63zN/mhmIjTfTIiNz2A55hC3YxC36+sybrbqHDQX7ugiWHyy3YDiisIzmP88mUXTyU0ZNq9RKOx641Q1X+BRPDLQcNwygan7V+fxOJl1O6aee3yVW+ierKEzy1Bj/jjeV+8OgpsGM6+ne5+qXlonIX7c92KF+dPwDCPhhmWXW+SMHAZTDqBfUtHAmzXd62p9GSFh+8HC37RP9i+KbYyvLAdqOxPs/rR6B5AgyRFyWkLZSKbexnOJHdDSwr+dW12i3fr5F/1q1Gm3offWVdpxMwp4YvHw9O7sk02lCIvX0lw0255lHhRhdhZJFapPHIEkg4u1O2b0+yNZQQCnXPwj1U/vw9PWJF/kFDBW1+CglFAeVcA4HgUlGw7JvCRg+Fhn8FSzpuPUSnKoavhjimwPHnrBatrLaZEAhVVpU7ZplfSb0cwBTwrl0sAiOUO7CGtVKimMRGW8UG7iolthV/jsDeJ6fHWppGOi1Be/RWgh7KW4JVWdg7Mcoj0MaID27Cby0dHtunrW741iiIjhuiK9MRNJJ0wlVrMxoivAhUoRzPN86PO4bevN0yWs/gb9c9O2FGlKVxcdkuz8+AYqf2Nh41/D7x5gKSeLUYYB9cI2o0aMV+RKxlIfp4aX5rA4KVpZOflVVdQhzQBym75q X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM6PR12MB4827.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(366016)(1800799024)(22082099003)(18002099003)(56012099003)(4143699003)(11063799003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?RrA4YyzjBz1Asb2HXxDdhfaONti6bRgie9BuR2Rx2shCchU1N0R1+ErPO7x7?= =?us-ascii?Q?x/k5/sjYT6EmHsWkI+vpX7QNWB2zy25oiLPeXBvGPndKQRG3aokZwJdCGI9q?= =?us-ascii?Q?hx9V0q5hluMEON2mwpxbzoeDNcYbE0idN1b4noxZ1AXV3YXqT2/tHSJxGIjG?= =?us-ascii?Q?Aajkr5xJnE7yAthLEJNso2A764dbaco8QTqdjKmnix7kATS04W5NOjlOhdzo?= =?us-ascii?Q?ukVH5pZVxA/aLNdSP+JlCTrRPwSRabaEwxpvRV+w0hiD4UxycyZMfTJxIJMS?= =?us-ascii?Q?JsaovZ1/ktq+CVEjc7t3O8kP5IVx/iXsaUFhbsqYNq+lHPbQTywlw9oG0DOs?= =?us-ascii?Q?lEZgjyKfNLDOEz8HKmuXNR7EwIIWuZfk3f6GtoWV2hbtpPH+zk/dwvHXqX28?= =?us-ascii?Q?TFVwIeGt4QhlIeNBVQFRkAhsC9we0C2yn7nx9bR0SuottyEA9g3CtFeXhvml?= =?us-ascii?Q?YyC0UfJF/sG46ViPD0yCiGtHBRV2QV4J4ioGD/4EQfe+RknrC4M7Xhq6v9Sr?= =?us-ascii?Q?7705W8Pgw88UENf0YrCY6Tk/3uqctb3e9njUFuejBUhj6e/fjMQb5cua8ESO?= =?us-ascii?Q?x/zOzON7aun+CchI7T44nmqfaamD82XQORgdmTLiLI3qRhmyqweE5S5B4Nvp?= =?us-ascii?Q?hK0nZZ1HAY6Bx72bD+sQ3FxCQdNAbUavoGkqOCbrQQ09arSnWwK3MXuqBB9N?= =?us-ascii?Q?koyxazQlIsK5q9hAJGKCp3RIFPLh5XlQ1U1qFNQATrErXPeqFzKToYeHSQsS?= =?us-ascii?Q?u/+KfdxC7hO35k8/HzHYB/w6m8YNxAN7I0bgFqcz5rVdLpd7wS+9tqzJnUjh?= =?us-ascii?Q?aWJwpp+BYhhrycPJ2hH0O40G7ZckG4hLrNEiiI+fqM+Nf+wZJL73K0Z1P1b6?= =?us-ascii?Q?GBd8+z9vXZ0pp7jqjr8XcboQBeW++NcTnRe300zTggtozpuW9Ain5Ug65Dv2?= =?us-ascii?Q?GpHPUfJKL7xkGSLu791YC37xX3wuW8LDuIAW1DSVtrTpKqogxvnO6YNhehLa?= =?us-ascii?Q?UBxACizXbhWKVEzgHpfKpRPJ2UyWj0MDGGBPAxnl6oaT0A9znRR2CVfFcC+E?= =?us-ascii?Q?qAhTGF9pS3SUl8Q97rckJ6DDtens8hRdmbSFJYtkrttRR4NPjolKyrCaQcew?= =?us-ascii?Q?coO6xudQ8DK51W9fDBeEVUuPpwijqMFZDApwlQGkka1FcPtbQlZP1IVFEIkL?= =?us-ascii?Q?fVvYWlyVv7l6SaygalH2eOn5wXmxvVzWHeqTarB2RGQNCs5cDZJbFLFFLJv2?= =?us-ascii?Q?o1gG/cv+MR+U64nkMPAz5yffJG6vG+vgKGvu0909JAPNlh/m2RwRLLiDG29X?= =?us-ascii?Q?A/D8ev+xouurmFw27STq0xCuZH1xB9t0NtXwM0DGiey0FNs6O65jVxO0Huv7?= =?us-ascii?Q?Bk2rnFQB0HSl7hIxBITM8TFDreZwT0qtRJYcez5/nAFjsKKnG5ODz3/yCTK4?= =?us-ascii?Q?HMVrEcoq/9Sf9dkcQxlvL6eplaw83cqbNaNNGKVrSdJoS8yOF5IInWbtHkXn?= =?us-ascii?Q?oVPQOwEmlBB7Hj8+sqhWfKXolzIEEAXG28CwWzwasKKNLhFSMYqvc3BmqEvU?= =?us-ascii?Q?U37EEZxt7i6VZZMzXx/W1cB3jrtM5u3UWC8hZv0U3e42/23KKiLVkVQgIGZ5?= =?us-ascii?Q?KuoyM2wwWQTqeIy2PpY1ZKxeqnQe+58Gsny/IqNS6xirDIO6RD125n0Cxj5L?= =?us-ascii?Q?bHVpfqW9OYnq1S1cf+hOyAjMuPldNu+Wj/NqpZ/GMfIO1ryI?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 749f4b68-6b97-4977-2dc6-08deb571f753 X-MS-Exchange-CrossTenant-AuthSource: DM6PR12MB4827.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 May 2026 06:43:42.4308 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 4gzdcokUhoS8IPs0fGgWlctF19XfxTvxdYnWARPGOwec1JIiL/rbtVAYZtsVy1F54EzLEvpV8DGySWjusZRRgA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR12MB7006 Hi Prateek, On Tue, May 19, 2026 at 11:22:32AM +0530, K Prateek Nayak wrote: > Hello Peter, Andrea, > > On 5/19/2026 2:28 AM, Peter Zijlstra wrote: > > @@@ -2775,20 -3049,16 +3107,15 @@@ build_sched_domains(const struct cpumas > > if (!sd) > > continue; > > > > + if (has_asym) > > - asym_claimed = claim_asym_sched_domain_shared(&d, i); > > ++ claim_asym_sched_domain_shared(&d, i); > > + > > /* First, find the topmost SD_SHARE_LLC domain */ > > while (sd->parent && (sd->parent->flags & SD_SHARE_LLC)) > > sd = sd->parent; > > > > if (sd->flags & SD_SHARE_LLC) { > > - /* > > - * Initialize the sd->shared for SD_SHARE_LLC unless > > - * the asym path above already claimed it. > > - */ > > - if (!asym_claimed) > > - init_sched_domain_shared(&d, sd); > > - int sd_id = cpumask_first(sched_domain_span(sd)); > > - > > - sd->shared = *per_cpu_ptr(d.sds, sd_id); > > - atomic_set(&sd->shared->nr_busy_cpus, sd->span_weight); > > - atomic_inc(&sd->shared->ref); > > ++ init_sched_domain_shared(&d, sd); > > This will run into a small problem with "nr_idle_scan" if > cpumask_first(sched_domain_span(sd)) is the same for both sd_asym and > sd_llc. Ah, good catch! When cpumask_first(asym_span) == cpumask_first(llc_span) (big.LITTLE typical case), both sd_asym->shared and sd_llc->shared would alias to d->sds[0]. > > Load balancer at different domains will populate "nr_idle_scan" with > different values and they alias to same ->shared if one isn't > degenerated and I believe there is at least one way to hit the WARN_ON() > from cpu_attach_domain() if the SD_ASYM_CPUCAPACITY_FULL comes before > the last SD_SHARE_LLC domain and the latter is degenerated. > > How about this: > > (On top of queue:sched/core; Lightly tested on !ASYM_CPUCAPACITY system) > > diff --git a/include/linux/sched/topology.h b/include/linux/sched/topology.h > index fe09d3268bc9..1d2c98dca211 100644 > --- a/include/linux/sched/topology.h > +++ b/include/linux/sched/topology.h > @@ -67,7 +67,15 @@ struct sched_domain_shared { > atomic_t ref; > atomic_t nr_busy_cpus; > int has_idle_cores; > - int nr_idle_scan; > + union { > + int nr_idle_scan; > + /* > + * Used during allocation to claim the > + * sched_domain_shared object at > + * multiple levels. I think between build and the first LB tick, readers of nr_idle_scan may observe leftover SD_* flags in nr_idle_scan. This shouldn't be a problem and should self-heal soon, but maybe it's worth a comment? Something like: * Note: between build and the first periodic LB tick, which * rewrites the union via update_idle_cpu_scan(), readers of * nr_idle_scan may observe the transient SD_* flag value as * the scan bound. The flag bits are small positive integers, * so the effect is just a slightly relaxed scan bound for one * window and self-heals on the first tick. > + */ > + int alloc_flags; > + }; > #ifdef CONFIG_SCHED_CACHE > unsigned long util_avg; > unsigned long capacity; > diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c > index dbfd9657f897..9ebd14652e9d 100644 > --- a/kernel/sched/topology.c > +++ b/kernel/sched/topology.c > @@ -623,6 +623,12 @@ static void free_sched_groups(struct sched_group *sg, int free_sgc) > } while (sg != first); > } > > +static void free_sched_domain_shared(struct sched_domain_shared *sds) > +{ > + if (sds && atomic_dec_and_test(&sds->ref)) > + kfree(sds); > +} > + > static void destroy_sched_domain(struct sched_domain *sd) > { > /* > @@ -631,9 +637,7 @@ static void destroy_sched_domain(struct sched_domain *sd) > * dropping group/capacity references, freeing where none remain. > */ > free_sched_groups(sd->groups, 1); > - > - if (sd->shared && atomic_dec_and_test(&sd->shared->ref)) > - kfree(sd->shared); > + free_sched_domain_shared(sd->shared); > > #ifdef CONFIG_SCHED_CACHE > /* only the bottom sd has llc_counts array */ > @@ -755,7 +759,14 @@ cpu_attach_domain(struct sched_domain *sd, struct root_domain *rd, int cpu) > > /* Pick reference to parent->shared. */ > if (parent->shared) { > - WARN_ON_ONCE(tmp->shared); > + /* > + * It is safe to free a sd->shared that > + * has not been published yet. If a > + * sd->shared was published, the refcount > + * will end up being non-zero and it will > + * not be freed here. > + */ > + free_sched_domain_shared(tmp->shared); > tmp->shared = parent->shared; > parent->shared = NULL; > } > @@ -2916,11 +2927,40 @@ static void adjust_numa_imbalance(struct sched_domain *sd_llc) > } > } > > -static void init_sched_domain_shared(struct s_data *d, struct sched_domain *sd) > +static void > +init_sched_domain_shared(struct s_data *d, struct sched_domain *sd, int flags) > { > - int sd_id = cpumask_first(sched_domain_span(sd)); > + int cpu; > + > + /* > + * Multiple domains can try to claim a shared object like > + * SD_ASYM_CPUCAPACITY and SD_SHARE_LLC which can alias to > + * same cpumask_first(sched_domain_span(sd)) CPU and can > + * cause "nr_idle_scan" to be populated incorrectly during > + * load balncing. nit: s/balncing/balancing/ > + * > + * Find the first CPU in sched_domain_span(sd) with an > + * unclaimed domain (!alloc_flags) or where the alloc_flag > + * matches the requested flag (SD_* flag) > + */ > + for_each_cpu(cpu, sched_domain_span(sd)) { > + struct sched_domain_shared *sds = *per_cpu_ptr(d->sds, cpu); > + > + /* > + * If the domain only has single CPU, allow temporary overlap > + * in allocation since the domains will be degenerated anyways. > + */ > + if (!sds->alloc_flags || > + sd->span_weight == 1 || > + sds->alloc_flags == flags) { > + sds->alloc_flags = flags; > + sd->shared = sds; > + break; > + } > + } > + > + BUG_ON(!sd->shared); Unreachable in practice, but should we have a WARN_ON_ONCE() + bail/early-return? In this way we'd fall back to using LLC's shared for sd_balance_shared, which seems nicer than a BUG_ON(). > > - sd->shared = *per_cpu_ptr(d->sds, sd_id); > /* > * nr_busy_cpus is consumed only by the NOHZ kick path via > * sd_balance_shared; on the asym-capacity path it is initialized but > @@ -2960,7 +3000,7 @@ static bool claim_asym_sched_domain_shared(struct s_data *d, int cpu) > if (!sd_asym || (sd_asym->flags & SD_NUMA)) > return false; > > - init_sched_domain_shared(d, sd_asym); > + init_sched_domain_shared(d, sd_asym, SD_ASYM_CPUCAPACITY); > return true; > } > > @@ -3115,7 +3155,7 @@ build_sched_domains(const struct cpumask *cpu_map, struct sched_domain_attr *att > sd = sd->parent; > > if (sd->flags & SD_SHARE_LLC) { > - init_sched_domain_shared(&d, sd); > + init_sched_domain_shared(&d, sd, SD_SHARE_LLC); > > /* > * In presence of higher domains, adjust the > -- > Thanks and Regards, > Prateek > Thanks, -Andrea