[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20190820223259.22348-7-willy@infradead.org>
Date: Tue, 20 Aug 2019 15:32:27 -0700
From: Matthew Wilcox <willy@...radead.org>
To: netdev@...r.kernel.org
Cc: "Matthew Wilcox (Oracle)" <willy@...radead.org>
Subject: [PATCH 06/38] mlx5: Convert counters_idr to XArray
From: "Matthew Wilcox (Oracle)" <willy@...radead.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@...radead.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
Powered by blists - more mailing lists