From: "Matthew Wilcox (Oracle)" <wi...@infradead.org> This IDR wasn't using the allocation functionality, so convert it to a plain XArray. I also suspect it could be used to replace the list_head 'counters', but I'm not willing to do that work right now.
Signed-off-by: Matthew Wilcox (Oracle) <wi...@infradead.org> --- .../ethernet/mellanox/mlx5/core/fs_counters.c | 31 +++++-------------- include/linux/mlx5/driver.h | 3 +- 2 files changed, 9 insertions(+), 25 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c index 1804cf3c3814..5ee20d285c5e 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c @@ -108,18 +108,14 @@ static struct list_head *mlx5_fc_counters_lookup_next(struct mlx5_core_dev *dev, u32 id) { struct mlx5_fc_stats *fc_stats = &dev->priv.fc_stats; - unsigned long next_id = (unsigned long)id + 1; struct mlx5_fc *counter; - unsigned long tmp; + unsigned long next_id; - rcu_read_lock(); - /* skip counters that are in idr, but not yet in counters list */ - idr_for_each_entry_continue_ul(&fc_stats->counters_idr, - counter, tmp, next_id) { + /* skip counters that are not yet in counters list */ + xa_for_each_start(&fc_stats->counters_xa, next_id, counter, id + 1) { if (!list_empty(&counter->list)) break; } - rcu_read_unlock(); return counter ? &counter->list : &fc_stats->counters; } @@ -139,9 +135,7 @@ static void mlx5_fc_stats_remove(struct mlx5_core_dev *dev, list_del(&counter->list); - spin_lock(&fc_stats->counters_idr_lock); - WARN_ON(!idr_remove(&fc_stats->counters_idr, counter->id)); - spin_unlock(&fc_stats->counters_idr_lock); + WARN_ON(!xa_erase(&fc_stats->counters_xa, counter->id)); } static int get_max_bulk_query_len(struct mlx5_core_dev *dev) @@ -309,20 +303,12 @@ struct mlx5_fc *mlx5_fc_create(struct mlx5_core_dev *dev, bool aging) counter->aging = aging; if (aging) { - u32 id = counter->id; - counter->cache.lastuse = jiffies; counter->lastbytes = counter->cache.bytes; counter->lastpackets = counter->cache.packets; - idr_preload(GFP_KERNEL); - spin_lock(&fc_stats->counters_idr_lock); - - err = idr_alloc_u32(&fc_stats->counters_idr, counter, &id, id, - GFP_NOWAIT); - - spin_unlock(&fc_stats->counters_idr_lock); - idr_preload_end(); + err = xa_insert(&fc_stats->counters_xa, counter->id, counter, + GFP_KERNEL); if (err) goto err_out_alloc; @@ -368,8 +354,7 @@ int mlx5_init_fc_stats(struct mlx5_core_dev *dev) int max_bulk_len; int max_out_len; - spin_lock_init(&fc_stats->counters_idr_lock); - idr_init(&fc_stats->counters_idr); + xa_init(&fc_stats->counters_xa); INIT_LIST_HEAD(&fc_stats->counters); init_llist_head(&fc_stats->addlist); init_llist_head(&fc_stats->dellist); @@ -409,7 +394,7 @@ void mlx5_cleanup_fc_stats(struct mlx5_core_dev *dev) kfree(fc_stats->bulk_query_out); - idr_destroy(&fc_stats->counters_idr); + xa_destroy(&fc_stats->counters_xa); tmplist = llist_del_all(&fc_stats->addlist); llist_for_each_entry_safe(counter, tmp, tmplist, addlist) diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h index ba8f59b11920..b8b66cdb8357 100644 --- a/include/linux/mlx5/driver.h +++ b/include/linux/mlx5/driver.h @@ -477,8 +477,7 @@ struct mlx5_fc_pool { }; struct mlx5_fc_stats { - spinlock_t counters_idr_lock; /* protects counters_idr */ - struct idr counters_idr; + struct xarray counters_xa; struct list_head counters; struct llist_head addlist; struct llist_head dellist; -- 2.23.0.rc1