mirror of
https://github.com/opnsense/src.git
synced 2026-06-11 01:30:30 -04:00
In the actual code for witness_warn:
- If there aren't spinlocks held, but there are problems with old sleeplocks, they are not reported. - If the spinlock found is not the only one, problems are not reported. Fix these 2 problems. Reported by: tegge
This commit is contained in:
parent
7e1bc2729c
commit
ca86d51602
1 changed files with 11 additions and 18 deletions
|
|
@ -1628,13 +1628,7 @@ witness_warn(int flags, struct lock_object *lock, const char *fmt, ...)
|
|||
*/
|
||||
sched_pin();
|
||||
lock_list = PCPU_GET(spinlocks);
|
||||
if (lock_list != NULL) {
|
||||
|
||||
/* Empty list? */
|
||||
if (lock_list->ll_count == 0) {
|
||||
sched_unpin();
|
||||
return (n);
|
||||
}
|
||||
if (lock_list != NULL && lock_list->ll_count != 0) {
|
||||
sched_unpin();
|
||||
|
||||
/*
|
||||
|
|
@ -1644,18 +1638,17 @@ witness_warn(int flags, struct lock_object *lock, const char *fmt, ...)
|
|||
* should hold.
|
||||
*/
|
||||
lock1 = &lock_list->ll_children[lock_list->ll_count - 1];
|
||||
if (lock1->li_lock == lock)
|
||||
return (n);
|
||||
if (lock_list->ll_count == 1 && lock_list->ll_next == NULL &&
|
||||
lock1->li_lock == lock && n == 0)
|
||||
return (0);
|
||||
|
||||
if (n == 0) {
|
||||
va_start(ap, fmt);
|
||||
vprintf(fmt, ap);
|
||||
va_end(ap);
|
||||
printf(" with the following");
|
||||
if (flags & WARN_SLEEPOK)
|
||||
printf(" non-sleepable");
|
||||
printf(" locks held:\n");
|
||||
}
|
||||
va_start(ap, fmt);
|
||||
vprintf(fmt, ap);
|
||||
va_end(ap);
|
||||
printf(" with the following");
|
||||
if (flags & WARN_SLEEPOK)
|
||||
printf(" non-sleepable");
|
||||
printf(" locks held:\n");
|
||||
n += witness_list_locks(&lock_list);
|
||||
} else
|
||||
sched_unpin();
|
||||
|
|
|
|||
Loading…
Reference in a new issue