@@ -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)
@@ -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;