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

cxgb4: Convert hwtid_idr to XArray

Signed-off-by: default avatarMatthew Wilcox <willy@infradead.org>
Acked-by: default avatarSteve Wise <swise@opengridcomputing.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 7a268a93
...@@ -331,20 +331,23 @@ static void remove_ep_tid(struct c4iw_ep *ep) ...@@ -331,20 +331,23 @@ static void remove_ep_tid(struct c4iw_ep *ep)
{ {
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&ep->com.dev->lock, flags); xa_lock_irqsave(&ep->com.dev->hwtids, flags);
_remove_handle(ep->com.dev, &ep->com.dev->hwtid_idr, ep->hwtid, 0); __xa_erase(&ep->com.dev->hwtids, ep->hwtid);
if (idr_is_empty(&ep->com.dev->hwtid_idr)) if (xa_empty(&ep->com.dev->hwtids))
wake_up(&ep->com.dev->wait); 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; 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); return err;
_insert_handle(ep->com.dev, &ep->com.dev->hwtid_idr, ep, ep->hwtid, 0);
spin_unlock_irqrestore(&ep->com.dev->lock, flags);
} }
/* /*
...@@ -355,11 +358,11 @@ static struct c4iw_ep *get_ep_from_tid(struct c4iw_dev *dev, unsigned int tid) ...@@ -355,11 +358,11 @@ static struct c4iw_ep *get_ep_from_tid(struct c4iw_dev *dev, unsigned int tid)
struct c4iw_ep *ep; struct c4iw_ep *ep;
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&dev->lock, flags); xa_lock_irqsave(&dev->hwtids, flags);
ep = idr_find(&dev->hwtid_idr, tid); ep = xa_load(&dev->hwtids, tid);
if (ep) if (ep)
c4iw_get_ep(&ep->com); c4iw_get_ep(&ep->com);
spin_unlock_irqrestore(&dev->lock, flags); xa_unlock_irqrestore(&dev->hwtids, flags);
return ep; return ep;
} }
...@@ -2947,7 +2950,7 @@ static int peer_abort(struct c4iw_dev *dev, struct sk_buff *skb) ...@@ -2947,7 +2950,7 @@ static int peer_abort(struct c4iw_dev *dev, struct sk_buff *skb)
(const u32 *)&sin6->sin6_addr.s6_addr, (const u32 *)&sin6->sin6_addr.s6_addr,
1); 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, cxgb4_remove_tid(ep->com.dev->rdev.lldi.tids, 0, ep->hwtid,
ep->com.local_addr.ss_family); ep->com.local_addr.ss_family);
dst_release(ep->dst); dst_release(ep->dst);
......
...@@ -560,10 +560,8 @@ static const struct file_operations stats_debugfs_fops = { ...@@ -560,10 +560,8 @@ static const struct file_operations stats_debugfs_fops = {
.write = stats_clear, .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 space;
int cc; int cc;
...@@ -619,6 +617,11 @@ static int dump_ep(int id, void *p, void *data) ...@@ -619,6 +617,11 @@ static int dump_ep(int id, void *p, void *data)
return 0; 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) static int dump_listen_ep(int id, void *p, void *data)
{ {
struct c4iw_listen_ep *ep = p; struct c4iw_listen_ep *ep = p;
...@@ -676,6 +679,8 @@ static int ep_release(struct inode *inode, struct file *file) ...@@ -676,6 +679,8 @@ static int ep_release(struct inode *inode, struct file *file)
static int ep_open(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; struct c4iw_debugfs_data *epd;
int ret = 0; int ret = 0;
int count = 1; int count = 1;
...@@ -688,8 +693,9 @@ static int ep_open(struct inode *inode, struct file *file) ...@@ -688,8 +693,9 @@ static int ep_open(struct inode *inode, struct file *file)
epd->devp = inode->i_private; epd->devp = inode->i_private;
epd->pos = 0; epd->pos = 0;
xa_for_each(&epd->devp->hwtids, index, ep)
count++;
spin_lock_irq(&epd->devp->lock); 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->atid_idr, count_idrs, &count);
idr_for_each(&epd->devp->stid_idr, count_idrs, &count); idr_for_each(&epd->devp->stid_idr, count_idrs, &count);
spin_unlock_irq(&epd->devp->lock); spin_unlock_irq(&epd->devp->lock);
...@@ -701,9 +707,12 @@ static int ep_open(struct inode *inode, struct file *file) ...@@ -701,9 +707,12 @@ static int ep_open(struct inode *inode, struct file *file)
goto err1; 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); 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); idr_for_each(&epd->devp->stid_idr, dump_listen_ep, epd);
spin_unlock_irq(&epd->devp->lock); spin_unlock_irq(&epd->devp->lock);
...@@ -936,8 +945,7 @@ void c4iw_dealloc(struct uld_ctx *ctx) ...@@ -936,8 +945,7 @@ void c4iw_dealloc(struct uld_ctx *ctx)
WARN_ON(!xa_empty(&ctx->dev->cqs)); WARN_ON(!xa_empty(&ctx->dev->cqs));
WARN_ON(!xa_empty(&ctx->dev->qps)); WARN_ON(!xa_empty(&ctx->dev->qps));
WARN_ON(!xa_empty(&ctx->dev->mrs)); WARN_ON(!xa_empty(&ctx->dev->mrs));
wait_event(ctx->dev->wait, idr_is_empty(&ctx->dev->hwtid_idr)); wait_event(ctx->dev->wait, xa_empty(&ctx->dev->hwtids));
idr_destroy(&ctx->dev->hwtid_idr);
idr_destroy(&ctx->dev->stid_idr); idr_destroy(&ctx->dev->stid_idr);
idr_destroy(&ctx->dev->atid_idr); idr_destroy(&ctx->dev->atid_idr);
if (ctx->dev->rdev.bar2_kva) if (ctx->dev->rdev.bar2_kva)
...@@ -1046,7 +1054,7 @@ static struct c4iw_dev *c4iw_alloc(const struct cxgb4_lld_info *infop) ...@@ -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->cqs, XA_FLAGS_LOCK_IRQ);
xa_init_flags(&devp->qps, XA_FLAGS_LOCK_IRQ); xa_init_flags(&devp->qps, XA_FLAGS_LOCK_IRQ);
xa_init_flags(&devp->mrs, 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->stid_idr);
idr_init(&devp->atid_idr); idr_init(&devp->atid_idr);
spin_lock_init(&devp->lock); spin_lock_init(&devp->lock);
......
...@@ -322,7 +322,7 @@ struct c4iw_dev { ...@@ -322,7 +322,7 @@ struct c4iw_dev {
struct mutex db_mutex; struct mutex db_mutex;
struct dentry *debugfs_root; struct dentry *debugfs_root;
enum db_state db_state; enum db_state db_state;
struct idr hwtid_idr; struct xarray hwtids;
struct idr atid_idr; struct idr atid_idr;
struct idr stid_idr; struct idr stid_idr;
struct list_head db_fc_list; struct list_head db_fc_list;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment