git: 9cdb0ee85da3 - stable/13 - callout: Simplify the inner loop in callout_process() a bit
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 25 Jul 2022 13:54:56 UTC
The branch stable/13 has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=9cdb0ee85da33a4f0f4d31897f2b3601c1ca5c0b
commit 9cdb0ee85da33a4f0f4d31897f2b3601c1ca5c0b
Author: Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2022-07-01 00:16:33 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
CommitDate: 2022-07-25 13:45:37 +0000
callout: Simplify the inner loop in callout_process() a bit
- Use LIST_FOREACH_SAFE.
- Simplify control flow.
No functional change intended.
Sponsored by: The FreeBSD Foundation
(cherry picked from commit 46eab86035a1d5d2b8bfd5aae3581e2604d3ae68)
---
sys/kern/kern_timeout.c | 65 +++++++++++++++++++++++--------------------------
1 file changed, 31 insertions(+), 34 deletions(-)
diff --git a/sys/kern/kern_timeout.c b/sys/kern/kern_timeout.c
index 016365a9bea0..c401b69b91d8 100644
--- a/sys/kern/kern_timeout.c
+++ b/sys/kern/kern_timeout.c
@@ -415,7 +415,7 @@ callout_get_bucket(sbintime_t sbt)
void
callout_process(sbintime_t now)
{
- struct callout *tmp, *tmpn;
+ struct callout *c, *next;
struct callout_cpu *cc;
struct callout_list *sc;
sbintime_t first, last, lookahead, max, tmp_max;
@@ -459,58 +459,55 @@ callout_process(sbintime_t now)
/* Iterate callwheel from firstb to nowb and then up to lastb. */
do {
sc = &cc->cc_callwheel[firstb & callwheelmask];
- tmp = LIST_FIRST(sc);
- while (tmp != NULL) {
+ LIST_FOREACH_SAFE(c, sc, c_links.le, next) {
/* Run the callout if present time within allowed. */
- if (tmp->c_time <= now) {
+ if (c->c_time <= now) {
/*
* Consumer told us the callout may be run
* directly from hardware interrupt context.
*/
- if (tmp->c_iflags & CALLOUT_DIRECT) {
+ if (c->c_iflags & CALLOUT_DIRECT) {
#ifdef CALLOUT_PROFILING
++depth_dir;
#endif
- cc_exec_next(cc) =
- LIST_NEXT(tmp, c_links.le);
+ cc_exec_next(cc) = next;
cc->cc_bucket = firstb & callwheelmask;
- LIST_REMOVE(tmp, c_links.le);
- softclock_call_cc(tmp, cc,
+ LIST_REMOVE(c, c_links.le);
+ softclock_call_cc(c, cc,
#ifdef CALLOUT_PROFILING
&mpcalls_dir, &lockcalls_dir, NULL,
#endif
1);
- tmp = cc_exec_next(cc);
+ next = cc_exec_next(cc);
cc_exec_next(cc) = NULL;
} else {
- tmpn = LIST_NEXT(tmp, c_links.le);
- LIST_REMOVE(tmp, c_links.le);
+ LIST_REMOVE(c, c_links.le);
TAILQ_INSERT_TAIL(&cc->cc_expireq,
- tmp, c_links.tqe);
- tmp->c_iflags |= CALLOUT_PROCESSED;
- tmp = tmpn;
+ c, c_links.tqe);
+ c->c_iflags |= CALLOUT_PROCESSED;
}
- continue;
- }
- /* Skip events from distant future. */
- if (tmp->c_time >= max)
- goto next;
- /*
- * Event minimal time is bigger than present maximal
- * time, so it cannot be aggregated.
- */
- if (tmp->c_time > last) {
+ } else if (c->c_time >= max) {
+ /*
+ * Skip events in the distant future.
+ */
+ ;
+ } else if (c->c_time > last) {
+ /*
+ * Event minimal time is bigger than present
+ * maximal time, so it cannot be aggregated.
+ */
lastb = nowb;
- goto next;
+ } else {
+ /*
+ * Update first and last time, respecting this
+ * event.
+ */
+ if (c->c_time < first)
+ first = c->c_time;
+ tmp_max = c->c_time + c->c_precision;
+ if (tmp_max < last)
+ last = tmp_max;
}
- /* Update first and last time, respecting this event. */
- if (tmp->c_time < first)
- first = tmp->c_time;
- tmp_max = tmp->c_time + tmp->c_precision;
- if (tmp_max < last)
- last = tmp_max;
-next:
- tmp = LIST_NEXT(tmp, c_links.le);
}
/* Proceed with the next bucket. */
firstb++;