[PATCH 06/38] mlx5: Convert counters_idr to XArray
From: Matthew Wilcox <willy@infradead.org>
Date: 2019-08-20 22:34:05
Subsystem:
mellanox mlx5 ib driver, mellanox mlx5 core vpi driver, networking drivers, the rest · Maintainers:
Leon Romanovsky, Saeed Mahameed, Tariq Toukan, Mark Bloch, Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
From: "Matthew Wilcox (Oracle)" <willy@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) <willy@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