From: Steve Wise <[EMAIL PROTECTED]>

Use a liked list.

Signed-off-by: Steve Wise <[EMAIL PROTECTED]>
---

 drivers/infiniband/hw/cxgb3/core/cxio_hal.c |   57 +++++++++------------------
 drivers/infiniband/hw/cxgb3/core/cxio_hal.h |    2 -
 2 files changed, 19 insertions(+), 40 deletions(-)

diff --git a/drivers/infiniband/hw/cxgb3/core/cxio_hal.c 
b/drivers/infiniband/hw/cxgb3/core/cxio_hal.c
index 2c4e351..acffe16 100644
--- a/drivers/infiniband/hw/cxgb3/core/cxio_hal.c
+++ b/drivers/infiniband/hw/cxgb3/core/cxio_hal.c
@@ -43,49 +43,28 @@ #include "cxio_hal.h"
 #include "cxgb3_offload.h"
 #include "sge_defs.h"
 
-static struct cxio_rdev *rdev_tbl[T3_MAX_NUM_RNIC];
+static LIST_HEAD(rdev_list);
 static cxio_hal_ev_callback_func_t cxio_ev_cb = NULL;
 
 static inline struct cxio_rdev *cxio_hal_find_rdev_by_name(char *dev_name)
 {
-       int i;
-       for (i = 0; i < T3_MAX_NUM_RNIC; i++)
-               if (rdev_tbl[i])
-                       if (!strcmp(rdev_tbl[i]->dev_name, dev_name))
-                               return rdev_tbl[i];
+       struct cxio_rdev *rdev;
+
+       list_for_each_entry(rdev, &rdev_list, entry)
+               if (!strcmp(rdev->dev_name, dev_name))
+                       return rdev;
        return NULL;
 }
 
 static inline struct cxio_rdev *cxio_hal_find_rdev_by_t3cdev(struct t3cdev
                                                             *tdev)
 {
-       int i;
-       for (i = 0; i < T3_MAX_NUM_RNIC; i++)
-               if (rdev_tbl[i])
-                       if (rdev_tbl[i]->t3cdev_p == tdev)
-                               return rdev_tbl[i];
-       return NULL;
-}
-
-static inline int cxio_hal_add_rdev(struct cxio_rdev *rdev_p)
-{
-       int i;
-       for (i = 0; i < T3_MAX_NUM_RNIC; i++)
-               if (!rdev_tbl[i]) {
-                       rdev_tbl[i] = rdev_p;
-                       break;
-               }
-       return (i == T3_MAX_NUM_RNIC);
-}
+       struct cxio_rdev *rdev;
 
-static inline void cxio_hal_delete_rdev(struct cxio_rdev *rdev_p)
-{
-       int i;
-       for (i = 0; i < T3_MAX_NUM_RNIC; i++)
-               if (rdev_tbl[i] == rdev_p) {
-                       rdev_tbl[i] = NULL;
-                       break;
-               }
+       list_for_each_entry(rdev, &rdev_list, entry)
+               if (rdev->t3cdev_p == tdev)
+                       return rdev;
+       return NULL;
 }
 
 int cxio_hal_cq_op(struct cxio_rdev *rdev_p, struct t3_cq *cq,
@@ -937,8 +916,7 @@ int cxio_rdev_open(struct cxio_rdev *rde
                return -EINVAL;
        }
 
-       if (cxio_hal_add_rdev(rdev_p))
-               return -ENOMEM;
+       list_add_tail(&rdev_p->entry, &rdev_list);
 
        PDBG("%s opening rnic dev %s\n", __FUNCTION__, rdev_p->dev_name);
        memset(&rdev_p->ctrl_qp, 0, sizeof(rdev_p->ctrl_qp));
@@ -1018,7 +996,7 @@ err3:
 err2:
        cxio_hal_destroy_ctrl_qp(rdev_p);
 err1:
-       cxio_hal_delete_rdev(rdev_p);
+       list_del(&rdev_p->entry);
        return err;
 }
 
@@ -1027,7 +1005,7 @@ void cxio_rdev_close(struct cxio_rdev *r
        if (rdev_p) {
                cxio_hal_pblpool_destroy(rdev_p);
                cxio_hal_rqtpool_destroy(rdev_p);
-               cxio_hal_delete_rdev(rdev_p);
+               list_del(&rdev_p->entry);
                rdev_p->t3cdev_p->ulp = NULL;
                cxio_hal_destroy_ctrl_qp(rdev_p);
                cxio_hal_destroy_resource(rdev_p->rscp);
@@ -1038,7 +1016,6 @@ int __init cxio_hal_init(void)
 {
        if (cxio_hal_init_rhdl_resource(T3_MAX_NUM_RI))
                return -ENOMEM;
-       memset(rdev_tbl, 0, T3_MAX_NUM_RNIC * sizeof(void *));
        t3_register_cpl_handler(CPL_ASYNC_NOTIF, cxio_hal_ev_handler);
        return 0;
 }
@@ -1046,9 +1023,11 @@ int __init cxio_hal_init(void)
 void __exit cxio_hal_exit(void)
 {
        int i;
+       struct cxio_rdev *rdev, *tmp;
+
        t3_register_cpl_handler(CPL_ASYNC_NOTIF, NULL);
-       for (i = 0; i < T3_MAX_NUM_RNIC; i++)
-               cxio_rdev_close(rdev_tbl[i]);
+       list_for_each_entry_safe(rdev, tmp, &rdev_list, entry)
+               cxio_rdev_close(rdev);
        cxio_hal_destroy_rhdl_resource();
 }
 
diff --git a/drivers/infiniband/hw/cxgb3/core/cxio_hal.h 
b/drivers/infiniband/hw/cxgb3/core/cxio_hal.h
index d5ae282..8fb2999 100644
--- a/drivers/infiniband/hw/cxgb3/core/cxio_hal.h
+++ b/drivers/infiniband/hw/cxgb3/core/cxio_hal.h
@@ -47,7 +47,6 @@ #define T3_CTRL_QP_SIZE_LOG2  8
 #define T3_CTRL_CQ_ID    0
 
 /* TBD */
-#define T3_MAX_NUM_RNIC  8
 #define T3_MAX_NUM_RI (1<<15)
 #define T3_MAX_NUM_QP (1<<15)
 #define T3_MAX_NUM_CQ (1<<15)
@@ -106,6 +105,7 @@ struct cxio_rdev {
        struct cxio_ucontext uctx;
        struct gen_pool *pbl_pool;
        struct gen_pool *rqt_pool;
+       struct list_head entry;
 };
 
 static inline int cxio_num_stags(struct cxio_rdev *rdev_p)

_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to