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:
parent
b2a5fd3ee9
commit
c11beada10
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user