• Alexander Shishkin's avatar
    intel_th: Fix freeing IRQs · ab832e38
    Alexander Shishkin authored
    Commit aac8da65 ("intel_th: msu: Start handling IRQs") implicitly
    relies on the use of devm_request_irq() to subsequently free the irqs on
    device removal, but in case of the pci_free_irq_vectors() API, the
    handlers need to be freed before it is called. Therefore, at the moment
    the driver's remove path trips a BUG_ON(irq_has_action()):
    
    > kernel BUG at drivers/pci/msi.c:375!
    > invalid opcode: 0000 1 SMP
    > CPU: 2 PID: 818 Comm: rmmod Not tainted 5.5.0-rc1+ #1
    > RIP: 0010:free_msi_irqs+0x67/0x1c0
    > pci_disable_msi+0x116/0x150
    > pci_free_irq_vectors+0x1b/0x20
    > intel_th_pci_remove+0x22/0x30 [intel_th_pci]
    > pci_device_remove+0x3e/0xb0
    > device_release_driver_internal+0xf0/0x1c0
    > driver_detach+0x4c/0x8f
    > bus_remove_driver+0x5c/0xd0
    > driver_unregister+0x31/0x50
    > pci_unregister_driver+0x40/0x90
    > intel_th_pci_driver_exit+0x10/0xad6 [intel_th_pci]
    > __x64_sys_delete_module+0x147/0x290
    > ? exit_to_usermode_loop+0xd7/0x120
    > do_syscall_64+0x57/0x1b0
    > entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    Fix this by explicitly freeing irqs before freeing the vectors. We keep
    using the devm_* variants because they are still useful in early error
    paths.
    Signed-off-by: default avatarAlexander Shishkin <alexander.shishkin@linux.intel.com>
    Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
    Fixes: aac8da65 ("intel_th: msu: Start handling IRQs")
    Reported-by: default avatarAmmy Yi <ammy.yi@intel.com>
    Tested-by: default avatarAmmy Yi <ammy.yi@intel.com>
    Cc: stable@vger.kernel.org # v5.2+
    Link: https://lore.kernel.org/r/20191217115527.74383-4-alexander.shishkin@linux.intel.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    ab832e38
intel_th.h 10.6 KB