|
@@ -1311,32 +1311,27 @@ static inline void qedr_qp_user_print(struct qedr_dev *dev, struct qedr_qp *qp)
|
|
qp->usq.buf_len, qp->urq.buf_addr, qp->urq.buf_len);
|
|
qp->usq.buf_len, qp->urq.buf_addr, qp->urq.buf_len);
|
|
}
|
|
}
|
|
|
|
|
|
-static int qedr_idr_add(struct qedr_dev *dev, void *ptr, u32 id)
|
|
|
|
|
|
+static int qedr_idr_add(struct qedr_dev *dev, struct qedr_idr *qidr,
|
|
|
|
+ void *ptr, u32 id)
|
|
{
|
|
{
|
|
int rc;
|
|
int rc;
|
|
|
|
|
|
- if (!rdma_protocol_iwarp(&dev->ibdev, 1))
|
|
|
|
- return 0;
|
|
|
|
-
|
|
|
|
idr_preload(GFP_KERNEL);
|
|
idr_preload(GFP_KERNEL);
|
|
- spin_lock_irq(&dev->idr_lock);
|
|
|
|
|
|
+ spin_lock_irq(&qidr->idr_lock);
|
|
|
|
|
|
- rc = idr_alloc(&dev->qpidr, ptr, id, id + 1, GFP_ATOMIC);
|
|
|
|
|
|
+ rc = idr_alloc(&qidr->idr, ptr, id, id + 1, GFP_ATOMIC);
|
|
|
|
|
|
- spin_unlock_irq(&dev->idr_lock);
|
|
|
|
|
|
+ spin_unlock_irq(&qidr->idr_lock);
|
|
idr_preload_end();
|
|
idr_preload_end();
|
|
|
|
|
|
return rc < 0 ? rc : 0;
|
|
return rc < 0 ? rc : 0;
|
|
}
|
|
}
|
|
|
|
|
|
-static void qedr_idr_remove(struct qedr_dev *dev, u32 id)
|
|
|
|
|
|
+static void qedr_idr_remove(struct qedr_dev *dev, struct qedr_idr *qidr, u32 id)
|
|
{
|
|
{
|
|
- if (!rdma_protocol_iwarp(&dev->ibdev, 1))
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- spin_lock_irq(&dev->idr_lock);
|
|
|
|
- idr_remove(&dev->qpidr, id);
|
|
|
|
- spin_unlock_irq(&dev->idr_lock);
|
|
|
|
|
|
+ spin_lock_irq(&qidr->idr_lock);
|
|
|
|
+ idr_remove(&qidr->idr, id);
|
|
|
|
+ spin_unlock_irq(&qidr->idr_lock);
|
|
}
|
|
}
|
|
|
|
|
|
static inline void
|
|
static inline void
|
|
@@ -1708,9 +1703,11 @@ struct ib_qp *qedr_create_qp(struct ib_pd *ibpd,
|
|
|
|
|
|
qp->ibqp.qp_num = qp->qp_id;
|
|
qp->ibqp.qp_num = qp->qp_id;
|
|
|
|
|
|
- rc = qedr_idr_add(dev, qp, qp->qp_id);
|
|
|
|
- if (rc)
|
|
|
|
- goto err;
|
|
|
|
|
|
+ if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
|
|
|
|
+ rc = qedr_idr_add(dev, &dev->qpidr, qp, qp->qp_id);
|
|
|
|
+ if (rc)
|
|
|
|
+ goto err;
|
|
|
|
+ }
|
|
|
|
|
|
return &qp->ibqp;
|
|
return &qp->ibqp;
|
|
|
|
|
|
@@ -2279,8 +2276,9 @@ int qedr_destroy_qp(struct ib_qp *ibqp)
|
|
|
|
|
|
qedr_free_qp_resources(dev, qp);
|
|
qedr_free_qp_resources(dev, qp);
|
|
|
|
|
|
- if (atomic_dec_and_test(&qp->refcnt)) {
|
|
|
|
- qedr_idr_remove(dev, qp->qp_id);
|
|
|
|
|
|
+ if (atomic_dec_and_test(&qp->refcnt) &&
|
|
|
|
+ rdma_protocol_iwarp(&dev->ibdev, 1)) {
|
|
|
|
+ qedr_idr_remove(dev, &dev->qpidr, qp->qp_id);
|
|
kfree(qp);
|
|
kfree(qp);
|
|
}
|
|
}
|
|
return rc;
|
|
return rc;
|