svn commit: r286166 - in head/sys: kern sys

Mark Johnston markj at FreeBSD.org
Sun Aug 2 00:03:12 UTC 2015


Author: markj
Date: Sun Aug  2 00:03:08 2015
New Revision: 286166
URL: https://svnweb.freebsd.org/changeset/base/286166

Log:
  Don't modify curthread->td_locks unless INVARIANTS is enabled.
  
  This field is only used in a KASSERT that verifies that no locks are held
  when returning to user mode. Moreover, the td_locks accounting is only
  correct when LOCK_DEBUG > 0, which is implied by INVARIANTS.
  
  Reviewed by:	jhb
  MFC after:	1 week
  Differential Revision:	https://reviews.freebsd.org/D3205

Modified:
  head/sys/kern/kern_lock.c
  head/sys/kern/kern_mutex.c
  head/sys/kern/kern_rmlock.c
  head/sys/kern/kern_rwlock.c
  head/sys/kern/kern_sx.c
  head/sys/sys/proc.h

Modified: head/sys/kern/kern_lock.c
==============================================================================
--- head/sys/kern/kern_lock.c	Sat Aug  1 23:10:36 2015	(r286165)
+++ head/sys/kern/kern_lock.c	Sun Aug  2 00:03:08 2015	(r286166)
@@ -69,12 +69,8 @@ CTASSERT(LK_UNLOCKED == (LK_UNLOCKED &
 
 #ifndef INVARIANTS
 #define	_lockmgr_assert(lk, what, file, line)
-#define	TD_LOCKS_INC(td)
-#define	TD_LOCKS_DEC(td)
-#else
-#define	TD_LOCKS_INC(td)	((td)->td_locks++)
-#define	TD_LOCKS_DEC(td)	((td)->td_locks--)
 #endif
+
 #define	TD_SLOCKS_INC(td)	((td)->td_lk_slocks++)
 #define	TD_SLOCKS_DEC(td)	((td)->td_lk_slocks--)
 

Modified: head/sys/kern/kern_mutex.c
==============================================================================
--- head/sys/kern/kern_mutex.c	Sat Aug  1 23:10:36 2015	(r286165)
+++ head/sys/kern/kern_mutex.c	Sun Aug  2 00:03:08 2015	(r286166)
@@ -224,7 +224,7 @@ __mtx_lock_flags(volatile uintptr_t *c, 
 	    line);
 	WITNESS_LOCK(&m->lock_object, (opts & ~MTX_RECURSE) | LOP_EXCLUSIVE,
 	    file, line);
-	curthread->td_locks++;
+	TD_LOCKS_INC(curthread);
 }
 
 void
@@ -248,7 +248,7 @@ __mtx_unlock_flags(volatile uintptr_t *c
 	mtx_assert(m, MA_OWNED);
 
 	__mtx_unlock(m, curthread, opts, file, line);
-	curthread->td_locks--;
+	TD_LOCKS_DEC(curthread);
 }
 
 void
@@ -347,7 +347,7 @@ _mtx_trylock_flags_(volatile uintptr_t *
 	if (rval) {
 		WITNESS_LOCK(&m->lock_object, opts | LOP_EXCLUSIVE | LOP_TRYLOCK,
 		    file, line);
-		curthread->td_locks++;
+		TD_LOCKS_INC(curthread);
 		if (m->mtx_recurse == 0)
 			LOCKSTAT_PROFILE_OBTAIN_LOCK_SUCCESS(adaptive__acquire,
 			    m, contested, waittime, file, line);
@@ -958,7 +958,7 @@ _mtx_destroy(volatile uintptr_t *c)
 		if (LOCK_CLASS(&m->lock_object) == &lock_class_mtx_spin)
 			spinlock_exit();
 		else
-			curthread->td_locks--;
+			TD_LOCKS_DEC(curthread);
 
 		lock_profile_release_lock(&m->lock_object);
 		/* Tell witness this isn't locked to make it happy. */

Modified: head/sys/kern/kern_rmlock.c
==============================================================================
--- head/sys/kern/kern_rmlock.c	Sat Aug  1 23:10:36 2015	(r286165)
+++ head/sys/kern/kern_rmlock.c	Sun Aug  2 00:03:08 2015	(r286166)
@@ -608,11 +608,8 @@ _rm_wlock_debug(struct rmlock *rm, const
 	_rm_wlock(rm);
 
 	LOCK_LOG_LOCK("RMWLOCK", &rm->lock_object, 0, 0, file, line);
-
 	WITNESS_LOCK(&rm->lock_object, LOP_EXCLUSIVE, file, line);
-
-	curthread->td_locks++;
-
+	TD_LOCKS_INC(curthread);
 }
 
 void
@@ -628,7 +625,7 @@ _rm_wunlock_debug(struct rmlock *rm, con
 	WITNESS_UNLOCK(&rm->lock_object, LOP_EXCLUSIVE, file, line);
 	LOCK_LOG_LOCK("RMWUNLOCK", &rm->lock_object, 0, 0, file, line);
 	_rm_wunlock(rm);
-	curthread->td_locks--;
+	TD_LOCKS_DEC(curthread);
 }
 
 int
@@ -670,9 +667,7 @@ _rm_rlock_debug(struct rmlock *rm, struc
 			LOCK_LOG_LOCK("RMRLOCK", &rm->lock_object, 0, 0, file,
 			    line);
 		WITNESS_LOCK(&rm->lock_object, 0, file, line);
-
-		curthread->td_locks++;
-
+		TD_LOCKS_INC(curthread);
 		return (1);
 	} else if (trylock)
 		LOCK_LOG_TRY("RMRLOCK", &rm->lock_object, 0, 0, file, line);
@@ -694,7 +689,7 @@ _rm_runlock_debug(struct rmlock *rm, str
 	WITNESS_UNLOCK(&rm->lock_object, 0, file, line);
 	LOCK_LOG_LOCK("RMRUNLOCK", &rm->lock_object, 0, 0, file, line);
 	_rm_runlock(rm, tracker);
-	curthread->td_locks--;
+	TD_LOCKS_DEC(curthread);
 }
 
 #else

Modified: head/sys/kern/kern_rwlock.c
==============================================================================
--- head/sys/kern/kern_rwlock.c	Sat Aug  1 23:10:36 2015	(r286165)
+++ head/sys/kern/kern_rwlock.c	Sun Aug  2 00:03:08 2015	(r286166)
@@ -268,7 +268,7 @@ _rw_wlock_cookie(volatile uintptr_t *c, 
 	__rw_wlock(rw, curthread, file, line);
 	LOCK_LOG_LOCK("WLOCK", &rw->lock_object, 0, rw->rw_recurse, file, line);
 	WITNESS_LOCK(&rw->lock_object, LOP_EXCLUSIVE, file, line);
-	curthread->td_locks++;
+	TD_LOCKS_INC(curthread);
 }
 
 int
@@ -303,7 +303,7 @@ __rw_try_wlock(volatile uintptr_t *c, co
 		if (!rw_recursed(rw))
 			LOCKSTAT_PROFILE_OBTAIN_RWLOCK_SUCCESS(rw__acquire,
 			    rw, 0, 0, file, line, LOCKSTAT_WRITER);
-		curthread->td_locks++;
+		TD_LOCKS_INC(curthread);
 	}
 	return (rval);
 }
@@ -325,8 +325,9 @@ _rw_wunlock_cookie(volatile uintptr_t *c
 	LOCK_LOG_LOCK("WUNLOCK", &rw->lock_object, 0, rw->rw_recurse, file,
 	    line);
 	__rw_wunlock(rw, curthread, file, line);
-	curthread->td_locks--;
+	TD_LOCKS_DEC(curthread);
 }
+
 /*
  * Determines whether a new reader can acquire a lock.  Succeeds if the
  * reader already owns a read lock and the lock is locked for read to
@@ -565,7 +566,7 @@ __rw_rlock(volatile uintptr_t *c, const 
 	    waittime, file, line, LOCKSTAT_READER);
 	LOCK_LOG_LOCK("RLOCK", &rw->lock_object, 0, 0, file, line);
 	WITNESS_LOCK(&rw->lock_object, 0, file, line);
-	curthread->td_locks++;
+	TD_LOCKS_INC(curthread);
 	curthread->td_rw_rlocks++;
 }
 
@@ -596,7 +597,7 @@ __rw_try_rlock(volatile uintptr_t *c, co
 			WITNESS_LOCK(&rw->lock_object, LOP_TRYLOCK, file, line);
 			LOCKSTAT_PROFILE_OBTAIN_RWLOCK_SUCCESS(rw__acquire,
 			    rw, 0, 0, file, line, LOCKSTAT_READER);
-			curthread->td_locks++;
+			TD_LOCKS_INC(curthread);
 			curthread->td_rw_rlocks++;
 			return (1);
 		}
@@ -714,7 +715,7 @@ _rw_runlock_cookie(volatile uintptr_t *c
 		break;
 	}
 	LOCKSTAT_PROFILE_RELEASE_RWLOCK(rw__release, rw, LOCKSTAT_READER);
-	curthread->td_locks--;
+	TD_LOCKS_DEC(curthread);
 	curthread->td_rw_rlocks--;
 }
 

Modified: head/sys/kern/kern_sx.c
==============================================================================
--- head/sys/kern/kern_sx.c	Sat Aug  1 23:10:36 2015	(r286165)
+++ head/sys/kern/kern_sx.c	Sun Aug  2 00:03:08 2015	(r286166)
@@ -261,7 +261,7 @@ _sx_slock(struct sx *sx, int opts, const
 	if (!error) {
 		LOCK_LOG_LOCK("SLOCK", &sx->lock_object, 0, 0, file, line);
 		WITNESS_LOCK(&sx->lock_object, 0, file, line);
-		curthread->td_locks++;
+		TD_LOCKS_INC(curthread);
 	}
 
 	return (error);
@@ -290,7 +290,7 @@ sx_try_slock_(struct sx *sx, const char 
 			WITNESS_LOCK(&sx->lock_object, LOP_TRYLOCK, file, line);
 			LOCKSTAT_PROFILE_OBTAIN_RWLOCK_SUCCESS(sx__acquire,
 			    sx, 0, 0, file, line, LOCKSTAT_READER);
-			curthread->td_locks++;
+			TD_LOCKS_INC(curthread);
 			return (1);
 		}
 	}
@@ -318,7 +318,7 @@ _sx_xlock(struct sx *sx, int opts, const
 		LOCK_LOG_LOCK("XLOCK", &sx->lock_object, 0, sx->sx_recurse,
 		    file, line);
 		WITNESS_LOCK(&sx->lock_object, LOP_EXCLUSIVE, file, line);
-		curthread->td_locks++;
+		TD_LOCKS_INC(curthread);
 	}
 
 	return (error);
@@ -353,7 +353,7 @@ sx_try_xlock_(struct sx *sx, const char 
 		if (!sx_recursed(sx))
 			LOCKSTAT_PROFILE_OBTAIN_RWLOCK_SUCCESS(sx__acquire,
 			    sx, 0, 0, file, line, LOCKSTAT_WRITER);
-		curthread->td_locks++;
+		TD_LOCKS_INC(curthread);
 	}
 
 	return (rval);
@@ -371,7 +371,7 @@ _sx_sunlock(struct sx *sx, const char *f
 	WITNESS_UNLOCK(&sx->lock_object, 0, file, line);
 	LOCK_LOG_LOCK("SUNLOCK", &sx->lock_object, 0, 0, file, line);
 	__sx_sunlock(sx, file, line);
-	curthread->td_locks--;
+	TD_LOCKS_DEC(curthread);
 }
 
 void
@@ -387,7 +387,7 @@ _sx_xunlock(struct sx *sx, const char *f
 	LOCK_LOG_LOCK("XUNLOCK", &sx->lock_object, 0, sx->sx_recurse, file,
 	    line);
 	__sx_xunlock(sx, curthread, file, line);
-	curthread->td_locks--;
+	TD_LOCKS_DEC(curthread);
 }
 
 /*

Modified: head/sys/sys/proc.h
==============================================================================
--- head/sys/sys/proc.h	Sat Aug  1 23:10:36 2015	(r286165)
+++ head/sys/sys/proc.h	Sun Aug  2 00:03:08 2015	(r286166)
@@ -238,7 +238,7 @@ struct thread {
 	int		td_oncpu;	/* (t) Which cpu we are on. */
 	volatile u_char td_owepreempt;  /* (k*) Preempt on last critical_exit */
 	u_char		td_tsqueue;	/* (t) Turnstile queue blocked on. */
-	short		td_locks;	/* (k) Count of non-spin locks. */
+	short		td_locks;	/* (k) Debug: count of non-spin locks */
 	short		td_rw_rlocks;	/* (k) Count of rwlock read locks. */
 	short		td_lk_slocks;	/* (k) Count of lockmgr shared locks. */
 	short		td_stopsched;	/* (k) Scheduler stopped. */
@@ -351,8 +351,14 @@ do {									\
 	KASSERT((__m == &blocked_lock || __m == (lock)),		\
 	    ("Thread %p lock %p does not match %p", td, __m, (lock)));	\
 } while (0)
+
+#define	TD_LOCKS_INC(td)	((td)->td_locks++)
+#define	TD_LOCKS_DEC(td)	((td)->td_locks--)
 #else
 #define	THREAD_LOCKPTR_ASSERT(td, lock)
+
+#define	TD_LOCKS_INC(td)
+#define	TD_LOCKS_DEC(td)
 #endif
 
 /*


More information about the svn-src-head mailing list