summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authordchagin <dchagin@FreeBSD.org>2014-12-13 21:00:10 +0000
committerdchagin <dchagin@FreeBSD.org>2014-12-13 21:00:10 +0000
commit6f2b57128c8cdb88f2777eed3c99e866c3c53e04 (patch)
tree953adb99f01e8d4c4fb2634bbc85b752a2c305b1 /sys
parent7b50e3bb4b97cc0c655bf237c04e5caff51c5960 (diff)
downloadFreeBSD-src-6f2b57128c8cdb88f2777eed3c99e866c3c53e04.zip
FreeBSD-src-6f2b57128c8cdb88f2777eed3c99e866c3c53e04.tar.gz
Add _NEW flag to mtx(9), sx(9), rmlock(9) and rwlock(9).
A _NEW flag passed to _init_flags() to avoid check for double-init. Differential Revision: https://reviews.freebsd.org/D1208 Reviewed by: jhb, wblock MFC after: 1 Month
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/kern_mutex.c4
-rw-r--r--sys/kern/kern_rmlock.c12
-rw-r--r--sys/kern/kern_rwlock.c4
-rw-r--r--sys/kern/kern_sx.c4
-rw-r--r--sys/kern/subr_lock.c4
-rw-r--r--sys/sys/lock.h1
-rw-r--r--sys/sys/mutex.h1
-rw-r--r--sys/sys/rmlock.h1
-rw-r--r--sys/sys/rwlock.h1
-rw-r--r--sys/sys/sx.h1
10 files changed, 25 insertions, 8 deletions
diff --git a/sys/kern/kern_mutex.c b/sys/kern/kern_mutex.c
index d21be50..ea6f7a6 100644
--- a/sys/kern/kern_mutex.c
+++ b/sys/kern/kern_mutex.c
@@ -881,7 +881,7 @@ _mtx_init(volatile uintptr_t *c, const char *name, const char *type, int opts)
m = mtxlock2mtx(c);
MPASS((opts & ~(MTX_SPIN | MTX_QUIET | MTX_RECURSE |
- MTX_NOWITNESS | MTX_DUPOK | MTX_NOPROFILE)) == 0);
+ MTX_NOWITNESS | MTX_DUPOK | MTX_NOPROFILE | MTX_NEW)) == 0);
ASSERT_ATOMIC_LOAD_PTR(m->mtx_lock,
("%s: mtx_lock not aligned for %s: %p", __func__, name,
&m->mtx_lock));
@@ -907,6 +907,8 @@ _mtx_init(volatile uintptr_t *c, const char *name, const char *type, int opts)
flags |= LO_DUPOK;
if (opts & MTX_NOPROFILE)
flags |= LO_NOPROFILE;
+ if (opts & MTX_NEW)
+ flags |= LO_NEW;
/* Initialize mutex. */
lock_init(&m->lock_object, class, name, type, flags);
diff --git a/sys/kern/kern_rmlock.c b/sys/kern/kern_rmlock.c
index d93aa15..b5ea2af 100644
--- a/sys/kern/kern_rmlock.c
+++ b/sys/kern/kern_rmlock.c
@@ -277,22 +277,28 @@ void
rm_init_flags(struct rmlock *rm, const char *name, int opts)
{
struct lock_class *lc;
- int liflags;
+ int liflags, xflags;
liflags = 0;
if (!(opts & RM_NOWITNESS))
liflags |= LO_WITNESS;
if (opts & RM_RECURSE)
liflags |= LO_RECURSABLE;
+ if (opts & RM_NEW)
+ liflags |= LO_NEW;
rm->rm_writecpus = all_cpus;
LIST_INIT(&rm->rm_activeReaders);
if (opts & RM_SLEEPABLE) {
liflags |= LO_SLEEPABLE;
lc = &lock_class_rm_sleepable;
- sx_init_flags(&rm->rm_lock_sx, "rmlock_sx", SX_NOWITNESS);
+ xflags = (opts & RM_NEW ? SX_NEW : 0);
+ sx_init_flags(&rm->rm_lock_sx, "rmlock_sx",
+ xflags | SX_NOWITNESS);
} else {
lc = &lock_class_rm;
- mtx_init(&rm->rm_lock_mtx, name, "rmlock_mtx", MTX_NOWITNESS);
+ xflags = (opts & RM_NEW ? MTX_NEW : 0);
+ mtx_init(&rm->rm_lock_mtx, name, "rmlock_mtx",
+ xflags | MTX_NOWITNESS);
}
lock_init(&rm->lock_object, lc, name, NULL, liflags);
}
diff --git a/sys/kern/kern_rwlock.c b/sys/kern/kern_rwlock.c
index c0906c0..d3cfbdd 100644
--- a/sys/kern/kern_rwlock.c
+++ b/sys/kern/kern_rwlock.c
@@ -187,7 +187,7 @@ _rw_init_flags(volatile uintptr_t *c, const char *name, int opts)
rw = rwlock2rw(c);
MPASS((opts & ~(RW_DUPOK | RW_NOPROFILE | RW_NOWITNESS | RW_QUIET |
- RW_RECURSE)) == 0);
+ RW_RECURSE | RW_NEW)) == 0);
ASSERT_ATOMIC_LOAD_PTR(rw->rw_lock,
("%s: rw_lock not aligned for %s: %p", __func__, name,
&rw->rw_lock));
@@ -203,6 +203,8 @@ _rw_init_flags(volatile uintptr_t *c, const char *name, int opts)
flags |= LO_RECURSABLE;
if (opts & RW_QUIET)
flags |= LO_QUIET;
+ if (opts & RW_NEW)
+ flags |= LO_NEW;
lock_init(&rw->lock_object, &lock_class_rw, name, NULL, flags);
rw->rw_lock = RW_UNLOCKED;
diff --git a/sys/kern/kern_sx.c b/sys/kern/kern_sx.c
index 6bd2760..a986590 100644
--- a/sys/kern/kern_sx.c
+++ b/sys/kern/kern_sx.c
@@ -209,7 +209,7 @@ sx_init_flags(struct sx *sx, const char *description, int opts)
int flags;
MPASS((opts & ~(SX_QUIET | SX_RECURSE | SX_NOWITNESS | SX_DUPOK |
- SX_NOPROFILE | SX_NOADAPTIVE)) == 0);
+ SX_NOPROFILE | SX_NOADAPTIVE | SX_NEW)) == 0);
ASSERT_ATOMIC_LOAD_PTR(sx->sx_lock,
("%s: sx_lock not aligned for %s: %p", __func__, description,
&sx->sx_lock));
@@ -225,6 +225,8 @@ sx_init_flags(struct sx *sx, const char *description, int opts)
flags |= LO_RECURSABLE;
if (opts & SX_QUIET)
flags |= LO_QUIET;
+ if (opts & SX_NEW)
+ flags |= LO_NEW;
flags |= opts & SX_NOADAPTIVE;
lock_init(&sx->lock_object, &lock_class_sx, description, NULL, flags);
diff --git a/sys/kern/subr_lock.c b/sys/kern/subr_lock.c
index ef13aee..e78d5a9 100644
--- a/sys/kern/subr_lock.c
+++ b/sys/kern/subr_lock.c
@@ -75,8 +75,8 @@ lock_init(struct lock_object *lock, struct lock_class *class, const char *name,
int i;
/* Check for double-init and zero object. */
- KASSERT(!lock_initialized(lock), ("lock \"%s\" %p already initialized",
- name, lock));
+ KASSERT(flags & LO_NEW || !lock_initialized(lock),
+ ("lock \"%s\" %p already initialized", name, lock));
/* Look up lock class to find its index. */
for (i = 0; i < LOCK_CLASS_MAX; i++)
diff --git a/sys/sys/lock.h b/sys/sys/lock.h
index e4b573a..8d7a068 100644
--- a/sys/sys/lock.h
+++ b/sys/sys/lock.h
@@ -84,6 +84,7 @@ struct lock_class {
#define LO_IS_VNODE 0x00800000 /* Tell WITNESS about a VNODE lock */
#define LO_CLASSMASK 0x0f000000 /* Class index bitmask. */
#define LO_NOPROFILE 0x10000000 /* Don't profile this lock */
+#define LO_NEW 0x20000000 /* Don't check for double-init */
/*
* Lock classes are statically assigned an index into the gobal lock_classes
diff --git a/sys/sys/mutex.h b/sys/sys/mutex.h
index 4678600..ec0c241 100644
--- a/sys/sys/mutex.h
+++ b/sys/sys/mutex.h
@@ -52,6 +52,7 @@
#define MTX_RECURSE 0x00000004 /* Option: lock allowed to recurse */
#define MTX_NOWITNESS 0x00000008 /* Don't do any witness checking. */
#define MTX_NOPROFILE 0x00000020 /* Don't profile this lock */
+#define MTX_NEW 0x00000040 /* Don't check for double-init */
/*
* Option flags passed to certain lock/unlock routines, through the use
diff --git a/sys/sys/rmlock.h b/sys/sys/rmlock.h
index ed6110a..891fff1 100644
--- a/sys/sys/rmlock.h
+++ b/sys/sys/rmlock.h
@@ -45,6 +45,7 @@
#define RM_NOWITNESS 0x00000001
#define RM_RECURSE 0x00000002
#define RM_SLEEPABLE 0x00000004
+#define RM_NEW 0x00000008
void rm_init(struct rmlock *rm, const char *name);
void rm_init_flags(struct rmlock *rm, const char *name, int opts);
diff --git a/sys/sys/rwlock.h b/sys/sys/rwlock.h
index a1fcb86..b638d3e 100644
--- a/sys/sys/rwlock.h
+++ b/sys/sys/rwlock.h
@@ -258,6 +258,7 @@ struct rw_args_flags {
#define RW_NOWITNESS 0x04
#define RW_QUIET 0x08
#define RW_RECURSE 0x10
+#define RW_NEW 0x20
/*
* The INVARIANTS-enabled rw_assert() functionality.
diff --git a/sys/sys/sx.h b/sys/sys/sx.h
index 8e4a644..1da4356 100644
--- a/sys/sys/sx.h
+++ b/sys/sys/sx.h
@@ -292,6 +292,7 @@ __sx_sunlock(struct sx *sx, const char *file, int line)
#define SX_QUIET 0x08
#define SX_NOADAPTIVE 0x10
#define SX_RECURSE 0x20
+#define SX_NEW 0x40
/*
* Options passed to sx_*lock_hard().
OpenPOWER on IntegriCloud