IB/qib: Fix context allocation with multiple HCAs
authorMike Marciniszyn <mike.marciniszyn@qlogic.com>
Tue, 11 Jan 2011 01:42:20 +0000 (17:42 -0800)
committerRoland Dreier <rolandd@cisco.com>
Tue, 11 Jan 2011 01:42:20 +0000 (17:42 -0800)
The driver was incorrectly choosing HCAs on which to allocate new user
contexts based on overall count of usable ports regardless whether the
usable port was on the currently selected HCA.

Signed-off-by: Mike Marciniszyn <mike.marciniszyn@qlogic.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/hw/qib/qib_file_ops.c

index 79d9971aff1f6a0abb394c2090af702f2c4adbbc..75bfad16c11494a16bcbbaeace6583cfabefd4e6 100644 (file)
@@ -1379,17 +1379,17 @@ static int get_a_ctxt(struct file *fp, const struct qib_user_info *uinfo,
                /* find device (with ACTIVE ports) with fewest ctxts in use */
                for (ndev = 0; ndev < devmax; ndev++) {
                        struct qib_devdata *dd = qib_lookup(ndev);
-                       unsigned cused = 0, cfree = 0;
+                       unsigned cused = 0, cfree = 0, pusable = 0;
                        if (!dd)
                                continue;
                        if (port && port <= dd->num_pports &&
                            usable(dd->pport + port - 1))
-                               dusable = 1;
+                               pusable = 1;
                        else
                                for (i = 0; i < dd->num_pports; i++)
                                        if (usable(dd->pport + i))
-                                               dusable++;
-                       if (!dusable)
+                                               pusable++;
+                       if (!pusable)
                                continue;
                        for (ctxt = dd->first_user_ctxt; ctxt < dd->cfgctxts;
                             ctxt++)
@@ -1397,7 +1397,7 @@ static int get_a_ctxt(struct file *fp, const struct qib_user_info *uinfo,
                                        cused++;
                                else
                                        cfree++;
-                       if (cfree && cused < inuse) {
+                       if (pusable && cfree && cused < inuse) {
                                udd = dd;
                                inuse = cused;
                        }