Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 18 Aug 2004 16:48:04 GMT
From:      John Baldwin <jhb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 60000 for review
Message-ID:  <200408181648.i7IGm48I063448@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=60000

Change 60000 by jhb@jhb_slimer on 2004/08/18 16:47:14

	Redo the UP spin lock optimization but do it simpler (fewer ifdefs)
	and have it preserve mtx_lock's value so that mtx_owned() still
	works.

Affected files ...

.. //depot/projects/smpng/sys/kern/kern_mutex.c#84 edit
.. //depot/projects/smpng/sys/sys/mutex.h#45 edit

Differences ...

==== //depot/projects/smpng/sys/kern/kern_mutex.c#84 (text+ko) ====

@@ -354,11 +354,7 @@
 	    m->mtx_object.lo_name, file, line));
 	WITNESS_CHECKORDER(&m->mtx_object, opts | LOP_NEWORDER | LOP_EXCLUSIVE,
 	    file, line);
-#if defined(SMP) || LOCK_DEBUG > 0 || 1
 	_get_spin_lock(m, curthread, opts, file, line);
-#else
-	critical_enter();
-#endif
 	LOCK_LOG_LOCK("LOCK", &m->mtx_object, opts, m->mtx_recurse, file,
 	    line);
 	WITNESS_LOCK(&m->mtx_object, opts | LOP_EXCLUSIVE, file, line);
@@ -376,11 +372,7 @@
 	LOCK_LOG_LOCK("UNLOCK", &m->mtx_object, opts, m->mtx_recurse, file,
 	    line);
 	mtx_assert(m, MA_OWNED);
-#if defined(SMP) || LOCK_DEBUG > 0 || 1
 	_rel_spin_lock(m);
-#else
-	critical_exit();
-#endif
 }
 
 /*
@@ -555,6 +547,7 @@
 	return;
 }
 
+#ifdef SMP
 /*
  * _mtx_lock_spin: the tougher part of acquiring an MTX_SPIN lock.
  *
@@ -602,6 +595,7 @@
 
 	return;
 }
+#endif /* SMP */
 
 /*
  * _mtx_unlock_sleep: the tougher part of releasing an MTX_DEF lock.

==== //depot/projects/smpng/sys/sys/mutex.h#45 (text+ko) ====

@@ -103,8 +103,10 @@
 void	_mtx_lock_sleep(struct mtx *m, struct thread *td, int opts,
 	    const char *file, int line);
 void	_mtx_unlock_sleep(struct mtx *m, int opts, const char *file, int line);
+#ifdef SMP
 void	_mtx_lock_spin(struct mtx *m, struct thread *td, int opts,
 	    const char *file, int line);
+#endif
 void	_mtx_unlock_spin(struct mtx *m, int opts, const char *file, int line);
 int	_mtx_trylock(struct mtx *m, int opts, const char *file, int line);
 void	_mtx_lock_flags(struct mtx *m, int opts, const char *file, int line);
@@ -161,6 +163,7 @@
  * a deal.
  */
 #ifndef _get_spin_lock
+#ifdef SMP
 #define _get_spin_lock(mp, tid, opts, file, line) do {			\
 	struct thread *_tid = (tid);					\
 									\
@@ -172,6 +175,17 @@
 			_mtx_lock_spin((mp), _tid, (opts), (file), (line)); \
 	}								\
 } while (0)
+#else /* SMP */
+#define _get_spin_lock(mp, tid, opts, file, line) do {			\
+	struct thread *_tid = (tid);					\
+									\
+	critical_enter();						\
+	if ((mp)->mtx_lock == (uintptr_t)_tid)				\
+		(mp)->mtx_recurse++;					\
+	else								\
+		(mp)->mtx_lock = (uintptr_t)_tid;			\
+} while (0)
+#endif /* SMP */
 #endif
 
 /*
@@ -196,6 +210,7 @@
  * releasing a spin lock.  This includes the recursion cases.
  */
 #ifndef _rel_spin_lock
+#ifdef SMP
 #define _rel_spin_lock(mp) do {						\
 	if (mtx_recursed((mp)))						\
 		(mp)->mtx_recurse--;					\
@@ -203,6 +218,15 @@
 		_release_lock_quick((mp));				\
 	critical_exit();						\
 } while (0)
+#else /* SMP */
+#define _rel_spin_lock(mp) do {						\
+	if (mtx_recursed((mp)))						\
+		(mp)->mtx_recurse--;					\
+	else								\
+		(mp)->mtx_lock = MTX_UNOWNED;				\
+	critical_exit();						\
+} while (0)
+#endif /* SMP */
 #endif
 
 /*
@@ -283,15 +307,10 @@
 	_get_sleep_lock((m), curthread, (opts), LOCK_FILE, LOCK_LINE)
 #define	mtx_unlock_flags(m, opts)					\
 	_rel_sleep_lock((m), curthread, (opts), LOCK_FILE, LOCK_LINE)
-#ifndef SMPnotyet
 #define	mtx_lock_spin_flags(m, opts)					\
 	_get_spin_lock((m), curthread, (opts), LOCK_FILE, LOCK_LINE)
 #define	mtx_unlock_spin_flags(m, opts)					\
 	_rel_spin_lock((m))
-#else	/* SMP */
-#define	mtx_lock_spin_flags(m, opts)	critical_enter()
-#define	mtx_unlock_spin_flags(m, opts)	critical_exit()
-#endif	/* SMP */
 #endif	/* LOCK_DEBUG > 0 || MUTEX_NOINLINE */
 
 #define mtx_trylock_flags(m, opts)					\



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