- Add some comments to some of the static lock orders. Don't explicitly
link proctree and allproc to Giant since that order is already implicitly enforced. - Use a goto to handle the case where we want to enforce a reversal before calling isitmydescendant() in witness_checkorder() so that the logic is easier to follow and so that it is easier to add more forced-reversal cases in the future. MFC after: 3 days
This commit is contained in:
parent
83cece6fa1
commit
acc0265cc2
@ -259,8 +259,15 @@ static struct witness_child_list_entry w_childdata[WITNESS_CHILDCOUNT];
|
||||
static struct lock_list_entry w_locklistdata[LOCK_CHILDCOUNT];
|
||||
|
||||
static struct witness_order_list_entry order_lists[] = {
|
||||
/*
|
||||
* sx locks
|
||||
*/
|
||||
{ "proctree", &lock_class_sx },
|
||||
{ "allproc", &lock_class_sx },
|
||||
{ NULL, NULL },
|
||||
/*
|
||||
* Various mutexes
|
||||
*/
|
||||
{ "Giant", &lock_class_mtx_sleep },
|
||||
{ "filedesc structure", &lock_class_mtx_sleep },
|
||||
{ "pipe mutex", &lock_class_mtx_sleep },
|
||||
@ -868,13 +875,15 @@ witness_checkorder(struct lock_object *lock, int flags, const char *file,
|
||||
* order violation to enfore a general lock order of
|
||||
* sleepable locks before non-sleepable locks.
|
||||
*/
|
||||
if (!((lock->lo_flags & LO_SLEEPABLE) != 0 &&
|
||||
if (((lock->lo_flags & LO_SLEEPABLE) != 0 &&
|
||||
(lock1->li_lock->lo_flags & LO_SLEEPABLE) == 0))
|
||||
/*
|
||||
* Check the lock order hierarchy for a reveresal.
|
||||
*/
|
||||
if (!isitmydescendant(w, w1))
|
||||
goto reversal;
|
||||
/*
|
||||
* Check the lock order hierarchy for a reveresal.
|
||||
*/
|
||||
if (!isitmydescendant(w, w1))
|
||||
continue;
|
||||
reversal:
|
||||
/*
|
||||
* We have a lock order violation, check to see if it
|
||||
* is allowed or has already been yelled about.
|
||||
|
Loading…
Reference in New Issue
Block a user