cxgb3: Convert mmidr to XArray
authorMatthew Wilcox <willy@infradead.org>
Thu, 21 Feb 2019 00:20:49 +0000 (16:20 -0800)
committerJason Gunthorpe <jgg@mellanox.com>
Mon, 25 Mar 2019 18:36:29 +0000 (15:36 -0300)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
Acked-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/cxgb3/iwch.c
drivers/infiniband/hw/cxgb3/iwch.h
drivers/infiniband/hw/cxgb3/iwch_mem.c
drivers/infiniband/hw/cxgb3/iwch_provider.c

index 578bc9ed90b7ad74f9df786ea829bf3f0df417cb..56a8ab6210cfeb25660799b171be5559d8ada376 100644 (file)
@@ -100,8 +100,7 @@ static void rnic_init(struct iwch_dev *rnicp)
        pr_debug("%s iwch_dev %p\n", __func__,  rnicp);
        xa_init_flags(&rnicp->cqs, XA_FLAGS_LOCK_IRQ);
        xa_init_flags(&rnicp->qps, XA_FLAGS_LOCK_IRQ);
-       idr_init(&rnicp->mmidr);
-       spin_lock_init(&rnicp->lock);
+       xa_init_flags(&rnicp->mrs, XA_FLAGS_LOCK_IRQ);
        INIT_DELAYED_WORK(&rnicp->db_drop_task, iwch_db_drop_task);
 
        rnicp->attr.max_qps = T3_MAX_NUM_QP - 32;
@@ -185,7 +184,7 @@ static void close_rnic_dev(struct t3cdev *tdev)
                        cxio_rdev_close(&dev->rdev);
                        WARN_ON(!xa_empty(&dev->cqs));
                        WARN_ON(!xa_empty(&dev->qps));
-                       idr_destroy(&dev->mmidr);
+                       WARN_ON(!xa_empty(&dev->mrs));
                        ib_dealloc_device(&dev->ibdev);
                        break;
                }
index 70e086946d300f67dac342d1c4f56871f5b039f7..310a937bffcf0126e92937e584a33d60a08d988b 100644 (file)
@@ -35,7 +35,7 @@
 #include <linux/mutex.h>
 #include <linux/list.h>
 #include <linux/spinlock.h>
-#include <linux/idr.h>
+#include <linux/xarray.h>
 #include <linux/workqueue.h>
 
 #include <rdma/ib_verbs.h>
@@ -108,8 +108,7 @@ struct iwch_dev {
        struct iwch_rnic_attributes attr;
        struct xarray cqs;
        struct xarray qps;
-       struct idr mmidr;
-       spinlock_t lock;
+       struct xarray mrs;
        struct list_head entry;
        struct delayed_work db_drop_task;
 };
@@ -146,30 +145,7 @@ static inline struct iwch_qp *get_qhp(struct iwch_dev *rhp, u32 qpid)
 
 static inline struct iwch_mr *get_mhp(struct iwch_dev *rhp, u32 mmid)
 {
-       return idr_find(&rhp->mmidr, mmid);
-}
-
-static inline int insert_handle(struct iwch_dev *rhp, struct idr *idr,
-                               void *handle, u32 id)
-{
-       int ret;
-
-       idr_preload(GFP_KERNEL);
-       spin_lock_irq(&rhp->lock);
-
-       ret = idr_alloc(idr, handle, id, id + 1, GFP_NOWAIT);
-
-       spin_unlock_irq(&rhp->lock);
-       idr_preload_end();
-
-       return ret < 0 ? ret : 0;
-}
-
-static inline void remove_handle(struct iwch_dev *rhp, struct idr *idr, u32 id)
-{
-       spin_lock_irq(&rhp->lock);
-       idr_remove(idr, id);
-       spin_unlock_irq(&rhp->lock);
+       return xa_load(&rhp->mrs, mmid);
 }
 
 extern struct cxgb3_client t3c_client;
index 12886b1b4b10e0a22f9ace10074976b8e65f9d63..ce0f2741821da6d2335797598fc78b1e6088dea6 100644 (file)
@@ -49,7 +49,7 @@ static int iwch_finish_mem_reg(struct iwch_mr *mhp, u32 stag)
        mmid = stag >> 8;
        mhp->ibmr.rkey = mhp->ibmr.lkey = stag;
        pr_debug("%s mmid 0x%x mhp %p\n", __func__, mmid, mhp);
-       return insert_handle(mhp->rhp, &mhp->rhp->mmidr, mhp, mmid);
+       return xa_insert_irq(&mhp->rhp->mrs, mmid, mhp, GFP_KERNEL);
 }
 
 int iwch_register_mem(struct iwch_dev *rhp, struct iwch_pd *php,
index 7dcac117d4aa40ea44ea77afb15e40754fbead1e..c9a1fb323b5ce8d1cd68ce539fb900d024de4fb2 100644 (file)
@@ -421,7 +421,7 @@ static int iwch_dereg_mr(struct ib_mr *ib_mr)
        cxio_dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size,
                       mhp->attr.pbl_addr);
        iwch_free_pbl(mhp);
-       remove_handle(rhp, &rhp->mmidr, mmid);
+       xa_erase_irq(&rhp->mrs, mmid);
        if (mhp->kva)
                kfree((void *) (unsigned long) mhp->kva);
        if (mhp->umem)
@@ -636,7 +636,7 @@ static struct ib_mw *iwch_alloc_mw(struct ib_pd *pd, enum ib_mw_type type,
        mhp->attr.stag = stag;
        mmid = (stag) >> 8;
        mhp->ibmw.rkey = stag;
-       if (insert_handle(rhp, &rhp->mmidr, mhp, mmid)) {
+       if (xa_insert_irq(&rhp->mrs, mmid, mhp, GFP_KERNEL)) {
                cxio_deallocate_window(&rhp->rdev, mhp->attr.stag);
                kfree(mhp);
                return ERR_PTR(-ENOMEM);
@@ -655,7 +655,7 @@ static int iwch_dealloc_mw(struct ib_mw *mw)
        rhp = mhp->rhp;
        mmid = (mw->rkey) >> 8;
        cxio_deallocate_window(&rhp->rdev, mhp->attr.stag);
-       remove_handle(rhp, &rhp->mmidr, mmid);
+       xa_erase_irq(&rhp->mrs, mmid);
        pr_debug("%s ib_mw %p mmid 0x%x ptr %p\n", __func__, mw, mmid, mhp);
        kfree(mhp);
        return 0;
@@ -701,7 +701,7 @@ static struct ib_mr *iwch_alloc_mr(struct ib_pd *pd,
        mhp->attr.state = 1;
        mmid = (stag) >> 8;
        mhp->ibmr.rkey = mhp->ibmr.lkey = stag;
-       ret = insert_handle(rhp, &rhp->mmidr, mhp, mmid);
+       ret = xa_insert_irq(&rhp->mrs, mmid, mhp, GFP_KERNEL);
        if (ret)
                goto err3;