From: Shrikanth Hegde <sshegde@linux.ibm.com>
To: Dietmar Eggemann <dietmar.eggemann@arm.com>,
Vincent Guittot <vincent.guittot@linaro.org>,
Yury Norov <ynorov@nvidia.com>,
yury.norov@gmail.com
Cc: linux-kernel@vger.kernel.org, mingo@kernel.org,
peterz@infradead.org, juri.lelli@redhat.com,
kprateek.nayak@amd.com, iii@linux.ibm.com, corbet@lwn.net,
meted@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, 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,
rdunlap@infradead.org, kernellwp@gmail.com,
linux-doc@vger.kernel.org, jgross@suse.com,
virtualization@lists.linux.dev, sunlightlinux@gmail.com
Subject: Re: [PATCH v11 05/12] sched/core: Try to use a preferred CPU in is_cpu_allowed
Date: Wed, 2 Sep 2026 14:03:01 +0530 [thread overview]
Message-ID: <8de8d33f-b3e5-407c-98bb-65e8ebe3e100@linux.ibm.com> (raw)
In-Reply-To: <3368b089-32ce-4521-ab19-e37c9f029b8b@arm.com>
On 9/1/26 5:51 PM, Dietmar Eggemann wrote:
> On 01.09.26 08:21, Vincent Guittot wrote:
>> On Mon, 31 Aug 2026 at 18:54, Yury Norov <ynorov@nvidia.com> wrote:
>>>
>>> On Mon, Aug 31, 2026 at 05:09:41PM +0200, Vincent Guittot wrote:
>>>
>>>>> Dietmar/Vincent,
>>>>> Do you think it makes sense to enable the driver on ARM64 now?
>>>>> Or you think it is better to delay it and once the feature is stable
>>>>> ARM ecosystem can enable it?
>>>>
>>>> It's always better to support all arch by default, unless something is
>>>> missing which is not the case here.
>>>
>>> ARM64 testing is obviously missed.
>>
>> But the cpumask is already available not like if you need to create a new one
>
> IMHO, when testing the steal_governor on arm64 w/o
> `allow_mismatched_32bit_el0`, I wouldn't expect much difference in this
> respect compared to the architectures already tested.
>
> Also, AFAIK, `allow_mismatched_32bit_el0` was mainly relevant for
> Android devices up to Android 13 that supported 32-bit userspace, so I
> wouldn't expect it to be commonly enabled on recent devices.
Ok. So it is a narrow window in a relatively older versions.
>
> As Vincent pointed out, `task_cpu_possible_mask(p)` (which defaults to
> `cpu_possible_mask`) is already used in `kernel/sched/core.c` and
> `kernel/cgroup/cpuset.c` to support `allow_mismatched_32bit_el0`.
>
Based on the discussion so far, I think we can keep the feature generic
for now. If a concrete architecture- or hypervisor-specific limitation is
identified and cannot be addressed in the generic code, then we can add
Kconfig gating. So far, there is no such case being identified and current
generic version is in good shape IMHO.
I have added cpumask_intersects_and and used that for valid cpu check.
Please see the v11->v12 diff attached at the end.
cpumask_intersects_and could also be used in other places such as
drivers/cpuidle/coupled.c:cpuidle_coupled_any_pokes_pending.
Patch for that will be sent separately.
If any of the above doesn't make sense, Please let me know.
I am planning to send v12 post running the workloads and sanity checks.
I have run cpumask_intersects vs cpumask_intersects_and with the workloads
I am currently running and did not observe a measurable difference.
---
include/linux/bitmap.h | 14 ++++++++++++++
include/linux/cpumask.h | 18 ++++++++++++++++++
kernel/sched/core.c | 16 ++--------------
lib/bitmap.c | 17 +++++++++++++++++
4 files changed, 51 insertions(+), 14 deletions(-)
diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h
index b007d54a9036..e595d189047b 100644
--- a/include/linux/bitmap.h
+++ b/include/linux/bitmap.h
@@ -52,6 +52,7 @@ struct device;
* bitmap_complement(dst, src, nbits) *dst = ~(*src)
* bitmap_equal(src1, src2, nbits) Are *src1 and *src2 equal?
* bitmap_intersects(src1, src2, nbits) Do *src1 and *src2 overlap?
+ * bitmap_intersects_and(src1, src2, src3, nbits) Do *src1, *src2 and *src3 overlap?
* bitmap_subset(src1, src2, nbits) Is *src1 a subset of *src2?
* bitmap_empty(src, nbits) Are all bits zero in *src?
* bitmap_full(src, nbits) Are all bits set in *src?
@@ -181,6 +182,9 @@ void __bitmap_replace(unsigned long *dst,
const unsigned long *mask, unsigned int nbits);
bool __bitmap_intersects(const unsigned long *bitmap1,
const unsigned long *bitmap2, unsigned int nbits);
+bool __bitmap_intersects_and(const unsigned long *bitmap1,
+ const unsigned long *bitmap2,
+ const unsigned long *bitmap3, unsigned int nbits);
bool __bitmap_subset(const unsigned long *bitmap1,
const unsigned long *bitmap2, unsigned int nbits);
unsigned int __bitmap_weight(const unsigned long *bitmap, unsigned int nbits);
@@ -442,6 +446,16 @@ bool bitmap_intersects(const unsigned long *src1, const unsigned long *src2, uns
return __bitmap_intersects(src1, src2, nbits);
}
+static __always_inline
+bool bitmap_intersects_and(const unsigned long *src1, const unsigned long *src2,
+ const unsigned long *src3, unsigned int nbits)
+{
+ if (small_const_nbits(nbits))
+ return ((*src1 & *src2 & *src3) & BITMAP_LAST_WORD_MASK(nbits)) != 0;
+ else
+ return __bitmap_intersects_and(src1, src2, src3, nbits);
+}
+
static __always_inline
bool bitmap_subset(const unsigned long *src1, const unsigned long *src2, unsigned int nbits)
{
diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h
index 34d08a3d80e1..d7f59bf32d32 100644
--- a/include/linux/cpumask.h
+++ b/include/linux/cpumask.h
@@ -833,6 +833,24 @@ bool cpumask_intersects(const struct cpumask *src1p, const struct cpumask *src2p
small_cpumask_bits);
}
+/**
+ * cpumask_intersects_and - (*src1p & *src2p & *src3p) != 0
+ * @src1p: the first input
+ * @src2p: the second input
+ * @src3p: the third input
+ *
+ * Return: true if AND of the three cpumasks is non-empty,
+ * otherwise false
+ */
+static __always_inline
+bool cpumask_intersects_and(const struct cpumask *src1p,
+ const struct cpumask *src2p,
+ const struct cpumask *src3p)
+{
+ return bitmap_intersects_and(cpumask_bits(src1p), cpumask_bits(src2p),
+ cpumask_bits(src3p), small_cpumask_bits);
+}
+
/**
* cpumask_subset - (*src1p & ~*src2p) == 0
* @src1p: the first input
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index e73d2dd997b3..0dd1d92a23db 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -2496,9 +2496,6 @@ static inline bool rq_has_pinned_tasks(struct rq *rq)
static inline bool task_can_sched_on_preferred(int cpu, struct task_struct *p)
{
- const struct cpumask *valid_mask;
- int i;
-
if (cpu_preferred(cpu))
return false;
@@ -2510,17 +2507,8 @@ static inline bool task_can_sched_on_preferred(int cpu, struct task_struct *p)
if (unlikely(!cpumask_test_cpu(task_cpu(p), p->cpus_ptr)))
return false;
- valid_mask = task_cpu_possible_mask(p);
- if (likely(valid_mask == cpu_possible_mask))
- return cpumask_intersects(p->cpus_ptr, cpu_preferred_mask);
-
- /* Tasks with arch-specific CPU masks. e.g. 32-bit tasks on arm64. */
- for_each_cpu_and(i, p->cpus_ptr, cpu_preferred_mask) {
- if (cpumask_test_cpu(i, valid_mask))
- return true;
- }
-
- return false;
+ return cpumask_intersects_and(p->cpus_ptr, cpu_preferred_mask,
+ task_cpu_possible_mask(p));
}
/*
diff --git a/lib/bitmap.c b/lib/bitmap.c
index b9bfa157e095..34e202800c5d 100644
--- a/lib/bitmap.c
+++ b/lib/bitmap.c
@@ -308,6 +308,23 @@ bool __bitmap_intersects(const unsigned long *bitmap1,
}
EXPORT_SYMBOL(__bitmap_intersects);
+bool __bitmap_intersects_and(const unsigned long *bitmap1,
+ const unsigned long *bitmap2,
+ const unsigned long *bitmap3, unsigned int bits)
+{
+ unsigned int k, lim = bits / BITS_PER_LONG;
+
+ for (k = 0; k < lim; ++k)
+ if (bitmap1[k] & bitmap2[k] & bitmap3[k])
+ return true;
+
+ if (bits % BITS_PER_LONG)
+ if ((bitmap1[k] & bitmap2[k] & bitmap3[k]) & BITMAP_LAST_WORD_MASK(bits))
+ return true;
+ return false;
+}
+EXPORT_SYMBOL(__bitmap_intersects_and);
+
bool __bitmap_subset(const unsigned long *bitmap1,
const unsigned long *bitmap2, unsigned int bits)
{
--
2.52.0
next prev parent reply other threads:[~2026-09-02 8:33 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-25 10:38 [PATCH v11 00/12] sched, steal_governor: Introduce preferred CPUs and steal-driven vCPU backoff Shrikanth Hegde
2026-08-25 10:38 ` [PATCH v11 01/12] sched/cputime: Add kcpustat_field_total helper Shrikanth Hegde
2026-08-25 10:38 ` [PATCH v11 02/12] sched/docs: Document cpu_preferred_mask and Preferred CPU concept Shrikanth Hegde
2026-08-25 10:38 ` [PATCH v11 03/12] cpumask: Introduce cpu_preferred_mask Shrikanth Hegde
2026-08-25 10:38 ` [PATCH v11 04/12] sysfs: Add preferred CPU file Shrikanth Hegde
2026-08-25 10:38 ` [PATCH v11 05/12] sched/core: Try to use a preferred CPU in is_cpu_allowed Shrikanth Hegde
2026-08-28 7:51 ` Dietmar Eggemann
2026-08-28 10:38 ` Vincent Guittot
2026-08-28 10:59 ` Shrikanth Hegde
2026-08-29 19:31 ` Yury Norov
2026-08-31 2:18 ` Shrikanth Hegde
2026-08-31 15:09 ` Vincent Guittot
2026-08-31 16:53 ` Yury Norov
2026-09-01 6:21 ` Vincent Guittot
2026-09-01 12:21 ` Dietmar Eggemann
2026-09-02 8:33 ` Shrikanth Hegde [this message]
2026-08-25 10:38 ` [PATCH v11 06/12] sched/fair: Load balance only among preferred CPUs Shrikanth Hegde
2026-08-25 10:38 ` [PATCH v11 07/12] sched/core: Push current task from non preferred CPU Shrikanth Hegde
2026-08-25 10:38 ` [PATCH v11 08/12] sched/debug: Add migration stats due to non preferred CPUs Shrikanth Hegde
2026-08-25 10:38 ` [PATCH v11 09/12] virt: Introduce steal governor driver Shrikanth Hegde
2026-08-25 10:38 ` [PATCH v11 10/12] virt/steal_governor: Add control knobs for handling steal values Shrikanth Hegde
2026-08-25 10:38 ` [PATCH v11 11/12] virt/steal_governor: Implement steal_governor policy loop Shrikanth Hegde
2026-08-25 10:38 ` [PATCH v11 12/12] virt/steal_governor: Enable the driver Shrikanth Hegde
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8de8d33f-b3e5-407c-98bb-65e8ebe3e100@linux.ibm.com \
--to=sshegde@linux.ibm.com \
--cc=arighi@nvidia.com \
--cc=chleroy@kernel.org \
--cc=christian.loehle@arm.com \
--cc=corbet@lwn.net \
--cc=dietmar.eggemann@arm.com \
--cc=frederic@kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=hdanton@sina.com \
--cc=huschle@linux.ibm.com \
--cc=iii@linux.ibm.com \
--cc=jgross@suse.com \
--cc=juri.lelli@redhat.com \
--cc=kernellwp@gmail.com \
--cc=kprateek.nayak@amd.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maddy@linux.ibm.com \
--cc=maz@kernel.org \
--cc=meted@linux.ibm.com \
--cc=mingo@kernel.org \
--cc=pauld@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peterz@infradead.org \
--cc=rafael@kernel.org \
--cc=rdunlap@infradead.org \
--cc=rostedt@goodmis.org \
--cc=seanjc@google.com \
--cc=srikar@linux.ibm.com \
--cc=sunlightlinux@gmail.com \
--cc=tglx@kernel.org \
--cc=tj@kernel.org \
--cc=tommaso.cucinotta@gmail.com \
--cc=vincent.guittot@linaro.org \
--cc=vineeth@bitbyteword.org \
--cc=virtualization@lists.linux.dev \
--cc=vschneid@redhat.com \
--cc=ynorov@nvidia.com \
--cc=yury.norov@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®