--- //depot/vendor/freebsd/src/sys/kern/kern_mutex.c 2004/08/19 06:40:35 +++ //depot/projects/smpng/sys/kern/kern_mutex.c 2004/08/20 17:10:02 @@ -364,11 +364,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); @@ -386,11 +382,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 } /* @@ -565,6 +557,7 @@ return; } +#ifdef SMP /* * _mtx_lock_spin: the tougher part of acquiring an MTX_SPIN lock. * @@ -612,6 +605,7 @@ return; } +#endif /* SMP */ /* * _mtx_unlock_sleep: the tougher part of releasing an MTX_DEF lock. --- //depot/vendor/freebsd/src/sys/sys/mutex.h 2004/08/04 20:20:42 +++ //depot/projects/smpng/sys/sys/mutex.h 2004/08/18 16:47:14 @@ -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) \