diff mbox series

[15/32] cxgb4: Convert cqidr to XArray

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

Commit Message

Matthew Wilcox Feb. 21, 2019, 12:20 a.m. UTC
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(-)

Comments

Steve Wise Feb. 21, 2019, 7:53 p.m. UTC | #1
> -----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>
Jason Gunthorpe Feb. 22, 2019, 5 p.m. UTC | #2
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 mbox series

Patch

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)