All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tejun Heo <tj@kernel.org>
To: David Vernet <void@manifault.com>,
	Andrea Righi <arighi@nvidia.com>,
	Changwoo Min <changwoo@igalia.com>
Cc: Emil Tsalapatis <emil@etsalapatis.com>,
	sched-ext@lists.linux.dev, linux-kernel@vger.kernel.org,
	Tejun Heo <tj@kernel.org>
Subject: [PATCH 2/4] tools/sched_ext: Order single-cid cmask helpers as (cid, mask)
Date: Wed,  3 Jun 2026 16:00:30 -1000	[thread overview]
Message-ID: <20260604020032.3536466-3-tj@kernel.org> (raw)
In-Reply-To: <20260604020032.3536466-1-tj@kernel.org>

The BPF arena single-cid cmask helpers take the cmask first and the cid
second. Reorder them to (cid, mask) to match the kernel-side helpers and
the test_bit(nr, addr), cpumask_test_cpu(cpu, mask) convention. Range and
iteration helpers keep (mask, start).

Signed-off-by: Tejun Heo <tj@kernel.org>
---
 tools/sched_ext/include/scx/cid.bpf.h | 60 +++++++++++++--------------
 tools/sched_ext/scx_qmap.bpf.c        | 12 +++---
 2 files changed, 36 insertions(+), 36 deletions(-)

diff --git a/tools/sched_ext/include/scx/cid.bpf.h b/tools/sched_ext/include/scx/cid.bpf.h
index 70f2a3829af4..9d89bb57e201 100644
--- a/tools/sched_ext/include/scx/cid.bpf.h
+++ b/tools/sched_ext/include/scx/cid.bpf.h
@@ -40,12 +40,12 @@
  */
 #define CMASK_NR_WORDS(nr_cids)		((u32)(((u64)(nr_cids) + 63) / 64 + 1))
 
-static __always_inline bool __cmask_contains(const struct scx_cmask __arena *m, u32 cid)
+static __always_inline bool __cmask_contains(u32 cid, const struct scx_cmask __arena *m)
 {
 	return cid >= m->base && cid < m->base + m->nr_cids;
 }
 
-static __always_inline u64 __arena *__cmask_word(const struct scx_cmask __arena *m, u32 cid)
+static __always_inline u64 __arena *__cmask_word(u32 cid, const struct scx_cmask __arena *m)
 {
 	return (u64 __arena *)&m->bits[cid / 64 - m->base / 64];
 }
@@ -122,11 +122,11 @@ static __always_inline void cmask_reframe(struct scx_cmask __arena *m, u32 base,
 	m->nr_cids = nr_cids;
 }
 
-static __always_inline bool cmask_test(const struct scx_cmask __arena *m, u32 cid)
+static __always_inline bool cmask_test(u32 cid, const struct scx_cmask __arena *m)
 {
-	if (!__cmask_contains(m, cid))
+	if (!__cmask_contains(cid, m))
 		return false;
-	return *__cmask_word(m, cid) & BIT_U64(cid & 63);
+	return *__cmask_word(cid, m) & BIT_U64(cid & 63);
 }
 
 /*
@@ -140,15 +140,15 @@ static __always_inline bool cmask_test(const struct scx_cmask __arena *m, u32 ci
  */
 #define CMASK_CAS_TRIES		(1U << 23)
 
-static __always_inline void cmask_set(struct scx_cmask __arena *m, u32 cid)
+static __always_inline void cmask_set(u32 cid, struct scx_cmask __arena *m)
 {
 	u64 __arena *w;
 	u64 bit, old, new;
 	u32 i;
 
-	if (!__cmask_contains(m, cid))
+	if (!__cmask_contains(cid, m))
 		return;
-	w = __cmask_word(m, cid);
+	w = __cmask_word(cid, m);
 	bit = BIT_U64(cid & 63);
 	bpf_for(i, 0, CMASK_CAS_TRIES) {
 		old = *w;
@@ -161,15 +161,15 @@ static __always_inline void cmask_set(struct scx_cmask __arena *m, u32 cid)
 	scx_bpf_error("cmask_set CAS exhausted at cid %u", cid);
 }
 
-static __always_inline void cmask_clear(struct scx_cmask __arena *m, u32 cid)
+static __always_inline void cmask_clear(u32 cid, struct scx_cmask __arena *m)
 {
 	u64 __arena *w;
 	u64 bit, old, new;
 	u32 i;
 
-	if (!__cmask_contains(m, cid))
+	if (!__cmask_contains(cid, m))
 		return;
-	w = __cmask_word(m, cid);
+	w = __cmask_word(cid, m);
 	bit = BIT_U64(cid & 63);
 	bpf_for(i, 0, CMASK_CAS_TRIES) {
 		old = *w;
@@ -182,15 +182,15 @@ static __always_inline void cmask_clear(struct scx_cmask __arena *m, u32 cid)
 	scx_bpf_error("cmask_clear CAS exhausted at cid %u", cid);
 }
 
-static __always_inline bool cmask_test_and_set(struct scx_cmask __arena *m, u32 cid)
+static __always_inline bool cmask_test_and_set(u32 cid, struct scx_cmask __arena *m)
 {
 	u64 __arena *w;
 	u64 bit, old, new;
 	u32 i;
 
-	if (!__cmask_contains(m, cid))
+	if (!__cmask_contains(cid, m))
 		return false;
-	w = __cmask_word(m, cid);
+	w = __cmask_word(cid, m);
 	bit = BIT_U64(cid & 63);
 	bpf_for(i, 0, CMASK_CAS_TRIES) {
 		old = *w;
@@ -204,15 +204,15 @@ static __always_inline bool cmask_test_and_set(struct scx_cmask __arena *m, u32
 	return false;
 }
 
-static __always_inline bool cmask_test_and_clear(struct scx_cmask __arena *m, u32 cid)
+static __always_inline bool cmask_test_and_clear(u32 cid, struct scx_cmask __arena *m)
 {
 	u64 __arena *w;
 	u64 bit, old, new;
 	u32 i;
 
-	if (!__cmask_contains(m, cid))
+	if (!__cmask_contains(cid, m))
 		return false;
-	w = __cmask_word(m, cid);
+	w = __cmask_word(cid, m);
 	bit = BIT_U64(cid & 63);
 	bpf_for(i, 0, CMASK_CAS_TRIES) {
 		old = *w;
@@ -226,43 +226,43 @@ static __always_inline bool cmask_test_and_clear(struct scx_cmask __arena *m, u3
 	return false;
 }
 
-static __always_inline void __cmask_set(struct scx_cmask __arena *m, u32 cid)
+static __always_inline void __cmask_set(u32 cid, struct scx_cmask __arena *m)
 {
-	if (!__cmask_contains(m, cid))
+	if (!__cmask_contains(cid, m))
 		return;
-	*__cmask_word(m, cid) |= BIT_U64(cid & 63);
+	*__cmask_word(cid, m) |= BIT_U64(cid & 63);
 }
 
-static __always_inline void __cmask_clear(struct scx_cmask __arena *m, u32 cid)
+static __always_inline void __cmask_clear(u32 cid, struct scx_cmask __arena *m)
 {
-	if (!__cmask_contains(m, cid))
+	if (!__cmask_contains(cid, m))
 		return;
-	*__cmask_word(m, cid) &= ~BIT_U64(cid & 63);
+	*__cmask_word(cid, m) &= ~BIT_U64(cid & 63);
 }
 
-static __always_inline bool __cmask_test_and_set(struct scx_cmask __arena *m, u32 cid)
+static __always_inline bool __cmask_test_and_set(u32 cid, struct scx_cmask __arena *m)
 {
 	u64 bit = BIT_U64(cid & 63);
 	u64 __arena *w;
 	u64 prev;
 
-	if (!__cmask_contains(m, cid))
+	if (!__cmask_contains(cid, m))
 		return false;
-	w = __cmask_word(m, cid);
+	w = __cmask_word(cid, m);
 	prev = *w & bit;
 	*w |= bit;
 	return prev;
 }
 
-static __always_inline bool __cmask_test_and_clear(struct scx_cmask __arena *m, u32 cid)
+static __always_inline bool __cmask_test_and_clear(u32 cid, struct scx_cmask __arena *m)
 {
 	u64 bit = BIT_U64(cid & 63);
 	u64 __arena *w;
 	u64 prev;
 
-	if (!__cmask_contains(m, cid))
+	if (!__cmask_contains(cid, m))
 		return false;
-	w = __cmask_word(m, cid);
+	w = __cmask_word(cid, m);
 	prev = *w & bit;
 	*w &= ~bit;
 	return prev;
@@ -671,7 +671,7 @@ static __always_inline void cmask_from_cpumask(struct scx_cmask __arena *m,
 			continue;
 		cid = scx_bpf_cpu_to_cid(cpu);
 		if (cid >= 0)
-			__cmask_set(m, cid);
+			__cmask_set(cid, m);
 	}
 }
 
diff --git a/tools/sched_ext/scx_qmap.bpf.c b/tools/sched_ext/scx_qmap.bpf.c
index 8a2d6a8ebd8e..fd9a82a67627 100644
--- a/tools/sched_ext/scx_qmap.bpf.c
+++ b/tools/sched_ext/scx_qmap.bpf.c
@@ -214,7 +214,7 @@ static s32 pick_direct_dispatch_cid(struct task_struct *p, s32 prev_cid,
 	if (!always_enq_immed && p->nr_cpus_allowed == 1)
 		return prev_cid;
 
-	if (cmask_test_and_clear(qa_idle_cids, prev_cid))
+	if (cmask_test_and_clear(prev_cid, qa_idle_cids))
 		return prev_cid;
 
 	cid = prev_cid;
@@ -224,7 +224,7 @@ static s32 pick_direct_dispatch_cid(struct task_struct *p, s32 prev_cid,
 		barrier_var(cid);
 		if (cid >= nr_cids)
 			return -1;
-		if (cmask_test_and_clear(qa_idle_cids, cid))
+		if (cmask_test_and_clear(cid, qa_idle_cids))
 			return cid;
 	}
 	return -1;
@@ -534,7 +534,7 @@ static bool dispatch_highpri(bool from_timer)
 		if (!(taskc = lookup_task_ctx(p)))
 			return false;
 
-		if (cmask_test(&taskc->cpus_allowed, this_cid))
+		if (cmask_test(this_cid, &taskc->cpus_allowed))
 			cid = this_cid;
 		else
 			cid = cmask_next_set_wrap(&taskc->cpus_allowed,
@@ -656,7 +656,7 @@ void BPF_STRUCT_OPS(qmap_dispatch, s32 cid, struct task_struct *prev)
 			 * document this class of issue -- other schedulers
 			 * seeing similar warnings can use this as a reference.
 			 */
-			if (!cmask_test(&taskc->cpus_allowed, cid))
+			if (!cmask_test(cid, &taskc->cpus_allowed))
 				scx_bpf_kick_cid(scx_bpf_task_cid(p), 0);
 
 			batch--;
@@ -913,9 +913,9 @@ void BPF_STRUCT_OPS(qmap_update_idle, s32 cid, bool idle)
 {
 	QMAP_TOUCH_ARENA();
 	if (idle)
-		cmask_set(qa_idle_cids, cid);
+		cmask_set(cid, qa_idle_cids);
 	else
-		cmask_clear(qa_idle_cids, cid);
+		cmask_clear(cid, qa_idle_cids);
 }
 
 void BPF_STRUCT_OPS(qmap_set_cmask, struct task_struct *p,
-- 
2.54.0


  parent reply	other threads:[~2026-06-04  2:00 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-04  2:00 [PATCHSET v2 sched_ext/for-7.2] sched_ext: cid/cmask interface prep Tejun Heo
2026-06-04  2:00 ` [PATCH 1/4] sched_ext: Order single-cid cmask helpers as (cid, mask) Tejun Heo
2026-06-04  2:00 ` Tejun Heo [this message]
2026-06-04  2:00 ` [PATCH 3/4] sched_ext: Add scx_cmask_test() and scx_cmask_for_each_cid() Tejun Heo
2026-06-04  2:10   ` sashiko-bot
2026-06-04  2:00 ` [PATCH 4/4] sched_ext: Make scx_bpf_kick_cid() return s32 Tejun Heo
2026-06-04  6:18 ` [PATCHSET v2 sched_ext/for-7.2] sched_ext: cid/cmask interface prep Andrea Righi
2026-06-04  8:32 ` Tejun Heo

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=20260604020032.3536466-3-tj@kernel.org \
    --to=tj@kernel.org \
    --cc=arighi@nvidia.com \
    --cc=changwoo@igalia.com \
    --cc=emil@etsalapatis.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sched-ext@lists.linux.dev \
    --cc=void@manifault.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.