irq_shutdown_and_deactivate() is normally called with the descriptor lock
held, and interrupts disabled. Nested a few levels down, it grabs the
global irq_resend_lock. Lockdep rightfully complains when interrupts are
not disabled:
CPU0 CPU1
---- ----
lock(irq_resend_lock);
local_irq_disable();
lock(&irq_desc_lock_class);
lock(irq_resend_lock);
<Interrupt>
lock(&irq_desc_lock_class);
...
_raw_spin_lock+0x2b/0x40
clear_irq_resend+0x14/0x70
irq_shutdown_and_deactivate+0x29/0x80
irq_shutdown_depth_test+0x1ce/0x600
kunit_try_run_case+0x90/0x120
Grab the descriptor lock and disable interrupts, to resolve the
problem.
Fixes:
|
||
|---|---|---|
| .. | ||
| Kconfig | ||
| Makefile | ||
| affinity.c | ||
| autoprobe.c | ||
| chip.c | ||
| cpuhotplug.c | ||
| debug.h | ||
| debugfs.c | ||
| devres.c | ||
| dummychip.c | ||
| generic-chip.c | ||
| handle.c | ||
| internals.h | ||
| ipi-mux.c | ||
| ipi.c | ||
| irq_sim.c | ||
| irq_test.c | ||
| irqdesc.c | ||
| irqdomain.c | ||
| kexec.c | ||
| manage.c | ||
| matrix.c | ||
| migration.c | ||
| msi.c | ||
| pm.c | ||
| proc.c | ||
| resend.c | ||
| settings.h | ||
| spurious.c | ||
| timings.c | ||