staging/rdma/hfi1: Select only devices with active links
authorDean Luick <dean.luick@intel.com>
Sat, 7 Nov 2015 01:07:01 +0000 (20:07 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 16 Nov 2015 04:02:47 +0000 (20:02 -0800)
When looking for or validating a user device, only use devices
that are currently active.

Reviewed-by: Mitko Haralanov <mitko.haralanov@intel.com>
Signed-off-by: Dean Luick <dean.luick@intel.com>
Signed-off-by: Jubin John <jubin.john@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/rdma/hfi1/file_ops.c

index 97ca9ec8fd3fbf3e4d795e30648b8702a452cfe1..22037ce984c83e3ffddf36e7c223af4536215fb8 100644 (file)
@@ -850,6 +850,14 @@ done:
        return ret;
 }
 
+/* return true if the device available for general use */
+static int usable_device(struct hfi1_devdata *dd)
+{
+       struct hfi1_pportdata *ppd = dd->pport;
+
+       return driver_lstate(ppd) == IB_PORT_ACTIVE;
+}
+
 static int get_user_context(struct file *fp, struct hfi1_user_info *uinfo,
                            int devno, unsigned alg)
 {
@@ -879,7 +887,11 @@ static int get_user_context(struct file *fp, struct hfi1_user_info *uinfo,
 
                        for (dev = 0; dev < devmax; dev++) {
                                pdd = hfi1_lookup(dev);
-                               if (pdd && pdd->freectxts &&
+                               if (!pdd)
+                                       continue;
+                               if (!usable_device(pdd))
+                                       continue;
+                               if (pdd->freectxts &&
                                    pdd->freectxts > free) {
                                        dd = pdd;
                                        free = pdd->freectxts;
@@ -888,7 +900,11 @@ static int get_user_context(struct file *fp, struct hfi1_user_info *uinfo,
                } else {
                        for (dev = 0; dev < devmax; dev++) {
                                pdd = hfi1_lookup(dev);
-                               if (pdd && pdd->freectxts) {
+                               if (!pdd)
+                                       continue;
+                               if (!usable_device(pdd))
+                                       continue;
+                               if (pdd->freectxts) {
                                        dd = pdd;
                                        break;
                                }
@@ -913,7 +929,6 @@ static int find_shared_ctxt(struct file *fp,
        for (ndev = 0; ndev < devmax; ndev++) {
                struct hfi1_devdata *dd = hfi1_lookup(ndev);
 
-               /* device portion of usable() */
                if (!(dd && (dd->flags & HFI1_PRESENT) && dd->kregbase))
                        continue;
                for (i = dd->first_user_ctxt; i < dd->num_rcv_contexts; i++) {