Message ID | 20190221002107.22625-16-willy@infradead.org (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Jason Gunthorpe |
Headers | show |
Series | Convert the Infiniband subsystem to XArray | expand |
> -----Original Message----- > From: linux-rdma-owner@vger.kernel.org <linux-rdma- > owner@vger.kernel.org> On Behalf Of Matthew Wilcox > Sent: Wednesday, February 20, 2019 6:21 PM > To: Jason Gunthorpe <jgg@ziepe.ca> > Cc: Matthew Wilcox <willy@infradead.org>; linux-rdma@vger.kernel.org > Subject: [PATCH 15/32] cxgb4: Convert cqidr to XArray > > Signed-off-by: Matthew Wilcox <willy@infradead.org> Acked-by: Steve Wise <swise@opengridcomputing.com>
On Wed, Feb 20, 2019 at 04:20:50PM -0800, Matthew Wilcox wrote: > Signed-off-by: Matthew Wilcox <willy@infradead.org> > drivers/infiniband/hw/cxgb4/cq.c | 6 +++--- > drivers/infiniband/hw/cxgb4/device.c | 4 +--- > drivers/infiniband/hw/cxgb4/ev.c | 8 ++++---- > drivers/infiniband/hw/cxgb4/iw_cxgb4.h | 4 ++-- > 4 files changed, 10 insertions(+), 12 deletions(-) > > diff --git a/drivers/infiniband/hw/cxgb4/cq.c b/drivers/infiniband/hw/cxgb4/cq.c > index 1fd8798d91a7..1fa5f6445be3 100644 > +++ b/drivers/infiniband/hw/cxgb4/cq.c > @@ -976,7 +976,7 @@ int c4iw_destroy_cq(struct ib_cq *ib_cq) > pr_debug("ib_cq %p\n", ib_cq); > chp = to_c4iw_cq(ib_cq); > > - remove_handle(chp->rhp, &chp->rhp->cqidr, chp->cq.cqid); > + xa_erase_irq(&chp->rhp->cqs, chp->cq.cqid); > atomic_dec(&chp->refcnt); > wait_event(chp->wait, !atomic_read(&chp->refcnt)); > > @@ -1088,7 +1088,7 @@ struct ib_cq *c4iw_create_cq(struct ib_device *ibdev, > spin_lock_init(&chp->comp_handler_lock); > atomic_set(&chp->refcnt, 1); > init_waitqueue_head(&chp->wait); > - ret = insert_handle(rhp, &rhp->cqidr, chp, chp->cq.cqid); > + ret = xa_insert_irq(&rhp->cqs, chp->cq.cqid, chp, GFP_KERNEL); > if (ret) > goto err_destroy_cq; > > @@ -1143,7 +1143,7 @@ struct ib_cq *c4iw_create_cq(struct ib_device *ibdev, > err_free_mm: > kfree(mm); > err_remove_handle: > - remove_handle(rhp, &rhp->cqidr, chp->cq.cqid); > + xa_erase_irq(&rhp->cqs, chp->cq.cqid); > err_destroy_cq: > destroy_cq(&chp->rhp->rdev, &chp->cq, > ucontext ? &ucontext->uctx : &rhp->rdev.uctx, > diff --git a/drivers/infiniband/hw/cxgb4/device.c b/drivers/infiniband/hw/cxgb4/device.c > index c13c0ba30f63..d78039043c55 100644 > +++ b/drivers/infiniband/hw/cxgb4/device.c > @@ -924,8 +924,6 @@ static void c4iw_rdev_close(struct c4iw_rdev *rdev) > void c4iw_dealloc(struct uld_ctx *ctx) > { > c4iw_rdev_close(&ctx->dev->rdev); > - WARN_ON_ONCE(!idr_is_empty(&ctx->dev->cqidr)); > - idr_destroy(&ctx->dev->cqidr); I'd like to apply the patches Steve Ack'd but I want to keep the WARN_ONs. It just doesn't make sense in our syzkaller-testing world to remove deterministic and reliable assertions on the slow path. Are you OK with that Matt? Thanks, Jason
diff --git a/drivers/infiniband/hw/cxgb4/cq.c b/drivers/infiniband/hw/cxgb4/cq.c index 1fd8798d91a7..1fa5f6445be3 100644 --- a/drivers/infiniband/hw/cxgb4/cq.c +++ b/drivers/infiniband/hw/cxgb4/cq.c @@ -976,7 +976,7 @@ int c4iw_destroy_cq(struct ib_cq *ib_cq) pr_debug("ib_cq %p\n", ib_cq); chp = to_c4iw_cq(ib_cq); - remove_handle(chp->rhp, &chp->rhp->cqidr, chp->cq.cqid); + xa_erase_irq(&chp->rhp->cqs, chp->cq.cqid); atomic_dec(&chp->refcnt); wait_event(chp->wait, !atomic_read(&chp->refcnt)); @@ -1088,7 +1088,7 @@ struct ib_cq *c4iw_create_cq(struct ib_device *ibdev, spin_lock_init(&chp->comp_handler_lock); atomic_set(&chp->refcnt, 1); init_waitqueue_head(&chp->wait); - ret = insert_handle(rhp, &rhp->cqidr, chp, chp->cq.cqid); + ret = xa_insert_irq(&rhp->cqs, chp->cq.cqid, chp, GFP_KERNEL); if (ret) goto err_destroy_cq; @@ -1143,7 +1143,7 @@ struct ib_cq *c4iw_create_cq(struct ib_device *ibdev, err_free_mm: kfree(mm); err_remove_handle: - remove_handle(rhp, &rhp->cqidr, chp->cq.cqid); + xa_erase_irq(&rhp->cqs, chp->cq.cqid); err_destroy_cq: destroy_cq(&chp->rhp->rdev, &chp->cq, ucontext ? &ucontext->uctx : &rhp->rdev.uctx, diff --git a/drivers/infiniband/hw/cxgb4/device.c b/drivers/infiniband/hw/cxgb4/device.c index c13c0ba30f63..d78039043c55 100644 --- a/drivers/infiniband/hw/cxgb4/device.c +++ b/drivers/infiniband/hw/cxgb4/device.c @@ -924,8 +924,6 @@ static void c4iw_rdev_close(struct c4iw_rdev *rdev) void c4iw_dealloc(struct uld_ctx *ctx) { c4iw_rdev_close(&ctx->dev->rdev); - WARN_ON_ONCE(!idr_is_empty(&ctx->dev->cqidr)); - idr_destroy(&ctx->dev->cqidr); WARN_ON_ONCE(!idr_is_empty(&ctx->dev->qpidr)); idr_destroy(&ctx->dev->qpidr); WARN_ON_ONCE(!idr_is_empty(&ctx->dev->mmidr)); @@ -1037,7 +1035,7 @@ static struct c4iw_dev *c4iw_alloc(const struct cxgb4_lld_info *infop) return ERR_PTR(ret); } - idr_init(&devp->cqidr); + xa_init_flags(&devp->cqs, XA_FLAGS_LOCK_IRQ); idr_init(&devp->qpidr); idr_init(&devp->mmidr); idr_init(&devp->hwtid_idr); diff --git a/drivers/infiniband/hw/cxgb4/ev.c b/drivers/infiniband/hw/cxgb4/ev.c index 8741d23168f3..670c2c802e45 100644 --- a/drivers/infiniband/hw/cxgb4/ev.c +++ b/drivers/infiniband/hw/cxgb4/ev.c @@ -225,11 +225,11 @@ int c4iw_ev_handler(struct c4iw_dev *dev, u32 qid) struct c4iw_cq *chp; unsigned long flag; - spin_lock_irqsave(&dev->lock, flag); - chp = get_chp(dev, qid); + xa_lock_irqsave(&dev->cqs, flag); + chp = xa_load(&dev->cqs, qid); if (chp) { atomic_inc(&chp->refcnt); - spin_unlock_irqrestore(&dev->lock, flag); + xa_unlock_irqrestore(&dev->cqs, flag); t4_clear_cq_armed(&chp->cq); spin_lock_irqsave(&chp->comp_handler_lock, flag); (*chp->ibcq.comp_handler)(&chp->ibcq, chp->ibcq.cq_context); @@ -238,7 +238,7 @@ int c4iw_ev_handler(struct c4iw_dev *dev, u32 qid) wake_up(&chp->wait); } else { pr_debug("unknown cqid 0x%x\n", qid); - spin_unlock_irqrestore(&dev->lock, flag); + xa_unlock_irqrestore(&dev->cqs, flag); } return 0; } diff --git a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h index f0fceadd0d12..6729fd7b1b42 100644 --- a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h +++ b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h @@ -315,7 +315,7 @@ struct c4iw_dev { struct ib_device ibdev; struct c4iw_rdev rdev; u32 device_cap_flags; - struct idr cqidr; + struct xarray cqs; struct idr qpidr; struct idr mmidr; spinlock_t lock; @@ -349,7 +349,7 @@ static inline struct c4iw_dev *rdev_to_c4iw_dev(struct c4iw_rdev *rdev) static inline struct c4iw_cq *get_chp(struct c4iw_dev *rhp, u32 cqid) { - return idr_find(&rhp->cqidr, cqid); + return xa_load(&rhp->cqs, cqid); } static inline struct c4iw_qp *get_qhp(struct c4iw_dev *rhp, u32 qpid)
Signed-off-by: Matthew Wilcox <willy@infradead.org> --- drivers/infiniband/hw/cxgb4/cq.c | 6 +++--- drivers/infiniband/hw/cxgb4/device.c | 4 +--- drivers/infiniband/hw/cxgb4/ev.c | 8 ++++---- drivers/infiniband/hw/cxgb4/iw_cxgb4.h | 4 ++-- 4 files changed, 10 insertions(+), 12 deletions(-)