summaryrefslogtreecommitdiffstats
path: root/sys/sys/rmlock.h
diff options
context:
space:
mode:
authormlaier <mlaier@FreeBSD.org>2010-09-01 19:50:03 +0000
committermlaier <mlaier@FreeBSD.org>2010-09-01 19:50:03 +0000
commit2ef34e9086061a856551d8553806222b224ee13f (patch)
treed9a5617b3239cbe92a3581fdb4eb3dbcf7d29261 /sys/sys/rmlock.h
parent0b65f62811c036da9558dd96e4d6cfe2b0eaf4a3 (diff)
downloadFreeBSD-src-2ef34e9086061a856551d8553806222b224ee13f.zip
FreeBSD-src-2ef34e9086061a856551d8553806222b224ee13f.tar.gz
rmlock(9) two additions and one change/fix:
- add rm_try_rlock(). - add RM_SLEEPABLE to use sx(9) as the back-end lock in order to sleep while holding the write lock. - change rm_noreadtoken to a cpu bitmask to indicate which CPUs need to go through the lock/unlock in order to synchronize. As a side effect, this also avoids IPI to CPUs without any readers during rm_wlock. Discussed with: ups@, rwatson@ on arch@ Sponsored by: Isilon Systems, Inc.
Diffstat (limited to 'sys/sys/rmlock.h')
-rw-r--r--sys/sys/rmlock.h22
1 files changed, 14 insertions, 8 deletions
diff --git a/sys/sys/rmlock.h b/sys/sys/rmlock.h
index 9766f67..ef5776b 100644
--- a/sys/sys/rmlock.h
+++ b/sys/sys/rmlock.h
@@ -33,6 +33,7 @@
#define _SYS_RMLOCK_H_
#include <sys/mutex.h>
+#include <sys/sx.h>
#include <sys/_lock.h>
#include <sys/_rmlock.h>
@@ -43,6 +44,7 @@
*/
#define RM_NOWITNESS 0x00000001
#define RM_RECURSE 0x00000002
+#define RM_SLEEPABLE 0x00000004
void rm_init(struct rmlock *rm, const char *name);
void rm_init_flags(struct rmlock *rm, const char *name, int opts);
@@ -53,14 +55,15 @@ void rm_sysinit_flags(void *arg);
void _rm_wlock_debug(struct rmlock *rm, const char *file, int line);
void _rm_wunlock_debug(struct rmlock *rm, const char *file, int line);
-void _rm_rlock_debug(struct rmlock *rm, struct rm_priotracker *tracker,
- const char *file, int line);
+int _rm_rlock_debug(struct rmlock *rm, struct rm_priotracker *tracker,
+ int trylock, const char *file, int line);
void _rm_runlock_debug(struct rmlock *rm, struct rm_priotracker *tracker,
const char *file, int line);
void _rm_wlock(struct rmlock *rm);
void _rm_wunlock(struct rmlock *rm);
-void _rm_rlock(struct rmlock *rm, struct rm_priotracker *tracker);
+int _rm_rlock(struct rmlock *rm, struct rm_priotracker *tracker,
+ int trylock);
void _rm_runlock(struct rmlock *rm, struct rm_priotracker *tracker);
/*
@@ -74,14 +77,17 @@ void _rm_runlock(struct rmlock *rm, struct rm_priotracker *tracker);
#define rm_wlock(rm) _rm_wlock_debug((rm), LOCK_FILE, LOCK_LINE)
#define rm_wunlock(rm) _rm_wunlock_debug((rm), LOCK_FILE, LOCK_LINE)
#define rm_rlock(rm,tracker) \
- _rm_rlock_debug((rm),(tracker), LOCK_FILE, LOCK_LINE )
+ ((void)_rm_rlock_debug((rm),(tracker), 0, LOCK_FILE, LOCK_LINE ))
+#define rm_try_rlock(rm,tracker) \
+ _rm_rlock_debug((rm),(tracker), 1, LOCK_FILE, LOCK_LINE )
#define rm_runlock(rm,tracker) \
_rm_runlock_debug((rm), (tracker), LOCK_FILE, LOCK_LINE )
#else
-#define rm_wlock(rm) _rm_wlock((rm))
-#define rm_wunlock(rm) _rm_wunlock((rm))
-#define rm_rlock(rm,tracker) _rm_rlock((rm),(tracker))
-#define rm_runlock(rm,tracker) _rm_runlock((rm), (tracker))
+#define rm_wlock(rm) _rm_wlock((rm))
+#define rm_wunlock(rm) _rm_wunlock((rm))
+#define rm_rlock(rm,tracker) ((void)_rm_rlock((rm),(tracker), 0))
+#define rm_try_rlock(rm,tracker) _rm_rlock((rm),(tracker), 1)
+#define rm_runlock(rm,tracker) _rm_runlock((rm), (tracker))
#endif
struct rm_args {
OpenPOWER on IntegriCloud