From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-yw1-f181.google.com (mail-yw1-f181.google.com [209.85.128.181]) (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 486E040D59B for ; Thu, 18 Jun 2026 01:29:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.181 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781746198; cv=none; b=Xm8zhUnyMYt4aWPDrW/bVsJTn8+1fR14Ovi9iRnQSNgvnnTP5klsIBGchLUb8OoAumjwt4r/zYR4VTtAKOjnktLbx6RMJv2F2AxtDx2MvEQCHzlHmXcEa5wWxJKKPUlGBd/7aR0/dHCHGjLlkw2TQLOW780xYcU6mR/RMC5vi+4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781746198; c=relaxed/simple; bh=lw/miI0XbeGPUFym6Eroc5/u+5lmE/kLPdLahFn/s88=; h=From:Date:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=tR/nfqH9aTZE902dZRig2r740IyPWec2/7ppw1SErFz/g+5ozJWtVK+6mkJcLP3I14wsJKO6rbpP8iL1OqQtMDr8u/rwrord5nKARQVJwkiHWOJJFTcnA7XNU863RLMTnqJBd2jO+JgVDtEGq9TL5rGr80JzxZmhKI1xOmgHQbE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=e/lT2VgZ; arc=none smtp.client-ip=209.85.128.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="e/lT2VgZ" Received: by mail-yw1-f181.google.com with SMTP id 00721157ae682-7dc2b658544so4719727b3.2 for ; Wed, 17 Jun 2026 18:29:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781746196; x=1782350996; darn=vger.kernel.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:date:from:from:to :cc:subject:date:message-id:reply-to; bh=u+alYNCkxrQ/dB0jJRt7Ak/k5NabTChbjuSX/WJhQCw=; b=e/lT2VgZQo6LRTmoAUVkjAh69OMqDegrCMMbO20cMxroqDv2/we4gItPNs+dT+v4dj 1RZYqfv+nSbjG3B7tXMcoIiVb65fbxevoQht1sw31AqQhqkhfVsaL9Gh3NfnF7/ymbRk JBiDNrSzdU5cg56z8w9jG3Lrmrxnkcr1G8B4Gvtwk4xOaWa9hYGn5JaeoZYxlgd80E7B x6MDBSxy2j5B6yBnzs4k5VWOLB9yrOICOtFMPT7Zld/NTRXU1JcO0KWaMzLdyLZWItRR 5QeGsN1po1rkUPBu8E9JpEC6k39Tjhebpocwku5uytkAAi/NpKMbMyoKMEco0SpMVEh8 4WfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781746196; x=1782350996; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=u+alYNCkxrQ/dB0jJRt7Ak/k5NabTChbjuSX/WJhQCw=; b=LghLwcyRV+6gADW1p4mUEvoK4itAAakN0QBjhyzbPaqJxhQ6SSfUNPhL6EyncLoEHQ LZOaPEFHPk6Vgj4OHs+bdCGe4jGxOM9NTcleAlmnmy0i+eEjFQV8eA6StVChXSBZ/rbo 25+cpF1XZnv2NBo+aMjDzlseHTNT9Ez1AmhcTuGX4zL8ucDNDmfKhlRr8K2TnuVkoyfm 8vNmaUt00LLae6DuRo7M9W+FxGyvIqbpdR+nDHd8UxzPd1QNO/Yjl7UjicUZiVROLKaC N1iFHboKbxMUS9D3it6zDQBRPetOf6UhGXoTrbBoSNKsSiZs6gOfLs3fhf0FjgwR9YO4 KgqA== X-Gm-Message-State: AOJu0YwHgSyqDzvBpwYzDUHOegL7/9m/oTkvTc0P6+IDYlEGXre8FkMn w1a0JZ4Ku+CQQgfmCnXe+tCJi1Us86IFN6eMsAMgAAWyheE1+yZzsDP7 X-Gm-Gg: AfdE7clIK0OUV0tmrscVXXaPADQSejsoxlX+3n6EW94zh4sn4mhyMJ0rUAnUDA3lGmu 3fnadWwcNUCBjKVtc0xAochV2vVznD2xDQB9Hxg7OfUc4sb+oJKlhs1KNJolKGoK1xrqGiMct1e fQbrXx+AvHO2SnqkTC6sIFgFTvd9xu4cLX4PTwkvKVuWYJuLWwQhqniR9gJVJ6D0+BeEhsu0BpM 0OHYbsmXv7nQ6lfAM5F7ACZStg178GIqSguQAp0aD+S9E+efFwJmvctI0yoO48UpatZDhjm+QxU forQJvlvrG7riRrE6XAdDkzV83IzmQE06lT/HcmWZcSff/XMe82lAIRAakgMvrKEGR8WKTHNu8g 2S888QXzEm6V+pxQSVuEtuQ0/6u9PX+s+QNUHEdFX4Sro50KLWRoZG+WUhgHuEI2c4Zf9wuhvYC o/mtg+fcQhv8h6s+cLGQ6V2ReLYSr9UCpExMArN7ps4hI4fA== X-Received: by 2002:a05:690c:4a13:b0:7ba:f2f1:86c0 with SMTP id 00721157ae682-7fe5bb2e368mr65954277b3.12.1781746196103; Wed, 17 Jun 2026 18:29:56 -0700 (PDT) Received: from localhost (syn-035-130-123-074.biz.spectrum.com. [35.130.123.74]) by smtp.gmail.com with ESMTPSA id 00721157ae682-7fd48ff006fsm51916817b3.40.2026.06.17.18.29.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Jun 2026 18:29:55 -0700 (PDT) From: Yury Norov X-Google-Original-From: Yury Norov Date: Wed, 17 Jun 2026 21:29:55 -0400 To: Shrikanth Hegde Cc: linux-kernel@vger.kernel.org, mingo@kernel.org, peterz@infradead.org, juri.lelli@redhat.com, vincent.guittot@linaro.org, yury.norov@gmail.com, kprateek.nayak@amd.com, iii@linux.ibm.com, tglx@kernel.org, gregkh@linuxfoundation.org, pbonzini@redhat.com, seanjc@google.com, vschneid@redhat.com, huschle@linux.ibm.com, rostedt@goodmis.org, dietmar.eggemann@arm.com, mgorman@suse.de, bsegall@google.com, maddy@linux.ibm.com, srikar@linux.ibm.com, hdanton@sina.com, chleroy@kernel.org, vineeth@bitbyteword.org, frederic@kernel.org, arighi@nvidia.com, pauld@redhat.com, christian.loehle@arm.com, tj@kernel.org, tommaso.cucinotta@gmail.com, maz@kernel.org, rafael@kernel.org Subject: Re: [PATCH v4 04/20] cpumask: Introduce cpu_preferred_mask Message-ID: References: <20260617174139.155540-1-sshegde@linux.ibm.com> <20260617174139.155540-5-sshegde@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20260617174139.155540-5-sshegde@linux.ibm.com> On Wed, Jun 17, 2026 at 11:11:23PM +0530, Shrikanth Hegde wrote: > This patch does > - Declare and Define cpu_preferred_mask. > - Get/Set helpers for it. > > Values are set/clear by the scheduler by detecting the steal time values. > > A CPU is set to preferred when it becomes active. Later it may be > marked as non-preferred depending on steal time values with > steal monitor being enabled. > > Always maintain design construct of preferred is subset of active. > i.e. preferred ⊆ active ⊆ online ⊆ present ⊆ possible > > Signed-off-by: Shrikanth Hegde > --- > v3->v4: > - Make preferred subser of active instead of online. s/subser/subset > > include/linux/cpumask.h | 21 ++++++++++++++++++++- > kernel/cpu.c | 14 ++++++++++++++ > kernel/sched/core.c | 5 +++++ > 3 files changed, 39 insertions(+), 1 deletion(-) > > diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h > index 80211900f373..30ea64cc1656 100644 > --- a/include/linux/cpumask.h > +++ b/include/linux/cpumask.h > @@ -120,12 +120,20 @@ extern struct cpumask __cpu_enabled_mask; > extern struct cpumask __cpu_present_mask; > extern struct cpumask __cpu_active_mask; > extern struct cpumask __cpu_dying_mask; > + > +#ifdef CONFIG_PREFERRED_CPU > +extern struct cpumask __cpu_preferred_mask; > +#else > +#define __cpu_preferred_mask __cpu_active_mask > +#endif > + > #define cpu_possible_mask ((const struct cpumask *)&__cpu_possible_mask) > #define cpu_online_mask ((const struct cpumask *)&__cpu_online_mask) > #define cpu_enabled_mask ((const struct cpumask *)&__cpu_enabled_mask) > #define cpu_present_mask ((const struct cpumask *)&__cpu_present_mask) > #define cpu_active_mask ((const struct cpumask *)&__cpu_active_mask) > #define cpu_dying_mask ((const struct cpumask *)&__cpu_dying_mask) > +#define cpu_preferred_mask ((const struct cpumask *)&__cpu_preferred_mask) > > extern atomic_t __num_online_cpus; > extern unsigned int __num_possible_cpus; > @@ -1164,6 +1172,7 @@ void init_cpu_possible(const struct cpumask *src); > > void set_cpu_online(unsigned int cpu, bool online); > void set_cpu_possible(unsigned int cpu, bool possible); > +void set_cpu_preferred(unsigned int cpu, bool preferred); > > /** > * to_cpumask - convert a NR_CPUS bitmap to a struct cpumask * > @@ -1256,7 +1265,12 @@ static __always_inline bool cpu_dying(unsigned int cpu) > return cpumask_test_cpu(cpu, cpu_dying_mask); > } > > -#else > +static __always_inline bool cpu_preferred(unsigned int cpu) > +{ > + return cpumask_test_cpu(cpu, cpu_preferred_mask); > +} > + > +#else /* NR_CPUS <= 1 */ > > #define num_online_cpus() 1U > #define num_possible_cpus() 1U > @@ -1294,6 +1308,11 @@ static __always_inline bool cpu_dying(unsigned int cpu) > return false; > } > > +static __always_inline bool cpu_preferred(unsigned int cpu) > +{ > + return cpu == 0; > +} > + > #endif /* NR_CPUS > 1 */ > > #define cpu_is_offline(cpu) unlikely(!cpu_online(cpu)) > diff --git a/kernel/cpu.c b/kernel/cpu.c > index bc4f7a9ba64e..c196ba5d8b2a 100644 > --- a/kernel/cpu.c > +++ b/kernel/cpu.c > @@ -3107,6 +3107,11 @@ EXPORT_SYMBOL(__cpu_dying_mask); > atomic_t __num_online_cpus __read_mostly; > EXPORT_SYMBOL(__num_online_cpus); > > +#ifdef CONFIG_PREFERRED_CPU > +struct cpumask __cpu_preferred_mask __read_mostly; > +EXPORT_SYMBOL(__cpu_preferred_mask); > +#endif > + > void init_cpu_present(const struct cpumask *src) > { > cpumask_copy(&__cpu_present_mask, src); > @@ -3154,6 +3159,14 @@ void set_cpu_possible(unsigned int cpu, bool possible) > } > } > > +void set_cpu_preferred(unsigned int cpu, bool preferred) > +{ > + if (!IS_ENABLED(CONFIG_PREFERRED_CPU)) > + return; > + > + assign_cpu((cpu), &__cpu_preferred_mask, (preferred)); > +} set_cpu_xxx() is a macro on purpose - it improves code generation quite a lot. See 5c563ee90a22d. Can you keep set_cpu_preferred aligned with the other set_cpu(), i.e. make it a macro? > + > /* > * Activate the first processor. > */ > @@ -3164,6 +3177,7 @@ void __init boot_cpu_init(void) > /* Mark the boot cpu "present", "online" etc for SMP and UP case */ > set_cpu_online(cpu, true); > set_cpu_active(cpu, true); > + set_cpu_preferred(cpu, true); > set_cpu_present(cpu, true); > set_cpu_possible(cpu, true); > > diff --git a/kernel/sched/core.c b/kernel/sched/core.c > index 2f4530eb543f..9e16946c9d62 100644 > --- a/kernel/sched/core.c > +++ b/kernel/sched/core.c > @@ -8685,6 +8685,9 @@ int sched_cpu_activate(unsigned int cpu) > */ > sched_set_rq_online(rq, cpu); > > + /* preferred is subset of active and follows its state */ > + set_cpu_preferred(cpu, true); Did you put it at the end of the function on purpose? If yes, please add a comment. If no, I'd prefer to have it immediately after set_cpu_active(). > + > return 0; > } > > @@ -8698,6 +8701,8 @@ int sched_cpu_deactivate(unsigned int cpu) > if (ret) > return ret; > > + set_cpu_preferred(cpu, false); > + > /* > * Remove CPU from nohz.idle_cpus_mask to prevent participating in > * load balancing when not active > -- > 2.47.3