Loading drivers/infiniband/hw/cxgb4/cm.c +15 −12 Original line number Diff line number Diff line Loading @@ -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; } /* Loading @@ -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; } Loading Loading @@ -2947,7 +2950,7 @@ static int peer_abort(struct c4iw_dev *dev, struct sk_buff *skb) (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); Loading drivers/infiniband/hw/cxgb4/device.c +17 −9 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -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); Loading @@ -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); Loading Loading @@ -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) Loading Loading @@ -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); Loading drivers/infiniband/hw/cxgb4/iw_cxgb4.h +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading
drivers/infiniband/hw/cxgb4/cm.c +15 −12 Original line number Diff line number Diff line Loading @@ -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; } /* Loading @@ -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; } Loading Loading @@ -2947,7 +2950,7 @@ static int peer_abort(struct c4iw_dev *dev, struct sk_buff *skb) (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); Loading
drivers/infiniband/hw/cxgb4/device.c +17 −9 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -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); Loading @@ -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); Loading Loading @@ -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) Loading Loading @@ -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); Loading
drivers/infiniband/hw/cxgb4/iw_cxgb4.h +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading