mirror of https://gitee.com/openkylin/linux.git
cxgb4: Convert hwtid_idr to XArray
Signed-off-by: Matthew Wilcox <willy@infradead.org> Acked-by: Steve Wise <swise@opengridcomputing.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
parent
7a268a9397
commit
f254ba6ae5
|
@ -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;
|
||||||
|
|
||||||
spin_lock_irqsave(&ep->com.dev->lock, flags);
|
xa_lock_irqsave(&ep->com.dev->hwtids, flags);
|
||||||
_insert_handle(ep->com.dev, &ep->com.dev->hwtid_idr, ep, ep->hwtid, 0);
|
err = __xa_insert(&ep->com.dev->hwtids, ep->hwtid, ep, GFP_KERNEL);
|
||||||
spin_unlock_irqrestore(&ep->com.dev->lock, flags);
|
xa_unlock_irqrestore(&ep->com.dev->hwtids, 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;
|
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)
|
||||||
(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 = {
|
||||||
.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)
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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 {
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue