PERFORCE change 60000 for review
John Baldwin
jhb at FreeBSD.org
Wed Aug 18 09:48:06 PDT 2004
http://perforce.freebsd.org/chv.cgi?CH=60000
Change 60000 by jhb at 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) \
More information about the p4-projects
mailing list