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
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to