qedr: Convert qpidr to XArray
authorMatthew Wilcox <willy@infradead.org>
Thu, 21 Feb 2019 00:20:58 +0000 (16:20 -0800)
committerJason Gunthorpe <jgg@mellanox.com>
Fri, 29 Mar 2019 17:53:57 +0000 (14:53 -0300)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/qedr/main.c
drivers/infiniband/hw/qedr/qedr.h
drivers/infiniband/hw/qedr/qedr_iw_cm.c
drivers/infiniband/hw/qedr/verbs.c

index 996d9ec..21bd625 100644 (file)
@@ -364,8 +364,7 @@ static int qedr_alloc_resources(struct qedr_dev *dev)
        spin_lock_init(&dev->sgid_lock);
 
        if (IS_IWARP(dev)) {
-               spin_lock_init(&dev->qpidr.idr_lock);
-               idr_init(&dev->qpidr.idr);
+               xa_init_flags(&dev->qps, XA_FLAGS_LOCK_IRQ);
                dev->iwarp_wq = create_singlethread_workqueue("qedr_iwarpq");
        }
 
index 53bbe6b..1d90603 100644 (file)
@@ -171,7 +171,7 @@ struct qedr_dev {
        struct qedr_cq          *gsi_rqcq;
        struct qedr_qp          *gsi_qp;
        enum qed_rdma_type      rdma_type;
-       struct qedr_idr         qpidr;
+       struct xarray           qps;
        struct qedr_idr         srqidr;
        struct workqueue_struct *iwarp_wq;
        u16                     iwarp_max_mtu;
index 0555e5a..22881d4 100644 (file)
@@ -491,7 +491,7 @@ int qedr_iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
        int rc = 0;
        int i;
 
-       qp = idr_find(&dev->qpidr.idr, conn_param->qpn);
+       qp = xa_load(&dev->qps, conn_param->qpn);
        if (unlikely(!qp))
                return -EINVAL;
 
@@ -681,7 +681,7 @@ int qedr_iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
 
        DP_DEBUG(dev, QEDR_MSG_IWARP, "Accept on qpid=%d\n", conn_param->qpn);
 
-       qp = idr_find(&dev->qpidr.idr, conn_param->qpn);
+       qp = xa_load(&dev->qps, conn_param->qpn);
        if (!qp) {
                DP_ERR(dev, "Invalid QP number %d\n", conn_param->qpn);
                return -EINVAL;
@@ -739,9 +739,7 @@ void qedr_iw_qp_rem_ref(struct ib_qp *ibqp)
        struct qedr_qp *qp = get_qedr_qp(ibqp);
 
        if (atomic_dec_and_test(&qp->refcnt)) {
-               spin_lock_irq(&qp->dev->qpidr.idr_lock);
-               idr_remove(&qp->dev->qpidr.idr, qp->qp_id);
-               spin_unlock_irq(&qp->dev->qpidr.idr_lock);
+               xa_erase_irq(&qp->dev->qps, qp->qp_id);
                kfree(qp);
        }
 }
@@ -750,5 +748,5 @@ struct ib_qp *qedr_iw_get_qp(struct ib_device *ibdev, int qpn)
 {
        struct qedr_dev *dev = get_qedr_dev(ibdev);
 
-       return idr_find(&dev->qpidr.idr, qpn);
+       return xa_load(&dev->qps, qpn);
 }
index 59ad420..aa66e86 100644 (file)
@@ -1988,7 +1988,7 @@ struct ib_qp *qedr_create_qp(struct ib_pd *ibpd,
        qp->ibqp.qp_num = qp->qp_id;
 
        if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
-               rc = qedr_idr_add(dev, &dev->qpidr, qp, qp->qp_id);
+               rc = xa_insert_irq(&dev->qps, qp->qp_id, qp, GFP_KERNEL);
                if (rc)
                        goto err;
        }
@@ -2564,7 +2564,7 @@ int qedr_destroy_qp(struct ib_qp *ibqp)
 
        if (atomic_dec_and_test(&qp->refcnt) &&
            rdma_protocol_iwarp(&dev->ibdev, 1)) {
-               qedr_idr_remove(dev, &dev->qpidr, qp->qp_id);
+               xa_erase_irq(&dev->qps, qp->qp_id);
                kfree(qp);
        }
        return rc;