• Dexuan Cui's avatar
    PCI: hv: Disable/enable IRQs rather than BH in hv_compose_msi_msg() · 35a88a18
    Dexuan Cui authored
    Commit de0aa7b2 ("PCI: hv: Fix 2 hang issues in hv_compose_msi_msg()")
    uses local_bh_disable()/enable(), because hv_pci_onchannelcallback() can
    also run in tasklet context as the channel event callback, so bottom halves
    should be disabled to prevent a race condition.
    
    With CONFIG_PROVE_LOCKING=y in the recent mainline, or old kernels that
    don't have commit f71b74bc ("irq/softirqs: Use lockdep to assert IRQs
    are disabled/enabled"), when the upper layer IRQ code calls
    hv_compose_msi_msg() with local IRQs disabled, we'll see a warning at the
    beginning of __local_bh_enable_ip():
    
      IRQs not enabled as expected
        WARNING: CPU: 0 PID: 408 at kernel/softirq.c:162 __local_bh_enable_ip
    
    The warning exposes an issue in de0aa7b2: local_bh_enable() can
    potentially call do_softirq(), which is not supposed to run when local IRQs
    are disabled. Let's fix this by using local_irq_save()/restore() instead.
    
    Note: hv_pci_onchannelcallback() is not a hot path because it's only called
    when the PCI device is hot added and removed, which is infrequent.
    
    Fixes: de0aa7b2 ("PCI: hv: Fix 2 hang issues in hv_compose_msi_msg()")
    Signed-off-by: default avatarDexuan Cui <decui@microsoft.com>
    Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: default avatarHaiyang Zhang <haiyangz@microsoft.com>
    Cc: stable@vger.kernel.org
    Cc: Stephen Hemminger <sthemmin@microsoft.com>
    Cc: K. Y. Srinivasan <kys@microsoft.com>
    35a88a18
pci-hyperv.c 73.1 KB