svn commit: r283250 - in head/sys: kern sys
John Baldwin
jhb at FreeBSD.org
Thu May 21 16:43:28 UTC 2015
Author: jhb
Date: Thu May 21 16:43:26 2015
New Revision: 283250
URL: https://svnweb.freebsd.org/changeset/base/283250
Log:
Revert r282971. It depends on condvar consumers not destroying condvars
until all threads sleeping on a condvar have resumed execution after being
awakened. However, there are cases where that guarantee is very hard to
provide.
Modified:
head/sys/kern/kern_condvar.c
head/sys/sys/condvar.h
Modified: head/sys/kern/kern_condvar.c
==============================================================================
--- head/sys/kern/kern_condvar.c Thu May 21 15:38:43 2015 (r283249)
+++ head/sys/kern/kern_condvar.c Thu May 21 16:43:26 2015 (r283250)
@@ -122,7 +122,7 @@ _cv_wait(struct cv *cvp, struct lock_obj
sleepq_lock(cvp);
- atomic_add_int(&cvp->cv_waiters, 1);
+ cvp->cv_waiters++;
if (lock == &Giant.lock_object)
mtx_assert(&Giant, MA_OWNED);
DROP_GIANT();
@@ -137,7 +137,6 @@ _cv_wait(struct cv *cvp, struct lock_obj
sleepq_lock(cvp);
}
sleepq_wait(cvp, 0);
- atomic_subtract_int(&cvp->cv_waiters, 1);
#ifdef KTRACE
if (KTRPOINT(td, KTR_CSW))
@@ -185,7 +184,7 @@ _cv_wait_unlock(struct cv *cvp, struct l
sleepq_lock(cvp);
- atomic_add_int(&cvp->cv_waiters, 1);
+ cvp->cv_waiters++;
DROP_GIANT();
sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR, 0);
@@ -195,7 +194,6 @@ _cv_wait_unlock(struct cv *cvp, struct l
if (class->lc_flags & LC_SLEEPABLE)
sleepq_lock(cvp);
sleepq_wait(cvp, 0);
- atomic_subtract_int(&cvp->cv_waiters, 1);
#ifdef KTRACE
if (KTRPOINT(td, KTR_CSW))
@@ -242,7 +240,7 @@ _cv_wait_sig(struct cv *cvp, struct lock
sleepq_lock(cvp);
- atomic_add_int(&cvp->cv_waiters, 1);
+ cvp->cv_waiters++;
if (lock == &Giant.lock_object)
mtx_assert(&Giant, MA_OWNED);
DROP_GIANT();
@@ -258,7 +256,6 @@ _cv_wait_sig(struct cv *cvp, struct lock
sleepq_lock(cvp);
}
rval = sleepq_wait_sig(cvp, 0);
- atomic_subtract_int(&cvp->cv_waiters, 1);
#ifdef KTRACE
if (KTRPOINT(td, KTR_CSW))
@@ -310,7 +307,7 @@ _cv_timedwait_sbt(struct cv *cvp, struct
sleepq_lock(cvp);
- atomic_add_int(&cvp->cv_waiters, 1);
+ cvp->cv_waiters++;
if (lock == &Giant.lock_object)
mtx_assert(&Giant, MA_OWNED);
DROP_GIANT();
@@ -326,7 +323,6 @@ _cv_timedwait_sbt(struct cv *cvp, struct
sleepq_lock(cvp);
}
rval = sleepq_timedwait(cvp, 0);
- atomic_subtract_int(&cvp->cv_waiters, 1);
#ifdef KTRACE
if (KTRPOINT(td, KTR_CSW))
@@ -380,7 +376,7 @@ _cv_timedwait_sig_sbt(struct cv *cvp, st
sleepq_lock(cvp);
- atomic_add_int(&cvp->cv_waiters, 1);
+ cvp->cv_waiters++;
if (lock == &Giant.lock_object)
mtx_assert(&Giant, MA_OWNED);
DROP_GIANT();
@@ -397,7 +393,6 @@ _cv_timedwait_sig_sbt(struct cv *cvp, st
sleepq_lock(cvp);
}
rval = sleepq_timedwait_sig(cvp, 0);
- atomic_subtract_int(&cvp->cv_waiters, 1);
#ifdef KTRACE
if (KTRPOINT(td, KTR_CSW))
@@ -426,8 +421,10 @@ cv_signal(struct cv *cvp)
wakeup_swapper = 0;
sleepq_lock(cvp);
- if (cvp->cv_waiters > 0)
+ if (cvp->cv_waiters > 0) {
+ cvp->cv_waiters--;
wakeup_swapper = sleepq_signal(cvp, SLEEPQ_CONDVAR, 0, 0);
+ }
sleepq_release(cvp);
if (wakeup_swapper)
kick_proc0();
@@ -450,8 +447,10 @@ cv_broadcastpri(struct cv *cvp, int pri)
if (pri == -1)
pri = 0;
sleepq_lock(cvp);
- if (cvp->cv_waiters > 0)
+ if (cvp->cv_waiters > 0) {
+ cvp->cv_waiters = 0;
wakeup_swapper = sleepq_broadcast(cvp, SLEEPQ_CONDVAR, pri, 0);
+ }
sleepq_release(cvp);
if (wakeup_swapper)
kick_proc0();
Modified: head/sys/sys/condvar.h
==============================================================================
--- head/sys/sys/condvar.h Thu May 21 15:38:43 2015 (r283249)
+++ head/sys/sys/condvar.h Thu May 21 16:43:26 2015 (r283250)
@@ -45,7 +45,7 @@ TAILQ_HEAD(cv_waitq, thread);
*/
struct cv {
const char *cv_description;
- volatile int cv_waiters;
+ int cv_waiters;
};
#ifdef _KERNEL
More information about the svn-src-head
mailing list