scsi: hpsa: use local workqueues instead of system workqueues
[ Upstream commit 0119208885b3faf2459de6d3fcc6d090580b906f ] Avoid system stalls by switching to local workqueue. Reviewed-by: Justin Lindley <justin.lindley@microsemi.com> Reviewed-by: David Carroll <david.carroll@microsemi.com> Reviewed-by: Scott Teel <scott.teel@microsemi.com> Signed-off-by: Don Brace <don.brace@microsemi.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Stable-dep-of: 9c9ff300e0de ("scsi: hpsa: Fix possible memory leak in hpsa_init_one()") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
7340ca9f78
commit
b62e7453a9
@@ -8133,6 +8133,11 @@ static void hpsa_undo_allocations_after_kdump_soft_reset(struct ctlr_info *h)
|
|||||||
destroy_workqueue(h->rescan_ctlr_wq);
|
destroy_workqueue(h->rescan_ctlr_wq);
|
||||||
h->rescan_ctlr_wq = NULL;
|
h->rescan_ctlr_wq = NULL;
|
||||||
}
|
}
|
||||||
|
if (h->monitor_ctlr_wq) {
|
||||||
|
destroy_workqueue(h->monitor_ctlr_wq);
|
||||||
|
h->monitor_ctlr_wq = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
kfree(h); /* init_one 1 */
|
kfree(h); /* init_one 1 */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8481,7 +8486,7 @@ static void hpsa_event_monitor_worker(struct work_struct *work)
|
|||||||
|
|
||||||
spin_lock_irqsave(&h->lock, flags);
|
spin_lock_irqsave(&h->lock, flags);
|
||||||
if (!h->remove_in_progress)
|
if (!h->remove_in_progress)
|
||||||
schedule_delayed_work(&h->event_monitor_work,
|
queue_delayed_work(h->monitor_ctlr_wq, &h->event_monitor_work,
|
||||||
HPSA_EVENT_MONITOR_INTERVAL);
|
HPSA_EVENT_MONITOR_INTERVAL);
|
||||||
spin_unlock_irqrestore(&h->lock, flags);
|
spin_unlock_irqrestore(&h->lock, flags);
|
||||||
}
|
}
|
||||||
@@ -8527,7 +8532,7 @@ static void hpsa_monitor_ctlr_worker(struct work_struct *work)
|
|||||||
|
|
||||||
spin_lock_irqsave(&h->lock, flags);
|
spin_lock_irqsave(&h->lock, flags);
|
||||||
if (!h->remove_in_progress)
|
if (!h->remove_in_progress)
|
||||||
schedule_delayed_work(&h->monitor_ctlr_work,
|
queue_delayed_work(h->monitor_ctlr_wq, &h->monitor_ctlr_work,
|
||||||
h->heartbeat_sample_interval);
|
h->heartbeat_sample_interval);
|
||||||
spin_unlock_irqrestore(&h->lock, flags);
|
spin_unlock_irqrestore(&h->lock, flags);
|
||||||
}
|
}
|
||||||
@@ -8695,6 +8700,12 @@ static int hpsa_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
goto clean7; /* aer/h */
|
goto clean7; /* aer/h */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
h->monitor_ctlr_wq = hpsa_create_controller_wq(h, "monitor");
|
||||||
|
if (!h->monitor_ctlr_wq) {
|
||||||
|
rc = -ENOMEM;
|
||||||
|
goto clean7;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* At this point, the controller is ready to take commands.
|
* At this point, the controller is ready to take commands.
|
||||||
* Now, if reset_devices and the hard reset didn't work, try
|
* Now, if reset_devices and the hard reset didn't work, try
|
||||||
@@ -8826,6 +8837,10 @@ static int hpsa_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
destroy_workqueue(h->rescan_ctlr_wq);
|
destroy_workqueue(h->rescan_ctlr_wq);
|
||||||
h->rescan_ctlr_wq = NULL;
|
h->rescan_ctlr_wq = NULL;
|
||||||
}
|
}
|
||||||
|
if (h->monitor_ctlr_wq) {
|
||||||
|
destroy_workqueue(h->monitor_ctlr_wq);
|
||||||
|
h->monitor_ctlr_wq = NULL;
|
||||||
|
}
|
||||||
kfree(h);
|
kfree(h);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -8973,6 +8988,7 @@ static void hpsa_remove_one(struct pci_dev *pdev)
|
|||||||
cancel_delayed_work_sync(&h->event_monitor_work);
|
cancel_delayed_work_sync(&h->event_monitor_work);
|
||||||
destroy_workqueue(h->rescan_ctlr_wq);
|
destroy_workqueue(h->rescan_ctlr_wq);
|
||||||
destroy_workqueue(h->resubmit_wq);
|
destroy_workqueue(h->resubmit_wq);
|
||||||
|
destroy_workqueue(h->monitor_ctlr_wq);
|
||||||
|
|
||||||
hpsa_delete_sas_host(h);
|
hpsa_delete_sas_host(h);
|
||||||
|
|
||||||
|
|||||||
@@ -300,6 +300,7 @@ struct ctlr_info {
|
|||||||
int needs_abort_tags_swizzled;
|
int needs_abort_tags_swizzled;
|
||||||
struct workqueue_struct *resubmit_wq;
|
struct workqueue_struct *resubmit_wq;
|
||||||
struct workqueue_struct *rescan_ctlr_wq;
|
struct workqueue_struct *rescan_ctlr_wq;
|
||||||
|
struct workqueue_struct *monitor_ctlr_wq;
|
||||||
atomic_t abort_cmds_available;
|
atomic_t abort_cmds_available;
|
||||||
wait_queue_head_t event_sync_wait_queue;
|
wait_queue_head_t event_sync_wait_queue;
|
||||||
struct mutex reset_mutex;
|
struct mutex reset_mutex;
|
||||||
|
|||||||
Reference in New Issue
Block a user