git: 606087082472 - stable/14 - runq: Re-order functions more logically
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 28 Jul 2025 13:31:14 UTC
The branch stable/14 has been updated by olce:
URL: https://cgit.FreeBSD.org/src/commit/?id=60608708247207a69d3ec88e4cb05b066d3f3b74
commit 60608708247207a69d3ec88e4cb05b066d3f3b74
Author: Olivier Certner <olce@FreeBSD.org>
AuthorDate: 2024-03-01 13:26:39 +0000
Commit: Olivier Certner <olce@FreeBSD.org>
CommitDate: 2025-07-28 13:28:07 +0000
runq: Re-order functions more logically
No code change in moved functions.
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 200fc93dace76cf251460adc58ca809c36031f3e)
---
sys/kern/kern_switch.c | 201 +++++++++++++++++++++++++------------------------
sys/sys/runq.h | 7 +-
2 files changed, 105 insertions(+), 103 deletions(-)
diff --git a/sys/kern/kern_switch.c b/sys/kern/kern_switch.c
index 9e63709d0acc..69e6f4818e40 100644
--- a/sys/kern/kern_switch.c
+++ b/sys/kern/kern_switch.c
@@ -274,6 +274,24 @@ runq_init(struct runq *rq)
TAILQ_INIT(&rq->rq_queues[i]);
}
+/*
+ * Set the status bit of the queue at index 'idx', indicating that it is
+ * non-empty.
+ */
+static __inline void
+runq_setbit(struct runq *rq, int idx)
+{
+ struct rq_status *rqs;
+
+ CHECK_IDX(idx);
+ rqs = &rq->rq_status;
+ CTR4(KTR_RUNQ, "runq_setbit: bits=%#x %#x bit=%#x word=%d",
+ rqs->rq_sw[RQSW_IDX(idx)],
+ rqs->rq_sw[RQSW_IDX(idx)] | RQSW_BIT(idx),
+ RQSW_BIT(idx), RQSW_IDX(idx));
+ rqs->rq_sw[RQSW_IDX(idx)] |= RQSW_BIT(idx);
+}
+
/*
* Clear the status bit of the queue at index 'idx', indicating that it is
* empty.
@@ -292,6 +310,65 @@ runq_clrbit(struct runq *rq, int idx)
rqs->rq_sw[RQSW_IDX(idx)] &= ~RQSW_BIT(idx);
}
+/*
+ * Add the thread to the queue specified by its priority, and set the
+ * corresponding status bit.
+ */
+void
+runq_add(struct runq *rq, struct thread *td, int flags)
+{
+
+ runq_add_idx(rq, td, RQ_PRI_TO_QUEUE_IDX(td->td_priority), flags);
+}
+
+void
+runq_add_idx(struct runq *rq, struct thread *td, int idx, int flags)
+{
+ struct rq_queue *rqq;
+
+ /*
+ * runq_setbit() asserts 'idx' is non-negative and below 'RQ_NQS', and
+ * a static assert earlier in this file ensures that 'RQ_NQS' is no more
+ * than 256.
+ */
+ td->td_rqindex = idx;
+ runq_setbit(rq, idx);
+ rqq = &rq->rq_queues[idx];
+ CTR4(KTR_RUNQ, "runq_add_idx: td=%p pri=%d idx=%d rqq=%p",
+ td, td->td_priority, idx, rqq);
+ if (flags & SRQ_PREEMPTED)
+ TAILQ_INSERT_HEAD(rqq, td, td_runq);
+ else
+ TAILQ_INSERT_TAIL(rqq, td, td_runq);
+}
+
+/*
+ * Remove the thread from the queue specified by its priority, and clear the
+ * corresponding status bit if the queue becomes empty.
+ *
+ * Returns whether the corresponding queue is empty after removal.
+ */
+bool
+runq_remove(struct runq *rq, struct thread *td)
+{
+ struct rq_queue *rqq;
+ int idx;
+
+ KASSERT(td->td_flags & TDF_INMEM, ("runq_remove: Thread swapped out"));
+ idx = td->td_rqindex;
+ CHECK_IDX(idx);
+ rqq = &rq->rq_queues[idx];
+ CTR4(KTR_RUNQ, "runq_remove: td=%p pri=%d idx=%d rqq=%p",
+ td, td->td_priority, idx, rqq);
+ TAILQ_REMOVE(rqq, td, td_runq);
+ if (TAILQ_EMPTY(rqq)) {
+ runq_clrbit(rq, idx);
+ CTR1(KTR_RUNQ, "runq_remove: queue at idx=%d now empty", idx);
+ return (true);
+ }
+ return (false);
+}
+
/*
* Find the index of the first non-empty run queue. This is done by
* scanning the status bits, a set bit indicating a non-empty queue.
@@ -346,56 +423,6 @@ again:
goto again;
}
-/*
- * Set the status bit of the queue at index 'idx', indicating that it is
- * non-empty.
- */
-static __inline void
-runq_setbit(struct runq *rq, int idx)
-{
- struct rq_status *rqs;
-
- CHECK_IDX(idx);
- rqs = &rq->rq_status;
- CTR4(KTR_RUNQ, "runq_setbit: bits=%#x %#x bit=%#x word=%d",
- rqs->rq_sw[RQSW_IDX(idx)],
- rqs->rq_sw[RQSW_IDX(idx)] | RQSW_BIT(idx),
- RQSW_BIT(idx), RQSW_IDX(idx));
- rqs->rq_sw[RQSW_IDX(idx)] |= RQSW_BIT(idx);
-}
-
-/*
- * Add the thread to the queue specified by its priority, and set the
- * corresponding status bit.
- */
-void
-runq_add(struct runq *rq, struct thread *td, int flags)
-{
-
- runq_add_idx(rq, td, RQ_PRI_TO_QUEUE_IDX(td->td_priority), flags);
-}
-
-void
-runq_add_idx(struct runq *rq, struct thread *td, int idx, int flags)
-{
- struct rq_queue *rqq;
-
- /*
- * runq_setbit() asserts 'idx' is non-negative and below 'RQ_NQS', and
- * a static assert earlier in this file ensures that 'RQ_NQS' is no more
- * than 256.
- */
- td->td_rqindex = idx;
- runq_setbit(rq, idx);
- rqq = &rq->rq_queues[idx];
- CTR4(KTR_RUNQ, "runq_add_idx: td=%p pri=%d idx=%d rqq=%p",
- td, td->td_priority, idx, rqq);
- if (flags & SRQ_PREEMPTED)
- TAILQ_INSERT_HEAD(rqq, td, td_runq);
- else
- TAILQ_INSERT_TAIL(rqq, td, td_runq);
-}
-
/*
* Return true if there are some processes of any priority on the run queue,
* false otherwise. Has no side effects.
@@ -417,6 +444,30 @@ runq_not_empty(struct runq *rq)
return (false);
}
+/*
+ * Find the highest priority process on the run queue.
+ */
+struct thread *
+runq_choose(struct runq *rq)
+{
+ struct rq_queue *rqq;
+ struct thread *td;
+ int idx;
+
+ idx = runq_findbit(rq);
+ if (idx != -1) {
+ rqq = &rq->rq_queues[idx];
+ td = TAILQ_FIRST(rqq);
+ KASSERT(td != NULL, ("runq_choose: no thread on busy queue"));
+ CTR3(KTR_RUNQ,
+ "runq_choose: idx=%d thread=%p rqq=%p", idx, td, rqq);
+ return (td);
+ }
+ CTR1(KTR_RUNQ, "runq_choose: idlethread idx=%d", idx);
+
+ return (NULL);
+}
+
/*
* Find the highest priority process on the run queue.
*/
@@ -460,30 +511,6 @@ runq_choose_fuzz(struct runq *rq, int fuzz)
return (NULL);
}
-/*
- * Find the highest priority process on the run queue.
- */
-struct thread *
-runq_choose(struct runq *rq)
-{
- struct rq_queue *rqq;
- struct thread *td;
- int idx;
-
- idx = runq_findbit(rq);
- if (idx != -1) {
- rqq = &rq->rq_queues[idx];
- td = TAILQ_FIRST(rqq);
- KASSERT(td != NULL, ("runq_choose: no thread on busy queue"));
- CTR3(KTR_RUNQ,
- "runq_choose: idx=%d thread=%p rqq=%p", idx, td, rqq);
- return (td);
- }
- CTR1(KTR_RUNQ, "runq_choose: idlethread idx=%d", idx);
-
- return (NULL);
-}
-
struct thread *
runq_choose_from(struct runq *rq, int from_idx)
{
@@ -504,29 +531,3 @@ runq_choose_from(struct runq *rq, int from_idx)
return (NULL);
}
-/*
- * Remove the thread from the queue specified by its priority, and clear the
- * corresponding status bit if the queue becomes empty.
- *
- * Returns whether the corresponding queue is empty after removal.
- */
-bool
-runq_remove(struct runq *rq, struct thread *td)
-{
- struct rq_queue *rqq;
- int idx;
-
- KASSERT(td->td_flags & TDF_INMEM, ("runq_remove: Thread swapped out"));
- idx = td->td_rqindex;
- CHECK_IDX(idx);
- rqq = &rq->rq_queues[idx];
- CTR4(KTR_RUNQ, "runq_remove: td=%p pri=%d idx=%d rqq=%p",
- td, td->td_priority, idx, rqq);
- TAILQ_REMOVE(rqq, td, td_runq);
- if (TAILQ_EMPTY(rqq)) {
- runq_clrbit(rq, idx);
- CTR1(KTR_RUNQ, "runq_remove: queue at idx=%d now empty", idx);
- return (true);
- }
- return (false);
-}
diff --git a/sys/sys/runq.h b/sys/sys/runq.h
index 80a1fad0a089..c570dd25503b 100644
--- a/sys/sys/runq.h
+++ b/sys/sys/runq.h
@@ -97,14 +97,15 @@ struct runq {
struct rq_queue rq_queues[RQ_NQS];
};
+void runq_init(struct runq *);
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 *);
+
bool runq_not_empty(struct runq *);
struct thread *runq_choose(struct runq *);
-struct thread *runq_choose_from(struct runq *, int _idx);
struct thread *runq_choose_fuzz(struct runq *, int _fuzz);
-void runq_init(struct runq *);
-bool runq_remove(struct runq *, struct thread *);
+struct thread *runq_choose_from(struct runq *, int _idx);
#endif /* _KERNEL */
#endif