Author: mjg
Date: Fri Feb 17 06:45:04 2017
New Revision: 313859
URL: https://svnweb.freebsd.org/changeset/base/313859

Log:
  Introduce SCHEDULER_STOPPED_TD for use when the thread pointer was already 
read
  
  Sprinkle in few places.

Modified:
  head/sys/kern/kern_condvar.c
  head/sys/kern/kern_synch.c
  head/sys/sys/systm.h

Modified: head/sys/kern/kern_condvar.c
==============================================================================
--- head/sys/kern/kern_condvar.c        Fri Feb 17 06:22:05 2017        
(r313858)
+++ head/sys/kern/kern_condvar.c        Fri Feb 17 06:45:04 2017        
(r313859)
@@ -122,7 +122,7 @@ _cv_wait(struct cv *cvp, struct lock_obj
            "Waiting on \"%s\"", cvp->cv_description);
        class = LOCK_CLASS(lock);
 
-       if (SCHEDULER_STOPPED())
+       if (SCHEDULER_STOPPED_TD(td))
                return;
 
        sleepq_lock(cvp);
@@ -176,7 +176,7 @@ _cv_wait_unlock(struct cv *cvp, struct l
            ("cv_wait_unlock cannot be used with Giant"));
        class = LOCK_CLASS(lock);
 
-       if (SCHEDULER_STOPPED()) {
+       if (SCHEDULER_STOPPED_TD(td)) {
                class->lc_unlock(lock);
                return;
        }
@@ -227,7 +227,7 @@ _cv_wait_sig(struct cv *cvp, struct lock
            "Waiting on \"%s\"", cvp->cv_description);
        class = LOCK_CLASS(lock);
 
-       if (SCHEDULER_STOPPED())
+       if (SCHEDULER_STOPPED_TD(td))
                return (0);
 
        sleepq_lock(cvp);
@@ -287,7 +287,7 @@ _cv_timedwait_sbt(struct cv *cvp, struct
            "Waiting on \"%s\"", cvp->cv_description);
        class = LOCK_CLASS(lock);
 
-       if (SCHEDULER_STOPPED())
+       if (SCHEDULER_STOPPED_TD(td))
                return (0);
 
        sleepq_lock(cvp);
@@ -349,7 +349,7 @@ _cv_timedwait_sig_sbt(struct cv *cvp, st
            "Waiting on \"%s\"", cvp->cv_description);
        class = LOCK_CLASS(lock);
 
-       if (SCHEDULER_STOPPED())
+       if (SCHEDULER_STOPPED_TD(td))
                return (0);
 
        sleepq_lock(cvp);

Modified: head/sys/kern/kern_synch.c
==============================================================================
--- head/sys/kern/kern_synch.c  Fri Feb 17 06:22:05 2017        (r313858)
+++ head/sys/kern/kern_synch.c  Fri Feb 17 06:45:04 2017        (r313859)
@@ -162,7 +162,7 @@ _sleep(void *ident, struct lock_object *
        else
                class = NULL;
 
-       if (SCHEDULER_STOPPED()) {
+       if (SCHEDULER_STOPPED_TD(td)) {
                if (lock != NULL && priority & PDROP)
                        class->lc_unlock(lock);
                return (0);
@@ -250,7 +250,7 @@ msleep_spin_sbt(void *ident, struct mtx 
        KASSERT(ident != NULL, ("msleep_spin_sbt: NULL ident"));
        KASSERT(TD_IS_RUNNING(td), ("msleep_spin_sbt: curthread not running"));
 
-       if (SCHEDULER_STOPPED())
+       if (SCHEDULER_STOPPED_TD(td))
                return (0);
 
        sleepq_lock(ident);
@@ -411,7 +411,7 @@ mi_switch(int flags, struct thread *newt
         */
        if (kdb_active)
                kdb_switch();
-       if (SCHEDULER_STOPPED())
+       if (SCHEDULER_STOPPED_TD(td))
                return;
        if (flags & SW_VOL) {
                td->td_ru.ru_nvcsw++;

Modified: head/sys/sys/systm.h
==============================================================================
--- head/sys/sys/systm.h        Fri Feb 17 06:22:05 2017        (r313858)
+++ head/sys/sys/systm.h        Fri Feb 17 06:45:04 2017        (r313859)
@@ -128,7 +128,11 @@ void       kassert_panic(const char *fmt, ...)
  * Otherwise, the kernel will deadlock since the scheduler isn't
  * going to run the thread that holds any lock we need.
  */
-#define        SCHEDULER_STOPPED() __predict_false(curthread->td_stopsched)
+#define        SCHEDULER_STOPPED_TD(td)  ({                                    
\
+       MPASS((td) == curthread);                                       \
+       __predict_false((td)->td_stopsched);                            \
+})
+#define        SCHEDULER_STOPPED() SCHEDULER_STOPPED_TD(curthread)
 
 /*
  * Align variables.
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to