Skip to content

Commit fd552e0

Browse files
Qian Caimpe
Qian Cai
authored andcommitted
powerpc/eeh_cache: Fix a possible debugfs deadlock
Lockdep complains that a possible deadlock below in eeh_addr_cache_show() because it is acquiring a lock with IRQ enabled, but eeh_addr_cache_insert_dev() needs to acquire the same lock with IRQ disabled. Let's just make eeh_addr_cache_show() acquire the lock with IRQ disabled as well. CPU0 CPU1 ---- ---- lock(&pci_io_addr_cache_root.piar_lock); local_irq_disable(); lock(&tp->lock); lock(&pci_io_addr_cache_root.piar_lock); <Interrupt> lock(&tp->lock); *** DEADLOCK *** lock_acquire+0x140/0x5f0 _raw_spin_lock_irqsave+0x64/0xb0 eeh_addr_cache_insert_dev+0x48/0x390 eeh_probe_device+0xb8/0x1a0 pnv_pcibios_bus_add_device+0x3c/0x80 pcibios_bus_add_device+0x118/0x290 pci_bus_add_device+0x28/0xe0 pci_bus_add_devices+0x54/0xb0 pcibios_init+0xc4/0x124 do_one_initcall+0xac/0x528 kernel_init_freeable+0x35c/0x3fc kernel_init+0x24/0x148 ret_from_kernel_thread+0x5c/0x80 lock_acquire+0x140/0x5f0 _raw_spin_lock+0x4c/0x70 eeh_addr_cache_show+0x38/0x110 seq_read+0x1a0/0x660 vfs_read+0xc8/0x1f0 ksys_read+0x74/0x130 system_call_exception+0xf8/0x1d0 system_call_common+0xe8/0x218 Fixes: 5ca85ae ("powerpc/eeh_cache: Add a way to dump the EEH address cache") Signed-off-by: Qian Cai <[email protected]> Reviewed-by: Oliver O'Halloran <[email protected]> Signed-off-by: Michael Ellerman <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 3cea11c commit fd552e0

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

arch/powerpc/kernel/eeh_cache.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,16 +264,17 @@ static int eeh_addr_cache_show(struct seq_file *s, void *v)
264264
{
265265
struct pci_io_addr_range *piar;
266266
struct rb_node *n;
267+
unsigned long flags;
267268

268-
spin_lock(&pci_io_addr_cache_root.piar_lock);
269+
spin_lock_irqsave(&pci_io_addr_cache_root.piar_lock, flags);
269270
for (n = rb_first(&pci_io_addr_cache_root.rb_root); n; n = rb_next(n)) {
270271
piar = rb_entry(n, struct pci_io_addr_range, rb_node);
271272

272273
seq_printf(s, "%s addr range [%pap-%pap]: %s\n",
273274
(piar->flags & IORESOURCE_IO) ? "i/o" : "mem",
274275
&piar->addr_lo, &piar->addr_hi, pci_name(piar->pcidev));
275276
}
276-
spin_unlock(&pci_io_addr_cache_root.piar_lock);
277+
spin_unlock_irqrestore(&pci_io_addr_cache_root.piar_lock, flags);
277278

278279
return 0;
279280
}

0 commit comments

Comments
 (0)