Commit 1212767e authored by Yuval Bason's avatar Yuval Bason Committed by Jason Gunthorpe

qedr: Add wrapping generic structure for qpidr and adjust idr routines.

Today, we are using idr mechanism for QP's only.
This patch prepares the qedr_idr stuctures and the idr routines for
both QP's and SRQ's.
Signed-off-by: default avatarYuval Bason <yuval.bason@cavium.com>
Signed-off-by: default avatarMichal Kalderon <michal.kalderon@cavium.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 0625b4ba
...@@ -325,8 +325,8 @@ static int qedr_alloc_resources(struct qedr_dev *dev) ...@@ -325,8 +325,8 @@ static int qedr_alloc_resources(struct qedr_dev *dev)
spin_lock_init(&dev->sgid_lock); spin_lock_init(&dev->sgid_lock);
if (IS_IWARP(dev)) { if (IS_IWARP(dev)) {
spin_lock_init(&dev->idr_lock); spin_lock_init(&dev->qpidr.idr_lock);
idr_init(&dev->qpidr); idr_init(&dev->qpidr.idr);
dev->iwarp_wq = create_singlethread_workqueue("qedr_iwarpq"); dev->iwarp_wq = create_singlethread_workqueue("qedr_iwarpq");
} }
......
...@@ -122,6 +122,11 @@ struct qedr_device_attr { ...@@ -122,6 +122,11 @@ struct qedr_device_attr {
#define QEDR_ENET_STATE_BIT (0) #define QEDR_ENET_STATE_BIT (0)
struct qedr_idr {
spinlock_t idr_lock; /* Protect idr data-structure */
struct idr idr;
};
struct qedr_dev { struct qedr_dev {
struct ib_device ibdev; struct ib_device ibdev;
struct qed_dev *cdev; struct qed_dev *cdev;
...@@ -165,8 +170,7 @@ struct qedr_dev { ...@@ -165,8 +170,7 @@ struct qedr_dev {
struct qedr_cq *gsi_rqcq; struct qedr_cq *gsi_rqcq;
struct qedr_qp *gsi_qp; struct qedr_qp *gsi_qp;
enum qed_rdma_type rdma_type; enum qed_rdma_type rdma_type;
spinlock_t idr_lock; /* Protect qpidr data-structure */ struct qedr_idr qpidr;
struct idr qpidr;
struct workqueue_struct *iwarp_wq; struct workqueue_struct *iwarp_wq;
u16 iwarp_max_mtu; u16 iwarp_max_mtu;
......
...@@ -491,7 +491,7 @@ int qedr_iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -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 rc = 0;
int i; int i;
qp = idr_find(&dev->qpidr, conn_param->qpn); qp = idr_find(&dev->qpidr.idr, conn_param->qpn);
laddr = (struct sockaddr_in *)&cm_id->m_local_addr; laddr = (struct sockaddr_in *)&cm_id->m_local_addr;
raddr = (struct sockaddr_in *)&cm_id->m_remote_addr; raddr = (struct sockaddr_in *)&cm_id->m_remote_addr;
...@@ -679,7 +679,7 @@ int qedr_iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -679,7 +679,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); DP_DEBUG(dev, QEDR_MSG_IWARP, "Accept on qpid=%d\n", conn_param->qpn);
qp = idr_find(&dev->qpidr, conn_param->qpn); qp = idr_find(&dev->qpidr.idr, conn_param->qpn);
if (!qp) { if (!qp) {
DP_ERR(dev, "Invalid QP number %d\n", conn_param->qpn); DP_ERR(dev, "Invalid QP number %d\n", conn_param->qpn);
return -EINVAL; return -EINVAL;
...@@ -737,9 +737,9 @@ void qedr_iw_qp_rem_ref(struct ib_qp *ibqp) ...@@ -737,9 +737,9 @@ void qedr_iw_qp_rem_ref(struct ib_qp *ibqp)
struct qedr_qp *qp = get_qedr_qp(ibqp); struct qedr_qp *qp = get_qedr_qp(ibqp);
if (atomic_dec_and_test(&qp->refcnt)) { if (atomic_dec_and_test(&qp->refcnt)) {
spin_lock_irq(&qp->dev->idr_lock); spin_lock_irq(&qp->dev->qpidr.idr_lock);
idr_remove(&qp->dev->qpidr, qp->qp_id); idr_remove(&qp->dev->qpidr.idr, qp->qp_id);
spin_unlock_irq(&qp->dev->idr_lock); spin_unlock_irq(&qp->dev->qpidr.idr_lock);
kfree(qp); kfree(qp);
} }
} }
...@@ -748,5 +748,5 @@ struct ib_qp *qedr_iw_get_qp(struct ib_device *ibdev, int qpn) ...@@ -748,5 +748,5 @@ struct ib_qp *qedr_iw_get_qp(struct ib_device *ibdev, int qpn)
{ {
struct qedr_dev *dev = get_qedr_dev(ibdev); struct qedr_dev *dev = get_qedr_dev(ibdev);
return idr_find(&dev->qpidr, qpn); return idr_find(&dev->qpidr.idr, qpn);
} }
...@@ -1311,32 +1311,27 @@ static inline void qedr_qp_user_print(struct qedr_dev *dev, struct qedr_qp *qp) ...@@ -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)) spin_lock_irq(&qidr->idr_lock);
return; idr_remove(&qidr->idr, id);
spin_unlock_irq(&qidr->idr_lock);
spin_lock_irq(&dev->idr_lock);
idr_remove(&dev->qpidr, id);
spin_unlock_irq(&dev->idr_lock);
} }
static inline void static inline void
...@@ -1708,9 +1703,11 @@ struct ib_qp *qedr_create_qp(struct ib_pd *ibpd, ...@@ -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 (rdma_protocol_iwarp(&dev->ibdev, 1)) {
if (rc) rc = qedr_idr_add(dev, &dev->qpidr, qp, qp->qp_id);
goto err; if (rc)
goto err;
}
return &qp->ibqp; return &qp->ibqp;
...@@ -2279,8 +2276,9 @@ int qedr_destroy_qp(struct ib_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)) { if (atomic_dec_and_test(&qp->refcnt) &&
qedr_idr_remove(dev, qp->qp_id); rdma_protocol_iwarp(&dev->ibdev, 1)) {
qedr_idr_remove(dev, &dev->qpidr, qp->qp_id);
kfree(qp); kfree(qp);
} }
return rc; return rc;
......
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