]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
cxgb3: Convert cqidr to XArray
authorMatthew Wilcox <willy@infradead.org>
Thu, 21 Feb 2019 00:20:47 +0000 (16:20 -0800)
committerJason Gunthorpe <jgg@mellanox.com>
Mon, 25 Mar 2019 18:34:22 +0000 (15:34 -0300)
It would make sense to convert this to an allocating XArray and remove the
kfifo that is currently used to allocate the CQID, but that work is better
done by someone who has the hardware to test with.

Signed-off-by: Matthew Wilcox <willy@infradead.org>
Acked-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/cxgb3/iwch.c
drivers/infiniband/hw/cxgb3/iwch.h
drivers/infiniband/hw/cxgb3/iwch_provider.c

index fb03bc492ef7733236a37d24f40d0323e382033d..15c1495755acf75db79989ef7595cc6c820a9c34 100644 (file)
@@ -105,7 +105,7 @@ static void iwch_db_drop_task(struct work_struct *work)
 static void rnic_init(struct iwch_dev *rnicp)
 {
        pr_debug("%s iwch_dev %p\n", __func__,  rnicp);
-       idr_init(&rnicp->cqidr);
+       xa_init_flags(&rnicp->cqs, XA_FLAGS_LOCK_IRQ);
        idr_init(&rnicp->qpidr);
        idr_init(&rnicp->mmidr);
        spin_lock_init(&rnicp->lock);
@@ -190,7 +190,7 @@ static void close_rnic_dev(struct t3cdev *tdev)
                        list_del(&dev->entry);
                        iwch_unregister_device(dev);
                        cxio_rdev_close(&dev->rdev);
-                       idr_destroy(&dev->cqidr);
+                       WARN_ON(!xa_empty(&dev->cqs));
                        idr_destroy(&dev->qpidr);
                        idr_destroy(&dev->mmidr);
                        ib_dealloc_device(&dev->ibdev);
index c69bc4f520491ad11cd68eaadcf3d0cca023fd26..d45de53392e73ff20228dd16afc1a756b315b3e4 100644 (file)
@@ -106,7 +106,7 @@ struct iwch_dev {
        struct cxio_rdev rdev;
        u32 device_cap_flags;
        struct iwch_rnic_attributes attr;
-       struct idr cqidr;
+       struct xarray cqs;
        struct idr qpidr;
        struct idr mmidr;
        spinlock_t lock;
@@ -136,7 +136,7 @@ static inline int t3a_device(const struct iwch_dev *rhp)
 
 static inline struct iwch_cq *get_chp(struct iwch_dev *rhp, u32 cqid)
 {
-       return idr_find(&rhp->cqidr, cqid);
+       return xa_load(&rhp->cqs, cqid);
 }
 
 static inline struct iwch_qp *get_qhp(struct iwch_dev *rhp, u32 qpid)
index 4accf7b3dcf2424af0189580b1281f25ee0fae70..08e5ccf96394bca1d0f95eeee1641d8d19ad645d 100644 (file)
@@ -95,7 +95,7 @@ static int iwch_destroy_cq(struct ib_cq *ib_cq)
        pr_debug("%s ib_cq %p\n", __func__, ib_cq);
        chp = to_iwch_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));
 
@@ -164,7 +164,7 @@ static struct ib_cq *iwch_create_cq(struct ib_device *ibdev,
        spin_lock_init(&chp->comp_handler_lock);
        atomic_set(&chp->refcnt, 1);
        init_waitqueue_head(&chp->wait);
-       if (insert_handle(rhp, &rhp->cqidr, chp, chp->cq.cqid)) {
+       if (xa_store_irq(&rhp->cqs, chp->cq.cqid, chp, GFP_KERNEL)) {
                cxio_destroy_cq(&chp->rhp->rdev, &chp->cq);
                kfree(chp);
                return ERR_PTR(-ENOMEM);