summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_timeout.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>2008-10-28 03:26:25 +0000
committerpeter <peter@FreeBSD.org>2008-10-28 03:26:25 +0000
commitb5b26198a7f928a0b1366da879539ba7818485af (patch)
tree15ee9bfaf5dc152333413e25dd19659ee3b6ce62 /sys/kern/kern_timeout.c
parent3dde3e513b6cbdb38aaa7a00356615eda15f4d15 (diff)
downloadFreeBSD-src-b5b26198a7f928a0b1366da879539ba7818485af.zip
FreeBSD-src-b5b26198a7f928a0b1366da879539ba7818485af.tar.gz
After a machine has been up for a bit more than 20 days with HZ=1000,
"ticks" goes negative. This breaks the signed comparison in softclock. This causes sleep() to never wake up, tcp to stop, etc etc. This is bad(TM). Use the SEQ_LT() method from tcp's sequence number comparisons.
Diffstat (limited to 'sys/kern/kern_timeout.c')
-rw-r--r--sys/kern/kern_timeout.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/sys/kern/kern_timeout.c b/sys/kern/kern_timeout.c
index fe05d2c..bd754b1 100644
--- a/sys/kern/kern_timeout.c
+++ b/sys/kern/kern_timeout.c
@@ -233,7 +233,7 @@ callout_tick(void)
need_softclock = 0;
cc = CC_SELF();
mtx_lock_spin_flags(&cc->cc_lock, MTX_QUIET);
- for (; cc->cc_softticks < ticks; cc->cc_softticks++) {
+ for (; (cc->cc_softticks - ticks) < 0; cc->cc_softticks++) {
bucket = cc->cc_softticks & callwheelmask;
if (!TAILQ_EMPTY(&cc->cc_callwheel[bucket])) {
need_softclock = 1;
OpenPOWER on IntegriCloud