Message ID | 1543346933-440-1-git-send-email-cavery@redhat.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 02f425f811cefcc4d325d7a72272651e622dc97e |
Headers | show |
Series | scsi: vmw_pscsi: Rearrange code to avoid multiple calls to free_irq during unload | expand |
On Tue, Nov 27, 2018 at 02:28:53PM -0500, Cathy Avery wrote: > Currently pvscsi_remove calls free_irq more than once as > pvscsi_release_resources and __pvscsi_shutdown both call > pvscsi_shutdown_intr. This results in a 'Trying to free > already-free IRQ' warning and stack trace. To solve the problem > pvscsi_shutdown_intr has been moved out of pvscsi_release_resources. > > Signed-off-by: Cathy Avery <cavery@redhat.com> > Reviewed-by: Ewan D. Milne <emilne@redhat.com> That bug has been there since the driver was introduced in 2009. It's so amazing that no one has fixed it until now... Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com> regards, dan carpenter
Cathy, > Currently pvscsi_remove calls free_irq more than once as > pvscsi_release_resources and __pvscsi_shutdown both call > pvscsi_shutdown_intr. This results in a 'Trying to free > already-free IRQ' warning and stack trace. To solve the problem > pvscsi_shutdown_intr has been moved out of pvscsi_release_resources. Applied to 4.20/scsi-fixes, thanks!
diff --git a/drivers/scsi/vmw_pvscsi.c b/drivers/scsi/vmw_pvscsi.c index 6e49102..0d6b2a8 100644 --- a/drivers/scsi/vmw_pvscsi.c +++ b/drivers/scsi/vmw_pvscsi.c @@ -1202,8 +1202,6 @@ static void pvscsi_shutdown_intr(struct pvscsi_adapter *adapter) static void pvscsi_release_resources(struct pvscsi_adapter *adapter) { - pvscsi_shutdown_intr(adapter); - if (adapter->workqueue) destroy_workqueue(adapter->workqueue); @@ -1534,6 +1532,7 @@ static int pvscsi_probe(struct pci_dev *pdev, const struct pci_device_id *id) out_reset_adapter: ll_adapter_reset(adapter); out_release_resources: + pvscsi_shutdown_intr(adapter); pvscsi_release_resources(adapter); scsi_host_put(host); out_disable_device: @@ -1542,6 +1541,7 @@ static int pvscsi_probe(struct pci_dev *pdev, const struct pci_device_id *id) return error; out_release_resources_and_disable: + pvscsi_shutdown_intr(adapter); pvscsi_release_resources(adapter); goto out_disable_device; }