Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 17 Feb 2017 06:45:04 +0000 (UTC)
From:      Mateusz Guzik <mjg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r313859 - in head/sys: kern sys
Message-ID:  <201702170645.v1H6j4l6060548@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201702170645.v1H6j4l6060548>