The branch main has been updated by mav:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=63ca9ea4f34d887b66c7b9f1710f5e4be543ebed

commit 63ca9ea4f34d887b66c7b9f1710f5e4be543ebed
Author:     Alexander Motin <[email protected]>
AuthorDate: 2021-07-10 00:52:40 +0000
Commit:     Alexander Motin <[email protected]>
CommitDate: 2021-07-10 00:57:58 +0000

    Use sleepq_signal(SLEEPQ_DROP) in cv_signal().
    
    Same as wakeup_one()/wakeup_any() commit before it reduces the lock
    hold time and so contention.
    
    MFC after:      1 week
---
 sys/kern/kern_condvar.c | 27 ++++++++++++---------------
 1 file changed, 12 insertions(+), 15 deletions(-)

diff --git a/sys/kern/kern_condvar.c b/sys/kern/kern_condvar.c
index e26b689b4e11..ffceee44a5c0 100644
--- a/sys/kern/kern_condvar.c
+++ b/sys/kern/kern_condvar.c
@@ -397,26 +397,23 @@ _cv_timedwait_sig_sbt(struct cv *cvp, struct lock_object 
*lock,
 void
 cv_signal(struct cv *cvp)
 {
-       int wakeup_swapper;
 
        if (cvp->cv_waiters == 0)
                return;
-       wakeup_swapper = 0;
        sleepq_lock(cvp);
-       if (cvp->cv_waiters > 0) {
-               if (cvp->cv_waiters == CV_WAITERS_BOUND &&
-                   sleepq_lookup(cvp) == NULL) {
-                       cvp->cv_waiters = 0;
-               } else {
-                       if (cvp->cv_waiters < CV_WAITERS_BOUND)
-                               cvp->cv_waiters--;
-                       wakeup_swapper = sleepq_signal(cvp, SLEEPQ_CONDVAR, 0,
-                           0);
-               }
+       if (cvp->cv_waiters == 0) {
+               sleepq_release(cvp);
+               return;
+       }
+       if (cvp->cv_waiters == CV_WAITERS_BOUND && sleepq_lookup(cvp) == NULL) {
+               cvp->cv_waiters = 0;
+               sleepq_release(cvp);
+       } else {
+               if (cvp->cv_waiters < CV_WAITERS_BOUND)
+                       cvp->cv_waiters--;
+               if (sleepq_signal(cvp, SLEEPQ_CONDVAR | SLEEPQ_DROP, 0, 0))
+                       kick_proc0();
        }
-       sleepq_release(cvp);
-       if (wakeup_swapper)
-               kick_proc0();
 }
 
 /*
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to