OSDN Git Service

cxgb4: Convert hwtid_idr to XArray
authorMatthew Wilcox <willy@infradead.org>
Thu, 21 Feb 2019 00:20:53 +0000 (16:20 -0800)
committerJason Gunthorpe <jgg@mellanox.com>
Mon, 25 Mar 2019 18:42:12 +0000 (15:42 -0300)
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/cxgb4/cm.c
drivers/infiniband/hw/cxgb4/device.c
drivers/infiniband/hw/cxgb4/iw_cxgb4.h

index 4d232bd..a922895 100644 (file)
@@ -331,20 +331,23 @@ static void remove_ep_tid(struct c4iw_ep *ep)
 {
        unsigned long flags;
 
-       spin_lock_irqsave(&ep->com.dev->lock, flags);
-       _remove_handle(ep->com.dev, &ep->com.dev->hwtid_idr, ep->hwtid, 0);
-       if (idr_is_empty(&ep->com.dev->hwtid_idr))
+       xa_lock_irqsave(&ep->com.dev->hwtids, flags);
+       __xa_erase(&ep->com.dev->hwtids, ep->hwtid);
+       if (xa_empty(&ep->com.dev->hwtids))
                wake_up(&ep->com.dev->wait);
-       spin_unlock_irqrestore(&ep->com.dev->lock, flags);
+       xa_unlock_irqrestore(&ep->com.dev->hwtids, flags);
 }
 
-static void insert_ep_tid(struct c4iw_ep *ep)
+static int insert_ep_tid(struct c4iw_ep *ep)
 {
        unsigned long flags;
+       int err;
+
+       xa_lock_irqsave(&ep->com.dev->hwtids, flags);
+       err = __xa_insert(&ep->com.dev->hwtids, ep->hwtid, ep, GFP_KERNEL);
+       xa_unlock_irqrestore(&ep->com.dev->hwtids, flags);
 
-       spin_lock_irqsave(&ep->com.dev->lock, flags);
-       _insert_handle(ep->com.dev, &ep->com.dev->hwtid_idr, ep, ep->hwtid, 0);
-       spin_unlock_irqrestore(&ep->com.dev->lock, flags);
+       return err;
 }
 
 /*
@@ -355,11 +358,11 @@ static struct c4iw_ep *get_ep_from_tid(struct c4iw_dev *dev, unsigned int tid)
        struct c4iw_ep *ep;
        unsigned long flags;
 
-       spin_lock_irqsave(&dev->lock, flags);
-       ep = idr_find(&dev->hwtid_idr, tid);
+       xa_lock_irqsave(&dev->hwtids, flags);
+       ep = xa_load(&dev->hwtids, tid);
        if (ep)
                c4iw_get_ep(&ep->com);
-       spin_unlock_irqrestore(&dev->lock, flags);
+       xa_unlock_irqrestore(&dev->hwtids, flags);
        return ep;
 }
 
@@ -2947,7 +2950,7 @@ out:
                                        (const u32 *)&sin6->sin6_addr.s6_addr,
                                        1);
                }
-               remove_handle(ep->com.dev, &ep->com.dev->hwtid_idr, ep->hwtid);
+               xa_erase_irq(&ep->com.dev->hwtids, ep->hwtid);
                cxgb4_remove_tid(ep->com.dev->rdev.lldi.tids, 0, ep->hwtid,
                                 ep->com.local_addr.ss_family);
                dst_release(ep->dst);
index 78577b3..87fe82e 100644 (file)
@@ -560,10 +560,8 @@ static const struct file_operations stats_debugfs_fops = {
        .write   = stats_clear,
 };
 
-static int dump_ep(int id, void *p, void *data)
+static int dump_ep(struct c4iw_ep *ep, struct c4iw_debugfs_data *epd)
 {
-       struct c4iw_ep *ep = p;
-       struct c4iw_debugfs_data *epd = data;
        int space;
        int cc;
 
@@ -619,6 +617,11 @@ static int dump_ep(int id, void *p, void *data)
        return 0;
 }
 
+static int _dump_ep(int id, void *p, void *data)
+{
+       return dump_ep(p, data);
+}
+
 static int dump_listen_ep(int id, void *p, void *data)
 {
        struct c4iw_listen_ep *ep = p;
@@ -676,6 +679,8 @@ static int ep_release(struct inode *inode, struct file *file)
 
 static int ep_open(struct inode *inode, struct file *file)
 {
+       struct c4iw_ep *ep;
+       unsigned long index;
        struct c4iw_debugfs_data *epd;
        int ret = 0;
        int count = 1;
@@ -688,8 +693,9 @@ static int ep_open(struct inode *inode, struct file *file)
        epd->devp = inode->i_private;
        epd->pos = 0;
 
+       xa_for_each(&epd->devp->hwtids, index, ep)
+               count++;
        spin_lock_irq(&epd->devp->lock);
-       idr_for_each(&epd->devp->hwtid_idr, count_idrs, &count);
        idr_for_each(&epd->devp->atid_idr, count_idrs, &count);
        idr_for_each(&epd->devp->stid_idr, count_idrs, &count);
        spin_unlock_irq(&epd->devp->lock);
@@ -701,9 +707,12 @@ static int ep_open(struct inode *inode, struct file *file)
                goto err1;
        }
 
+       xa_lock_irq(&epd->devp->hwtids);
+       xa_for_each(&epd->devp->hwtids, index, ep)
+               dump_ep(ep, epd);
+       xa_unlock_irq(&epd->devp->hwtids);
        spin_lock_irq(&epd->devp->lock);
-       idr_for_each(&epd->devp->hwtid_idr, dump_ep, epd);
-       idr_for_each(&epd->devp->atid_idr, dump_ep, epd);
+       idr_for_each(&epd->devp->atid_idr, _dump_ep, epd);
        idr_for_each(&epd->devp->stid_idr, dump_listen_ep, epd);
        spin_unlock_irq(&epd->devp->lock);
 
@@ -936,8 +945,7 @@ void c4iw_dealloc(struct uld_ctx *ctx)
        WARN_ON(!xa_empty(&ctx->dev->cqs));
        WARN_ON(!xa_empty(&ctx->dev->qps));
        WARN_ON(!xa_empty(&ctx->dev->mrs));
-       wait_event(ctx->dev->wait, idr_is_empty(&ctx->dev->hwtid_idr));
-       idr_destroy(&ctx->dev->hwtid_idr);
+       wait_event(ctx->dev->wait, xa_empty(&ctx->dev->hwtids));
        idr_destroy(&ctx->dev->stid_idr);
        idr_destroy(&ctx->dev->atid_idr);
        if (ctx->dev->rdev.bar2_kva)
@@ -1046,7 +1054,7 @@ static struct c4iw_dev *c4iw_alloc(const struct cxgb4_lld_info *infop)
        xa_init_flags(&devp->cqs, XA_FLAGS_LOCK_IRQ);
        xa_init_flags(&devp->qps, XA_FLAGS_LOCK_IRQ);
        xa_init_flags(&devp->mrs, XA_FLAGS_LOCK_IRQ);
-       idr_init(&devp->hwtid_idr);
+       xa_init_flags(&devp->hwtids, XA_FLAGS_LOCK_IRQ);
        idr_init(&devp->stid_idr);
        idr_init(&devp->atid_idr);
        spin_lock_init(&devp->lock);
index 7dffb68..bba03fa 100644 (file)
@@ -322,7 +322,7 @@ struct c4iw_dev {
        struct mutex db_mutex;
        struct dentry *debugfs_root;
        enum db_state db_state;
-       struct idr hwtid_idr;
+       struct xarray hwtids;
        struct idr atid_idr;
        struct idr stid_idr;
        struct list_head db_fc_list;