• Qian Cai's avatar
    powerpc/eeh_cache: Fix a possible debugfs deadlock · fd552e05
    Qian Cai authored
    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: 5ca85ae6 ("powerpc/eeh_cache: Add a way to dump the EEH address cache")
    Signed-off-by: default avatarQian Cai <cai@redhat.com>
    Reviewed-by: default avatarOliver O'Halloran <oohall@gmail.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20201028152717.8967-1-cai@redhat.com
    fd552e05
eeh_cache.c 7.81 KB