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++;