On Thu, Aug 09, 2018 at 05:29:36PM +0300, Yuval Bason wrote: > 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: Yuval Bason <yuval.bason@xxxxxxxxxx> > Signed-off-by: Michal Kalderon <michal.kalderon@xxxxxxxxxx> > --- > drivers/infiniband/hw/qedr/main.c | 4 ++-- > drivers/infiniband/hw/qedr/qedr.h | 8 ++++++-- > drivers/infiniband/hw/qedr/qedr_iw_cm.c | 12 +++++------ > drivers/infiniband/hw/qedr/verbs.c | 35 +++++++++++++++------------------ > 4 files changed, 30 insertions(+), 29 deletions(-) > > diff --git a/drivers/infiniband/hw/qedr/main.c b/drivers/infiniband/hw/qedr/main.c > index ad22b32..912a0ca 100644 > --- a/drivers/infiniband/hw/qedr/main.c > +++ b/drivers/infiniband/hw/qedr/main.c > @@ -325,8 +325,8 @@ static int qedr_alloc_resources(struct qedr_dev *dev) > spin_lock_init(&dev->sgid_lock); > > if (IS_IWARP(dev)) { > - spin_lock_init(&dev->idr_lock); > - idr_init(&dev->qpidr); > + spin_lock_init(&dev->qpidr.idr_lock); > + idr_init(&dev->qpidr.idr); > dev->iwarp_wq = create_singlethread_workqueue("qedr_iwarpq"); > } > > diff --git a/drivers/infiniband/hw/qedr/qedr.h b/drivers/infiniband/hw/qedr/qedr.h > index 86d4511..5d0b75e 100644 > --- a/drivers/infiniband/hw/qedr/qedr.h > +++ b/drivers/infiniband/hw/qedr/qedr.h > @@ -122,6 +122,11 @@ struct qedr_device_attr { > > #define QEDR_ENET_STATE_BIT (0) > > +struct qedr_idr { > + spinlock_t idr_lock; /* Protect idr data-structure */ > + struct idr idr; > +}; > + > struct qedr_dev { > struct ib_device ibdev; > struct qed_dev *cdev; > @@ -165,8 +170,7 @@ struct qedr_dev { > struct qedr_cq *gsi_rqcq; > struct qedr_qp *gsi_qp; > enum qed_rdma_type rdma_type; > - spinlock_t idr_lock; /* Protect qpidr data-structure */ > - struct idr qpidr; > + struct qedr_idr qpidr; > struct workqueue_struct *iwarp_wq; > u16 iwarp_max_mtu; > > diff --git a/drivers/infiniband/hw/qedr/qedr_iw_cm.c b/drivers/infiniband/hw/qedr/qedr_iw_cm.c > index 26dc374..505fa36 100644 > --- a/drivers/infiniband/hw/qedr/qedr_iw_cm.c > +++ b/drivers/infiniband/hw/qedr/qedr_iw_cm.c > @@ -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, conn_param->qpn); > + qp = idr_find(&dev->qpidr.idr, conn_param->qpn); > > laddr = (struct sockaddr_in *)&cm_id->m_local_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) > > 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); You choose spinlock over RCU, such decision requires from you to use spinlock over all IDR operations, including idr_find(). Thanks
Attachment:
signature.asc
Description: PGP signature