diff options
author | davide <davide@FreeBSD.org> | 2013-09-20 23:06:21 +0000 |
---|---|---|
committer | davide <davide@FreeBSD.org> | 2013-09-20 23:06:21 +0000 |
commit | 5273d359fdd82fc7a93ff0f694844d25a2e17c59 (patch) | |
tree | 0f8acc1728a85e0911253a1fa7cfe9c10d2c05b4 /sys/kern/kern_mutex.c | |
parent | 7ed30adae7eb0c6e156983ca0c96c04e1e6a8e0d (diff) | |
download | FreeBSD-src-5273d359fdd82fc7a93ff0f694844d25a2e17c59.zip FreeBSD-src-5273d359fdd82fc7a93ff0f694844d25a2e17c59.tar.gz |
Fix lc_lock/lc_unlock() support for rmlocks held in shared mode. With
current lock classes KPI it was really difficult because there was no
way to pass an rmtracker object to the lock/unlock routines. In order
to accomplish the task, modify the aforementioned functions so that
they can return (or pass as argument) an uinptr_t, which is in the rm
case used to hold a pointer to struct rm_priotracker for current
thread. As an added bonus, this fixes rm_sleep() in the rm shared
case, which right now can communicate priotracker structure between
lc_unlock()/lc_lock().
Suggested by: jhb
Reviewed by: jhb
Approved by: re (delphij)
Diffstat (limited to 'sys/kern/kern_mutex.c')
-rw-r--r-- | sys/kern/kern_mutex.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/sys/kern/kern_mutex.c b/sys/kern/kern_mutex.c index cd1ed7d..e61a187 100644 --- a/sys/kern/kern_mutex.c +++ b/sys/kern/kern_mutex.c @@ -101,14 +101,14 @@ static void assert_mtx(const struct lock_object *lock, int what); #ifdef DDB static void db_show_mtx(const struct lock_object *lock); #endif -static void lock_mtx(struct lock_object *lock, int how); -static void lock_spin(struct lock_object *lock, int how); +static void lock_mtx(struct lock_object *lock, uintptr_t how); +static void lock_spin(struct lock_object *lock, uintptr_t how); #ifdef KDTRACE_HOOKS static int owner_mtx(const struct lock_object *lock, struct thread **owner); #endif -static int unlock_mtx(struct lock_object *lock); -static int unlock_spin(struct lock_object *lock); +static uintptr_t unlock_mtx(struct lock_object *lock); +static uintptr_t unlock_spin(struct lock_object *lock); /* * Lock classes for sleep and spin mutexes. @@ -154,20 +154,20 @@ assert_mtx(const struct lock_object *lock, int what) } void -lock_mtx(struct lock_object *lock, int how) +lock_mtx(struct lock_object *lock, uintptr_t how) { mtx_lock((struct mtx *)lock); } void -lock_spin(struct lock_object *lock, int how) +lock_spin(struct lock_object *lock, uintptr_t how) { panic("spin locks can only use msleep_spin"); } -int +uintptr_t unlock_mtx(struct lock_object *lock) { struct mtx *m; @@ -178,7 +178,7 @@ unlock_mtx(struct lock_object *lock) return (0); } -int +uintptr_t unlock_spin(struct lock_object *lock) { |