staging/rdma/hfi1: Destroy workqueues if hfi1_register_ib_device() call returns error
authorHarish Chegondi <harish.chegondi@intel.com>
Tue, 1 Dec 2015 20:38:20 +0000 (15:38 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 21 Dec 2015 21:51:55 +0000 (13:51 -0800)
Currently, if hfi1_register_ib_device() call is unsuccessful, workqueues
are not being destroyed before bailing out. This patch fixes this issue.

Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Harish Chegondi <harish.chegondi@intel.com>
Signed-off-by: Jubin John <jubin.john@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/rdma/hfi1/init.c

index 52fa86f47186f6704cd7a8c94b4858d163974ef2..2d52f91c03dc363d87412ea96e80b39e91cf1810 100644 (file)
@@ -1336,6 +1336,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int ret = 0, j, pidx, initfail;
        struct hfi1_devdata *dd = NULL;
+       struct hfi1_pportdata *ppd;
 
        /* First, lock the non-writable module parameters */
        HFI1_CAP_LOCK();
@@ -1431,8 +1432,14 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (initfail || ret) {
                stop_timers(dd);
                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);
+                       ppd = dd->pport + pidx;
+                       if (ppd->hfi1_wq) {
+                               destroy_workqueue(ppd->hfi1_wq);
+                               ppd->hfi1_wq = NULL;
+                       }
+               }
                if (!j)
                        hfi1_device_remove(dd);
                if (!ret)