From ce62b59c889a43889422cd9b1e0dee2d0b9e74ae Mon Sep 17 00:00:00 2001 From: Jeff Roberson Date: Sun, 6 Apr 2008 11:08:49 +0000 Subject: [PATCH] - Correct a major error introduced in the per-cpu timeout commit. Sleep and wakeup require the same wait channel to function properly. Found by: kris Pointy hat: me --- sys/kern/kern_timeout.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sys/kern/kern_timeout.c b/sys/kern/kern_timeout.c index b187ab79dc55..fc30bd80440e 100644 --- a/sys/kern/kern_timeout.c +++ b/sys/kern/kern_timeout.c @@ -655,7 +655,7 @@ _callout_stop_safe(c, safe) c, c->c_func, c->c_arg); CC_UNLOCK(cc); if (sq_locked) - sleepq_release(&cc->cc_curr); + sleepq_release(&cc->cc_waiting); return (0); } @@ -687,17 +687,17 @@ _callout_stop_safe(c, safe) */ if (!sq_locked) { CC_UNLOCK(cc); - sleepq_lock(&cc->cc_curr); + sleepq_lock(&cc->cc_waiting); sq_locked = 1; goto again; } cc->cc_waiting = 1; DROP_GIANT(); CC_UNLOCK(cc); - sleepq_add(&cc->cc_curr, + sleepq_add(&cc->cc_waiting, &cc->cc_lock.lock_object, "codrain", SLEEPQ_SLEEP, 0); - sleepq_wait(&cc->cc_curr, 0); + sleepq_wait(&cc->cc_waiting, 0); sq_locked = 0; /* Reacquire locks previously released. */ @@ -726,7 +726,7 @@ _callout_stop_safe(c, safe) return (0); } if (sq_locked) - sleepq_release(&cc->cc_curr); + sleepq_release(&cc->cc_waiting); c->c_flags &= ~(CALLOUT_ACTIVE | CALLOUT_PENDING);