diff options
author | John Baldwin <jhb@FreeBSD.org> | 2001-03-28 09:03:24 +0000 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2001-03-28 09:03:24 +0000 |
commit | 192846463a5ff2cdf810b8c41e66af37bf83ae84 (patch) | |
tree | 395203e439ed33874e1d0934910a20ff89894137 /sys/sys/sx.h | |
parent | c31146a14e393cecdf6697f5dd3bf110597623e2 (diff) | |
download | src-192846463a5ff2cdf810b8c41e66af37bf83ae84.tar.gz src-192846463a5ff2cdf810b8c41e66af37bf83ae84.zip |
Rework the witness code to work with sx locks as well as mutexes.
- Introduce lock classes and lock objects. Each lock class specifies a
name and set of flags (or properties) shared by all locks of a given
type. Currently there are three lock classes: spin mutexes, sleep
mutexes, and sx locks. A lock object specifies properties of an
additional lock along with a lock name and all of the extra stuff needed
to make witness work with a given lock. This abstract lock stuff is
defined in sys/lock.h. The lockmgr constants, types, and prototypes have
been moved to sys/lockmgr.h. For temporary backwards compatability,
sys/lock.h includes sys/lockmgr.h.
- Replace proc->p_spinlocks with a per-CPU list, PCPU(spinlocks), of spin
locks held. By making this per-cpu, we do not have to jump through
magic hoops to deal with sched_lock changing ownership during context
switches.
- Replace proc->p_heldmtx, formerly a list of held sleep mutexes, with
proc->p_sleeplocks, which is a list of held sleep locks including sleep
mutexes and sx locks.
- Add helper macros for logging lock events via the KTR_LOCK KTR logging
level so that the log messages are consistent.
- Add some new flags that can be passed to mtx_init():
- MTX_NOWITNESS - specifies that this lock should be ignored by witness.
This is used for the mutex that blocks a sx lock for example.
- MTX_QUIET - this is not new, but you can pass this to mtx_init() now
and no events will be logged for this lock, so that one doesn't have
to change all the individual mtx_lock/unlock() operations.
- All lock objects maintain an initialized flag. Use this flag to export
a mtx_initialized() macro that can be safely called from drivers. Also,
we on longer walk the all_mtx list if MUTEX_DEBUG is defined as witness
performs the corresponding checks using the initialized flag.
- The lock order reversal messages have been improved to output slightly
more accurate file and line numbers.
Notes
Notes:
svn path=/head/; revision=74912
Diffstat (limited to 'sys/sys/sx.h')
-rw-r--r-- | sys/sys/sx.h | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/sys/sys/sx.h b/sys/sys/sx.h index 2c5c9812e621..3b4114d704ea 100644 --- a/sys/sys/sx.h +++ b/sys/sys/sx.h @@ -31,12 +31,15 @@ #define _SYS_SX_H_ #ifndef LOCORE -#include <sys/mutex.h> -#include <sys/condvar.h> +#include <sys/lock.h> /* XXX */ +#include <sys/mutex.h> /* XXX */ +#include <sys/condvar.h> /* XXX */ + +struct lock_object; struct sx { + struct lock_object sx_object; /* Common lock properties. */ struct mtx sx_lock; /* General protection lock. */ - const char *sx_descr; /* sx lock description. */ int sx_cnt; /* -1: xlock, > 0: slock count. */ struct cv sx_shrd_cv; /* slock waiters. */ int sx_shrd_wcnt; /* Number of slock waiters. */ @@ -48,10 +51,15 @@ struct sx { #ifdef _KERNEL void sx_init(struct sx *sx, const char *description); void sx_destroy(struct sx *sx); -void sx_slock(struct sx *sx); -void sx_xlock(struct sx *sx); -void sx_sunlock(struct sx *sx); -void sx_xunlock(struct sx *sx); +void _sx_slock(struct sx *sx, const char *file, int line); +void _sx_xlock(struct sx *sx, const char *file, int line); +void _sx_sunlock(struct sx *sx, const char *file, int line); +void _sx_xunlock(struct sx *sx, const char *file, int line); + +#define sx_slock(sx) _sx_slock((sx), __FILE__, __LINE__) +#define sx_xlock(sx) _sx_xlock((sx), __FILE__, __LINE__) +#define sx_sunlock(sx) _sx_sunlock((sx), __FILE__, __LINE__) +#define sx_xunlock(sx) _sx_xunlock((sx), __FILE__, __LINE__) #ifdef INVARIANTS /* @@ -65,7 +73,7 @@ void sx_xunlock(struct sx *sx); } while (0) #define _SX_ASSERT_SLOCKED(sx) do { \ KASSERT(((sx)->sx_cnt > 0), ("%s: lacking slock %s\n", \ - __FUNCTION__, (sx)->sx_descr)); \ + __FUNCTION__, (sx)->sx_object.lo_name)); \ } while (0) /* @@ -79,7 +87,7 @@ void sx_xunlock(struct sx *sx); #define _SX_ASSERT_XLOCKED(sx) do { \ KASSERT(((sx)->sx_xholder == curproc), \ ("%s: thread %p lacking xlock %s\n", __FUNCTION__, \ - curproc, (sx)->sx_descr)); \ + curproc, (sx)->sx_object.lo_name)); \ } while (0) #else /* INVARIANTS */ |