When irq_matrix_free() is called for an unallocated interrupt, managed_allocated/total_allocated counters get out of sync with the real state of the matrix. Later, when the last interrupt is freed, these counters will go negative (overflow). While this is certainly a problem of the calling code, we can do better in irq_matrix_free() and simplify debugging.
An example of a problem described above: https://lore.kernel.org/lkml/[email protected]/ Suggested-by: Thomas Gleixner <[email protected]> Signed-off-by: Vitaly Kuznetsov <[email protected]> --- kernel/irq/matrix.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/kernel/irq/matrix.c b/kernel/irq/matrix.c index 651a4ad6d711..8e586858bcf4 100644 --- a/kernel/irq/matrix.c +++ b/kernel/irq/matrix.c @@ -423,7 +423,9 @@ void irq_matrix_free(struct irq_matrix *m, unsigned int cpu, if (WARN_ON_ONCE(bit < m->alloc_start || bit >= m->alloc_end)) return; - clear_bit(bit, cm->alloc_map); + if (WARN_ON_ONCE(!test_and_clear_bit(bit, cm->alloc_map))) + return; + cm->allocated--; if(managed) cm->managed_allocated--; -- 2.30.2

