Commit e8597eb0 authored by Harish Chegondi's avatar Harish Chegondi Committed by Greg Kroah-Hartman

staging/rdma/hfi1: Destroy workqueues if hfi1_register_ib_device() call returns error

Currently, if hfi1_register_ib_device() call is unsuccessful, workqueues
are not being destroyed before bailing out. This patch fixes this issue.
Reviewed-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: default avatarHarish Chegondi <harish.chegondi@intel.com>
Signed-off-by: default avatarJubin John <jubin.john@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2c5b521a
...@@ -1336,6 +1336,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1336,6 +1336,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
{ {
int ret = 0, j, pidx, initfail; int ret = 0, j, pidx, initfail;
struct hfi1_devdata *dd = NULL; struct hfi1_devdata *dd = NULL;
struct hfi1_pportdata *ppd;
/* First, lock the non-writable module parameters */ /* First, lock the non-writable module parameters */
HFI1_CAP_LOCK(); HFI1_CAP_LOCK();
...@@ -1431,8 +1432,14 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1431,8 +1432,14 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (initfail || ret) { if (initfail || ret) {
stop_timers(dd); stop_timers(dd);
flush_workqueue(ib_wq); flush_workqueue(ib_wq);
for (pidx = 0; pidx < dd->num_pports; ++pidx) for (pidx = 0; pidx < dd->num_pports; ++pidx) {
hfi1_quiet_serdes(dd->pport + pidx); hfi1_quiet_serdes(dd->pport + pidx);
ppd = dd->pport + pidx;
if (ppd->hfi1_wq) {
destroy_workqueue(ppd->hfi1_wq);
ppd->hfi1_wq = NULL;
}
}
if (!j) if (!j)
hfi1_device_remove(dd); hfi1_device_remove(dd);
if (!ret) if (!ret)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment