Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F140109038
D1208.id2550.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
8 KB
Referenced Files
None
Subscribers
None
D1208.id2550.diff
View Options
Index: share/man/man9/mutex.9
===================================================================
--- share/man/man9/mutex.9
+++ share/man/man9/mutex.9
@@ -177,13 +177,17 @@
or
.Dv MTX_SPIN
but not both.
-See below for additional initialization options.
-It is not permissible to pass the same
-.Fa mutex
-to
+If the kernel compiled with
+.Cd "option INVARIANTS" ,
.Fn mtx_init
-multiple times without intervening calls to
-.Fn mtx_destroy .
+will assert that the
+.Fa mutex
+multiple times initialized without intervening calls to
+.Fn mtx_destroy
+unless
+.Dv MTX_NEW
+option is specified.
+See below for additional initialization options.
.Pp
The
.Fn mtx_lock
@@ -453,6 +457,8 @@
Witness should not log messages about duplicate locks being acquired.
.It Dv MTX_NOPROFILE
Do not profile this lock.
+.It Dv MTX_NEW
+Do not check for double-init.
.El
.Ss Lock and Unlock Flags
The flags passed to the
Index: share/man/man9/rmlock.9
===================================================================
--- share/man/man9/rmlock.9
+++ share/man/man9/rmlock.9
@@ -156,6 +156,16 @@
.Fa rm .
.It Dv RM_SLEEPABLE
Create a sleepable read-mostly lock.
+.It Dv RM_NEW
+If the kernel compiled with
+.Cd "option INVARIANTS"
+then
+.Fn rm_init_flags
+will assert that
+.Fa rm
+initialized multiple times without intervening calls to
+.Fn rm_destroy
+unless this option is specified.
.El
.It Fn rm_rlock "struct rmlock *rm" "struct rm_priotracker* tracker"
Lock
Index: share/man/man9/rwlock.9
===================================================================
--- share/man/man9/rwlock.9
+++ share/man/man9/rwlock.9
@@ -154,6 +154,16 @@
.It Dv RW_RECURSE
Allow threads to recursively acquire exclusive locks for
.Fa rw .
+.It Dv RW_NEW
+If the kernel compiled with
+.Cd "option INVARIANTS"
+then
+.Fn rw_init_flags
+will assert that
+.Fa rw
+initialized multiple times without intervening calls to
+.Fn rw_destroy
+unless this option is specified.
.El
.It Fn rw_rlock "struct rwlock *rw"
Lock
Index: share/man/man9/sx.9
===================================================================
--- share/man/man9/sx.9
+++ share/man/man9/sx.9
@@ -144,6 +144,15 @@
.It Dv SX_QUIET
Do not log any operations for this lock via
.Xr ktr 4 .
+.It Dv SX_NEW
+If the kernel compiled with
+.Cd "options INVARIANTS"
+then
+.Fn sx_init
+will assert that this lock initialized multiple times
+without intervening calls to
+.Fn sx_destroy
+unless this option is specified.
.El
.Pp
Shared/exclusive locks are destroyed with
Index: sys/kern/kern_mutex.c
===================================================================
--- sys/kern/kern_mutex.c
+++ sys/kern/kern_mutex.c
@@ -881,7 +881,7 @@
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 @@
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);
Index: sys/kern/kern_rmlock.c
===================================================================
--- sys/kern/kern_rmlock.c
+++ sys/kern/kern_rmlock.c
@@ -277,22 +277,28 @@
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);
}
Index: sys/kern/kern_rwlock.c
===================================================================
--- sys/kern/kern_rwlock.c
+++ sys/kern/kern_rwlock.c
@@ -187,7 +187,7 @@
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 @@
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;
Index: sys/kern/kern_sx.c
===================================================================
--- sys/kern/kern_sx.c
+++ sys/kern/kern_sx.c
@@ -209,7 +209,7 @@
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 @@
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);
Index: sys/kern/subr_lock.c
===================================================================
--- sys/kern/subr_lock.c
+++ sys/kern/subr_lock.c
@@ -75,8 +75,8 @@
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++)
Index: sys/sys/lock.h
===================================================================
--- sys/sys/lock.h
+++ sys/sys/lock.h
@@ -84,6 +84,7 @@
#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
Index: sys/sys/mutex.h
===================================================================
--- sys/sys/mutex.h
+++ 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
Index: sys/sys/rmlock.h
===================================================================
--- sys/sys/rmlock.h
+++ 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);
Index: sys/sys/rwlock.h
===================================================================
--- sys/sys/rwlock.h
+++ sys/sys/rwlock.h
@@ -258,6 +258,7 @@
#define RW_NOWITNESS 0x04
#define RW_QUIET 0x08
#define RW_RECURSE 0x10
+#define RW_NEW 0x20
/*
* The INVARIANTS-enabled rw_assert() functionality.
Index: sys/sys/sx.h
===================================================================
--- sys/sys/sx.h
+++ sys/sys/sx.h
@@ -292,6 +292,7 @@
#define SX_QUIET 0x08
#define SX_NOADAPTIVE 0x10
#define SX_RECURSE 0x20
+#define SX_NEW 0x40
/*
* Options passed to sx_*lock_hard().
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Dec 21, 8:40 AM (3 m, 8 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27110348
Default Alt Text
D1208.id2550.diff (8 KB)
Attached To
Mode
D1208: Add xx_NEW flag to mtx(9), sx(9), rmlock(9) and rwlock(9). A xx_NEW flag passed to xx_init_flags() to avoid check for double-init. Use MTX_NEW in cpu_init_clocks_bsp() when initializing PCPU timerstate mtx.
Attached
Detach File
Event Timeline
Log In to Comment