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

cxgb3: Convert mmidr to XArray

parent 27114876
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -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;
		}
+3 −27
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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,
+4 −4
Original line number Diff line number Diff line
@@ -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;