Commit f254ba6a authored by Matthew Wilcox's avatar Matthew Wilcox Committed by Jason Gunthorpe
Browse files

cxgb4: Convert hwtid_idr to XArray

parent 7a268a93
Loading
Loading
Loading
Loading
+15 −12
Original line number Diff line number Diff line
@@ -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);
+17 −9
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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;