svn commit: r313859 - in head/sys: kern sys
Mateusz Guzik
mjg at FreeBSD.org
Fri Feb 17 06:45:06 UTC 2017
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.
More information about the svn-src-head
mailing list