Fix a witness assertion that fires when a lock type's class changes.

When all instances of a lock type are destroyed (for example, after a
module unload), the corresponding witness entry remains associated with
that lock type. In this case, we shouldn't panic if a new instance of the
lock type is created and its lock class does not match that recorded in the
witness entry.

Reviewed by:	jhb
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D11788
This commit is contained in:
markj 2017-08-01 17:50:28 +00:00
parent b2a5fd3ee9
commit c11beada10

View File

@ -1850,11 +1850,13 @@ enroll(const char *description, struct lock_class *lock_class)
found:
w->w_refcount++;
mtx_unlock_spin(&w_mtx);
if (lock_class != w->w_class)
if (w->w_refcount == 1)
w->w_class = lock_class;
else if (lock_class != w->w_class)
kassert_panic(
"lock (%s) %s does not match earlier (%s) lock",
description, lock_class->lc_name,
w->w_class->lc_name);
"lock (%s) %s does not match earlier (%s) lock",
description, lock_class->lc_name,
w->w_class->lc_name);
return (w);
}