summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_condvar.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2008-09-25 13:42:19 +0000
committerjhb <jhb@FreeBSD.org>2008-09-25 13:42:19 +0000
commit9c5408c4f9e8c70d84545b90a85af2d1630f087d (patch)
tree7eaa8e1950a106baf0107b59b8404d89167c4544 /sys/kern/kern_condvar.c
parentaf76980ef5353eee84271a4934c37c01861d8644 (diff)
downloadFreeBSD-src-9c5408c4f9e8c70d84545b90a85af2d1630f087d.zip
FreeBSD-src-9c5408c4f9e8c70d84545b90a85af2d1630f087d.tar.gz
- Don't do a WITNESS_SAVE() on the interlock if it is Giant in the condition
variable wait routines. DROP_GIANT() already manages that state in the Giant interlock case. - Assert that Giant is held when it is passed as a sleep interlock.
Diffstat (limited to 'sys/kern/kern_condvar.c')
-rw-r--r--sys/kern/kern_condvar.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/sys/kern/kern_condvar.c b/sys/kern/kern_condvar.c
index 8b002b1..dbc9833 100644
--- a/sys/kern/kern_condvar.c
+++ b/sys/kern/kern_condvar.c
@@ -108,7 +108,6 @@ _cv_wait(struct cv *cvp, struct lock_object *lock)
CV_ASSERT(cvp, lock, td);
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, lock,
"Waiting on \"%s\"", cvp->cv_description);
- WITNESS_SAVE(lock, lock_witness);
class = LOCK_CLASS(lock);
if (cold || panicstr) {
@@ -124,12 +123,15 @@ _cv_wait(struct cv *cvp, struct lock_object *lock)
sleepq_lock(cvp);
cvp->cv_waiters++;
+ if (lock == &Giant.lock_object)
+ mtx_assert(&Giant, MA_OWNED);
DROP_GIANT();
sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR, 0);
if (lock != &Giant.lock_object) {
if (class->lc_flags & LC_SLEEPABLE)
sleepq_release(cvp);
+ WITNESS_SAVE(lock, lock_witness);
lock_state = class->lc_unlock(lock);
if (class->lc_flags & LC_SLEEPABLE)
sleepq_lock(cvp);
@@ -225,7 +227,6 @@ _cv_wait_sig(struct cv *cvp, struct lock_object *lock)
CV_ASSERT(cvp, lock, td);
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, lock,
"Waiting on \"%s\"", cvp->cv_description);
- WITNESS_SAVE(lock, lock_witness);
class = LOCK_CLASS(lock);
if (cold || panicstr) {
@@ -241,6 +242,8 @@ _cv_wait_sig(struct cv *cvp, struct lock_object *lock)
sleepq_lock(cvp);
cvp->cv_waiters++;
+ if (lock == &Giant.lock_object)
+ mtx_assert(&Giant, MA_OWNED);
DROP_GIANT();
sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR |
@@ -248,6 +251,7 @@ _cv_wait_sig(struct cv *cvp, struct lock_object *lock)
if (lock != &Giant.lock_object) {
if (class->lc_flags & LC_SLEEPABLE)
sleepq_release(cvp);
+ WITNESS_SAVE(lock, lock_witness);
lock_state = class->lc_unlock(lock);
if (class->lc_flags & LC_SLEEPABLE)
sleepq_lock(cvp);
@@ -290,7 +294,6 @@ _cv_timedwait(struct cv *cvp, struct lock_object *lock, int timo)
CV_ASSERT(cvp, lock, td);
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, lock,
"Waiting on \"%s\"", cvp->cv_description);
- WITNESS_SAVE(lock, lock_witness);
class = LOCK_CLASS(lock);
if (cold || panicstr) {
@@ -306,6 +309,8 @@ _cv_timedwait(struct cv *cvp, struct lock_object *lock, int timo)
sleepq_lock(cvp);
cvp->cv_waiters++;
+ if (lock == &Giant.lock_object)
+ mtx_assert(&Giant, MA_OWNED);
DROP_GIANT();
sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR, 0);
@@ -313,6 +318,7 @@ _cv_timedwait(struct cv *cvp, struct lock_object *lock, int timo)
if (lock != &Giant.lock_object) {
if (class->lc_flags & LC_SLEEPABLE)
sleepq_release(cvp);
+ WITNESS_SAVE(lock, lock_witness);
lock_state = class->lc_unlock(lock);
if (class->lc_flags & LC_SLEEPABLE)
sleepq_lock(cvp);
@@ -358,7 +364,6 @@ _cv_timedwait_sig(struct cv *cvp, struct lock_object *lock, int timo)
CV_ASSERT(cvp, lock, td);
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, lock,
"Waiting on \"%s\"", cvp->cv_description);
- WITNESS_SAVE(lock, lock_witness);
class = LOCK_CLASS(lock);
if (cold || panicstr) {
@@ -374,6 +379,8 @@ _cv_timedwait_sig(struct cv *cvp, struct lock_object *lock, int timo)
sleepq_lock(cvp);
cvp->cv_waiters++;
+ if (lock == &Giant.lock_object)
+ mtx_assert(&Giant, MA_OWNED);
DROP_GIANT();
sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR |
@@ -382,6 +389,7 @@ _cv_timedwait_sig(struct cv *cvp, struct lock_object *lock, int timo)
if (lock != &Giant.lock_object) {
if (class->lc_flags & LC_SLEEPABLE)
sleepq_release(cvp);
+ WITNESS_SAVE(lock, lock_witness);
lock_state = class->lc_unlock(lock);
if (class->lc_flags & LC_SLEEPABLE)
sleepq_lock(cvp);
OpenPOWER on IntegriCloud