git: 9eba574a6761 - stable/14 - runq: New function runq_is_queue_empty(); Use it in ULE
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 28 Jul 2025 13:31:19 UTC
The branch stable/14 has been updated by olce:
URL: https://cgit.FreeBSD.org/src/commit/?id=9eba574a676191e2f2aaaa0401dcd887e25fb961
commit 9eba574a676191e2f2aaaa0401dcd887e25fb961
Author: Olivier Certner <olce@FreeBSD.org>
AuthorDate: 2024-05-23 15:31:06 +0000
Commit: Olivier Certner <olce@FreeBSD.org>
CommitDate: 2025-07-28 13:28:13 +0000
runq: New function runq_is_queue_empty(); Use it in ULE
Indicates if some particular queue of the runqueue is empty.
Reviewed by: kib
MFC after: 1 month
Event: Kitchener-Waterloo Hackathon 202506
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D45387
(cherry picked from commit a31193172cb98bd1fb242555ca8e122efff74258)
---
sys/kern/kern_switch.c | 28 ++++++++++++++++++++++++++++
sys/kern/sched_ule.c | 2 +-
sys/sys/runq.h | 1 +
3 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/sys/kern/kern_switch.c b/sys/kern/kern_switch.c
index eb39ca88992c..b23dfa162c4f 100644
--- a/sys/kern/kern_switch.c
+++ b/sys/kern/kern_switch.c
@@ -271,10 +271,13 @@ static inline uintptr_t runq_sw_set_not_empty_op(int idx, int sw_idx,
rqsw_t sw_bit, rqsw_t *swp);
static inline uintptr_t runq_sw_set_empty_op(int idx, int sw_idx,
rqsw_t sw_bit, rqsw_t *swp);
+static inline uintptr_t runq_sw_is_empty_op(int idx, int sw_idx,
+ rqsw_t sw_bit, rqsw_t *swp);
/* Status words' individual bit manipulators. */
static inline void runq_sw_set_not_empty(struct runq *rq, int idx);
static inline void runq_sw_set_empty(struct runq *rq, int idx);
+static inline bool runq_sw_is_empty(struct runq *rq, int idx);
/*
* Initialize a run structure.
@@ -358,6 +361,31 @@ runq_sw_set_empty(struct runq *rq, int idx)
(void)runq_sw_apply(rq, idx, &runq_sw_set_empty_op);
}
+static inline uintptr_t
+runq_sw_is_empty_op(int idx, int sw_idx, rqsw_t sw_bit, rqsw_t *swp)
+{
+ return ((*swp & sw_bit) == 0);
+}
+
+/*
+ * Returns whether the status words indicate that some queue is empty.
+ */
+static inline bool
+runq_sw_is_empty(struct runq *rq, int idx)
+{
+ return (runq_sw_apply(rq, idx, &runq_sw_is_empty_op));
+}
+
+/*
+ * Returns whether a particular queue is empty.
+ */
+bool
+runq_is_queue_empty(struct runq *rq, int idx)
+{
+
+ return (runq_sw_is_empty(rq, idx));
+}
+
/*
* Add the thread to the queue specified by its priority, and set the
* corresponding status bit.
diff --git a/sys/kern/sched_ule.c b/sys/kern/sched_ule.c
index 8fdc71c21e64..d8abb911a887 100644
--- a/sys/kern/sched_ule.c
+++ b/sys/kern/sched_ule.c
@@ -2605,7 +2605,7 @@ sched_clock(struct thread *td, int cnt)
*/
if (tdq->tdq_idx == tdq->tdq_ridx) {
tdq->tdq_idx = (tdq->tdq_idx + 1) % RQ_NQS;
- if (TAILQ_EMPTY(&tdq->tdq_timeshare.rq_queues[tdq->tdq_ridx]))
+ if (runq_is_queue_empty(&tdq->tdq_timeshare, tdq->tdq_ridx))
tdq->tdq_ridx = tdq->tdq_idx;
}
ts = td_get_sched(td);
diff --git a/sys/sys/runq.h b/sys/sys/runq.h
index c570dd25503b..5156a7d8c307 100644
--- a/sys/sys/runq.h
+++ b/sys/sys/runq.h
@@ -98,6 +98,7 @@ struct runq {
};
void runq_init(struct runq *);
+bool runq_is_queue_empty(struct runq *, int _idx);
void runq_add(struct runq *, struct thread *, int _flags);
void runq_add_idx(struct runq *, struct thread *, int _idx, int _flags);
bool runq_remove(struct runq *, struct thread *);