Index: sys/kern/subr_witness.c =================================================================== --- sys/kern/subr_witness.c (wersja 215409) +++ sys/kern/subr_witness.c (kopia robocza) @@ -425,6 +425,11 @@ SYSCTL_INT(_debug_witness, OID_AUTO, skipspin, CTLFLAG_RDTUN, &witness_skipspin, 0, ""); +static int witness_do_checkorder = 1; +TUNABLE_INT("debug.witness.checkorder", &witness_do_checkorder); +SYSCTL_INT(_debug_witness, OID_AUTO, checkorder, CTLFLAG_RW, + &witness_do_checkorder, 0, ""); + /* * Call this to print out the relations between locks. */ @@ -1046,8 +1051,9 @@ struct thread *td; int i, j; - if (witness_cold || witness_watch < 1 || lock->lo_witness == NULL || - panicstr != NULL) + if (witness_cold || witness_watch < 1 || !witness_do_checkorder || + lock->lo_witness == NULL || + (lock->lo_flags & LO_NOORDERCHECK) != 0 || panicstr != NULL) return; w = lock->lo_witness; Index: sys/kern/kern_mutex.c =================================================================== --- sys/kern/kern_mutex.c (wersja 215409) +++ sys/kern/kern_mutex.c (kopia robocza) @@ -780,7 +780,8 @@ int flags; MPASS((opts & ~(MTX_SPIN | MTX_QUIET | MTX_RECURSE | - MTX_NOWITNESS | MTX_DUPOK | MTX_NOPROFILE)) == 0); + MTX_NOWITNESS | MTX_DUPOK | MTX_NOPROFILE | + MTX_NOORDERCHECK)) == 0); ASSERT_ATOMIC_LOAD_PTR(m->mtx_lock, ("%s: mtx_lock not aligned for %s: %p", __func__, name, &m->mtx_lock)); @@ -806,6 +807,8 @@ flags |= LO_DUPOK; if (opts & MTX_NOPROFILE) flags |= LO_NOPROFILE; + if (opts & MTX_NOORDERCHECK) + flags |= LO_NOORDERCHECK; /* Initialize mutex. */ m->mtx_lock = MTX_UNOWNED; Index: sys/kern/kern_rwlock.c =================================================================== --- sys/kern/kern_rwlock.c (wersja 215409) +++ sys/kern/kern_rwlock.c (kopia robocza) @@ -173,7 +173,7 @@ int flags; MPASS((opts & ~(RW_DUPOK | RW_NOPROFILE | RW_NOWITNESS | RW_QUIET | - RW_RECURSE)) == 0); + RW_RECURSE | RW_NOORDERCHECK)) == 0); ASSERT_ATOMIC_LOAD_PTR(rw->rw_lock, ("%s: rw_lock not aligned for %s: %p", __func__, name, &rw->rw_lock)); @@ -189,6 +189,8 @@ flags |= LO_RECURSABLE; if (opts & RW_QUIET) flags |= LO_QUIET; + if (opts & RW_NOORDERCHECK) + flags |= LO_NOORDERCHECK; rw->rw_lock = RW_UNLOCKED; rw->rw_recurse = 0; Index: sys/kern/kern_sx.c =================================================================== --- sys/kern/kern_sx.c (wersja 215409) +++ sys/kern/kern_sx.c (kopia robocza) @@ -204,7 +204,7 @@ int flags; MPASS((opts & ~(SX_QUIET | SX_RECURSE | SX_NOWITNESS | SX_DUPOK | - SX_NOPROFILE | SX_NOADAPTIVE)) == 0); + SX_NOPROFILE | SX_NOADAPTIVE | SX_NOORDERCHECK)) == 0); ASSERT_ATOMIC_LOAD_PTR(sx->sx_lock, ("%s: sx_lock not aligned for %s: %p", __func__, description, &sx->sx_lock)); @@ -220,6 +220,8 @@ flags |= LO_RECURSABLE; if (opts & SX_QUIET) flags |= LO_QUIET; + if (opts & SX_NOORDERCHECK) + flags |= LO_NOORDERCHECK; flags |= opts & SX_NOADAPTIVE; sx->sx_lock = SX_LOCK_UNLOCKED; Index: sys/kern/kern_lock.c =================================================================== --- sys/kern/kern_lock.c (wersja 215409) +++ sys/kern/kern_lock.c (kopia robocza) @@ -385,6 +385,8 @@ iflags |= LO_WITNESS; if (flags & LK_QUIET) iflags |= LO_QUIET; + if (flags & LK_NOORDERCHECK) + iflags |= LO_NOORDERCHECK; iflags |= flags & (LK_ADAPTIVE | LK_NOSHARE); lk->lk_lock = LK_UNLOCKED; Index: sys/kern/kern_rmlock.c =================================================================== --- sys/kern/kern_rmlock.c (wersja 215409) +++ sys/kern/kern_rmlock.c (kopia robocza) @@ -198,6 +198,8 @@ liflags |= LO_WITNESS; if (opts & RM_RECURSE) liflags |= LO_RECURSABLE; + if (opts & RM_NOORDERCHECK) + liflags |= LO_NOORDERCHECK; rm->rm_writecpus = all_cpus; LIST_INIT(&rm->rm_activeReaders); if (opts & RM_SLEEPABLE) { Index: sys/sys/sx.h =================================================================== --- sys/sys/sx.h (wersja 215409) +++ sys/sys/sx.h (kopia robocza) @@ -260,6 +260,7 @@ #define SX_QUIET 0x08 #define SX_NOADAPTIVE 0x10 #define SX_RECURSE 0x20 +#define SX_NOORDERCHECK 0x40 /* * Options passed to sx_*lock_hard(). Index: sys/sys/rwlock.h =================================================================== --- sys/sys/rwlock.h (wersja 215409) +++ sys/sys/rwlock.h (kopia robocza) @@ -218,6 +218,7 @@ #define RW_NOWITNESS 0x04 #define RW_QUIET 0x08 #define RW_RECURSE 0x10 +#define RW_NOORDERCHECK 0x20 /* * The INVARIANTS-enabled rw_assert() functionality. Index: sys/sys/lock.h =================================================================== --- sys/sys/lock.h (wersja 215409) +++ sys/sys/lock.h (kopia robocza) @@ -79,6 +79,7 @@ #define LO_SLEEPABLE 0x00100000 /* Lock may be held while sleeping. */ #define LO_UPGRADABLE 0x00200000 /* Lock may be upgraded/downgraded. */ #define LO_DUPOK 0x00400000 /* Don't check for duplicate acquires */ +#define LO_NOORDERCHECK 0x00800000 /* Don't check order in witness. */ #define LO_CLASSMASK 0x0f000000 /* Class index bitmask. */ #define LO_NOPROFILE 0x10000000 /* Don't profile this lock */ Index: sys/sys/lockmgr.h =================================================================== --- sys/sys/lockmgr.h (wersja 215409) +++ sys/sys/lockmgr.h (kopia robocza) @@ -146,6 +146,7 @@ #define LK_NOWITNESS 0x000010 #define LK_QUIET 0x000020 #define LK_ADAPTIVE 0x000040 +#define LK_NOORDERCHECK 0x000080 /* * Additional attributes to be used in lockmgr(). Index: sys/sys/rmlock.h =================================================================== --- sys/sys/rmlock.h (wersja 215409) +++ sys/sys/rmlock.h (kopia robocza) @@ -45,6 +45,7 @@ #define RM_NOWITNESS 0x00000001 #define RM_RECURSE 0x00000002 #define RM_SLEEPABLE 0x00000004 +#define RM_NOORDERCHECK 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/mutex.h =================================================================== --- sys/sys/mutex.h (wersja 215409) +++ sys/sys/mutex.h (kopia robocza) @@ -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_NOORDERCHECK 0x00000040 /* Don't check order in witness. */ /* * Option flags passed to certain lock/unlock routines, through the use Index: share/man/man4/witness.4 =================================================================== --- share/man/man4/witness.4 (wersja 215409) +++ share/man/man4/witness.4 (kopia robocza) @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd February 18, 2001 +.Dd January 7, 2011 .Dt WITNESS 4 .Os .Sh NAME @@ -104,6 +104,13 @@ can be set via .Xr loader 8 . .Pp +The sysctl +.Va debug.witness.checkorder +allows to disable lock ordering problems checking and reporting. +All lock operations are still recorder, which allows to obtain useful data from +.Xr ddb 4 +witness commands. +.Pp The .Nm code also provides two extra Index: share/man/man9/sx.9 =================================================================== --- share/man/man9/sx.9 (wersja 216565) +++ share/man/man9/sx.9 (kopia robocza) @@ -26,7 +26,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 28, 2009 +.Dd January 7, 2011 .Dt SX 9 .Os .Sh NAME @@ -122,7 +122,7 @@ specifies a set of optional flags to alter the behavior of .Fa sx . It contains one or more of the following flags: -.Bl -tag -width SX_NOADAPTIVE +.Bl -tag -width SX_NOORDERCHECK .It Dv SX_NOADAPTIVE If the kernel is not compiled with .Cd "options NO_ADAPTIVE_SX" , @@ -144,6 +144,10 @@ .It Dv SX_QUIET Do not log any operations for this lock via .Xr ktr 4 . +.It Dv SX_NOORDERCHECK +Instruct +.Xr witness 4 +not to report lock ordering problems for this lock. .El .Pp Shared/exclusive locks are destroyed with Index: share/man/man9/rwlock.9 =================================================================== --- share/man/man9/rwlock.9 (wersja 216565) +++ share/man/man9/rwlock.9 (kopia robocza) @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 1, 2008 +.Dd January 7, 2011 .Dt RWLOCK 9 .Os .Sh NAME @@ -141,7 +141,7 @@ .Fa opts argument. It contains one or more of the following flags: -.Bl -tag -width ".Dv RW_NOPROFILE" +.Bl -tag -width ".Dv RW_NOORDERCHECK" .It Dv RW_DUPOK Witness should not log messages about duplicate locks being acquired. .It Dv RW_NOPROFILE @@ -156,6 +156,10 @@ .It Dv RW_RECURSE Allow threads to recursively acquire exclusive locks for .Fa rw . +.It Dv RW_NOORDERCHECK +Instruct +.Xr witness 4 +not to report lock ordering problems for this lock. .El .It Fn rw_rlock "struct rwlock *rw" Lock Index: share/man/man9/lock.9 =================================================================== --- share/man/man9/lock.9 (wersja 216565) +++ share/man/man9/lock.9 (kopia robocza) @@ -26,7 +26,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 16, 2009 +.Dd January 7, 2011 .Dt LOCK 9 .Os .Sh NAME @@ -95,7 +95,7 @@ .Xr sleep 9 . .It Fa flags The flags the lock is to be initialized with: -.Bl -tag -width ".Dv LK_CANRECURSE" +.Bl -tag -width ".Dv LK_NOORDERCHECK" .It Dv LK_ADAPTIVE Enable adaptive spinning for this lock if the kernel is compiled with the ADAPTIVE_LOCKMGRS option. @@ -120,6 +120,10 @@ Use .Fa timo during a sleep; otherwise, 0 is used. +.It Dv LK_NOORDERCHECK +Instruct +.Xr witness 4 +not to report lock ordering problems for this lock. .El .El .Pp Index: share/man/man9/rmlock.9 =================================================================== --- share/man/man9/rmlock.9 (wersja 216565) +++ share/man/man9/rmlock.9 (kopia robocza) @@ -26,7 +26,7 @@ .\" $FreeBSD$ .\" .\" Based on rwlock.9 man page -.Dd November 10, 2007 +.Dd January 7, 2011 .Dt RMLOCK 9 .Os .Sh NAME @@ -132,7 +132,7 @@ .Fa opts argument. It contains one or more of the following flags: -.Bl -tag -width ".Dv RM_NOWITNESS" +.Bl -tag -width ".Dv RM_NOORDERCHECK" .It Dv RM_NOWITNESS Instruct .Xr witness 4 @@ -147,6 +147,10 @@ .Fn rm_try_rlock instead of .Fn rm_rlock . +.It Dv RM_NOORDERCHECK +Instruct +.Xr witness 4 +not to report lock ordering problems for this lock. .El .It Fn rm_rlock "struct rmlock *rm" "struct rm_priotracker* tracker" Lock Index: share/man/man9/mutex.9 =================================================================== --- share/man/man9/mutex.9 (wersja 216565) +++ share/man/man9/mutex.9 (kopia robocza) @@ -28,7 +28,7 @@ .\" from BSDI $Id: mutex.4,v 1.1.2.3 1998/04/27 22:53:13 ewv Exp $ .\" $FreeBSD$ .\" -.Dd December 21, 2006 +.Dd January 7, 2011 .Dt MUTEX 9 .Os .Sh NAME @@ -423,7 +423,7 @@ .Dv MTX_SPIN options is required and only one of those two options may be specified. The possibilities are: -.Bl -tag -width MTX_NOWITNESS +.Bl -tag -width MTX_NOORDERCHECK .It Dv MTX_DEF Default mutexes will always allow the current thread to be suspended @@ -448,6 +448,10 @@ Witness should not log messages about duplicate locks being acquired. .It Dv MTX_NOPROFILE Do not profile this lock. +.It Dv MTX_NOORDERCHECK +Instruct +.Xr witness 4 +not to report lock ordering problems for this lock. .El .Ss Lock and Unlock Flags The flags passed to the