Commit e64a7c02 authored by Matthew Wilcox's avatar Matthew Wilcox Committed by Jason Gunthorpe

cxgb3: Convert mmidr to XArray

Signed-off-by: default avatarMatthew Wilcox <willy@infradead.org>
Acked-by: default avatarSteve Wise <swise@opengridcomputing.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 27114876
...@@ -100,8 +100,7 @@ static void rnic_init(struct iwch_dev *rnicp) ...@@ -100,8 +100,7 @@ static void rnic_init(struct iwch_dev *rnicp)
pr_debug("%s iwch_dev %p\n", __func__, rnicp); pr_debug("%s iwch_dev %p\n", __func__, rnicp);
xa_init_flags(&rnicp->cqs, XA_FLAGS_LOCK_IRQ); xa_init_flags(&rnicp->cqs, XA_FLAGS_LOCK_IRQ);
xa_init_flags(&rnicp->qps, XA_FLAGS_LOCK_IRQ); xa_init_flags(&rnicp->qps, XA_FLAGS_LOCK_IRQ);
idr_init(&rnicp->mmidr); xa_init_flags(&rnicp->mrs, XA_FLAGS_LOCK_IRQ);
spin_lock_init(&rnicp->lock);
INIT_DELAYED_WORK(&rnicp->db_drop_task, iwch_db_drop_task); INIT_DELAYED_WORK(&rnicp->db_drop_task, iwch_db_drop_task);
rnicp->attr.max_qps = T3_MAX_NUM_QP - 32; rnicp->attr.max_qps = T3_MAX_NUM_QP - 32;
...@@ -185,7 +184,7 @@ static void close_rnic_dev(struct t3cdev *tdev) ...@@ -185,7 +184,7 @@ static void close_rnic_dev(struct t3cdev *tdev)
cxio_rdev_close(&dev->rdev); cxio_rdev_close(&dev->rdev);
WARN_ON(!xa_empty(&dev->cqs)); WARN_ON(!xa_empty(&dev->cqs));
WARN_ON(!xa_empty(&dev->qps)); WARN_ON(!xa_empty(&dev->qps));
idr_destroy(&dev->mmidr); WARN_ON(!xa_empty(&dev->mrs));
ib_dealloc_device(&dev->ibdev); ib_dealloc_device(&dev->ibdev);
break; break;
} }
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/idr.h> #include <linux/xarray.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <rdma/ib_verbs.h> #include <rdma/ib_verbs.h>
...@@ -108,8 +108,7 @@ struct iwch_dev { ...@@ -108,8 +108,7 @@ struct iwch_dev {
struct iwch_rnic_attributes attr; struct iwch_rnic_attributes attr;
struct xarray cqs; struct xarray cqs;
struct xarray qps; struct xarray qps;
struct idr mmidr; struct xarray mrs;
spinlock_t lock;
struct list_head entry; struct list_head entry;
struct delayed_work db_drop_task; struct delayed_work db_drop_task;
}; };
...@@ -146,30 +145,7 @@ static inline struct iwch_qp *get_qhp(struct iwch_dev *rhp, u32 qpid) ...@@ -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) static inline struct iwch_mr *get_mhp(struct iwch_dev *rhp, u32 mmid)
{ {
return idr_find(&rhp->mmidr, mmid); return xa_load(&rhp->mrs, 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);
} }
extern struct cxgb3_client t3c_client; extern struct cxgb3_client t3c_client;
......
...@@ -49,7 +49,7 @@ static int iwch_finish_mem_reg(struct iwch_mr *mhp, u32 stag) ...@@ -49,7 +49,7 @@ static int iwch_finish_mem_reg(struct iwch_mr *mhp, u32 stag)
mmid = stag >> 8; mmid = stag >> 8;
mhp->ibmr.rkey = mhp->ibmr.lkey = stag; mhp->ibmr.rkey = mhp->ibmr.lkey = stag;
pr_debug("%s mmid 0x%x mhp %p\n", __func__, mmid, mhp); 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, int iwch_register_mem(struct iwch_dev *rhp, struct iwch_pd *php,
......
...@@ -421,7 +421,7 @@ static int iwch_dereg_mr(struct ib_mr *ib_mr) ...@@ -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, cxio_dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size,
mhp->attr.pbl_addr); mhp->attr.pbl_addr);
iwch_free_pbl(mhp); iwch_free_pbl(mhp);
remove_handle(rhp, &rhp->mmidr, mmid); xa_erase_irq(&rhp->mrs, mmid);
if (mhp->kva) if (mhp->kva)
kfree((void *) (unsigned long) mhp->kva); kfree((void *) (unsigned long) mhp->kva);
if (mhp->umem) if (mhp->umem)
...@@ -636,7 +636,7 @@ static struct ib_mw *iwch_alloc_mw(struct ib_pd *pd, enum ib_mw_type type, ...@@ -636,7 +636,7 @@ static struct ib_mw *iwch_alloc_mw(struct ib_pd *pd, enum ib_mw_type type,
mhp->attr.stag = stag; mhp->attr.stag = stag;
mmid = (stag) >> 8; mmid = (stag) >> 8;
mhp->ibmw.rkey = stag; 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); cxio_deallocate_window(&rhp->rdev, mhp->attr.stag);
kfree(mhp); kfree(mhp);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
...@@ -655,7 +655,7 @@ static int iwch_dealloc_mw(struct ib_mw *mw) ...@@ -655,7 +655,7 @@ static int iwch_dealloc_mw(struct ib_mw *mw)
rhp = mhp->rhp; rhp = mhp->rhp;
mmid = (mw->rkey) >> 8; mmid = (mw->rkey) >> 8;
cxio_deallocate_window(&rhp->rdev, mhp->attr.stag); 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); pr_debug("%s ib_mw %p mmid 0x%x ptr %p\n", __func__, mw, mmid, mhp);
kfree(mhp); kfree(mhp);
return 0; return 0;
...@@ -701,7 +701,7 @@ static struct ib_mr *iwch_alloc_mr(struct ib_pd *pd, ...@@ -701,7 +701,7 @@ static struct ib_mr *iwch_alloc_mr(struct ib_pd *pd,
mhp->attr.state = 1; mhp->attr.state = 1;
mmid = (stag) >> 8; mmid = (stag) >> 8;
mhp->ibmr.rkey = mhp->ibmr.lkey = stag; 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) if (ret)
goto err3; goto err3;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment