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>