summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Guralnik <michaelgur@nvidia.com>2026-02-26 16:52:09 +0300
committerLeon Romanovsky <leon@kernel.org>2026-03-02 21:45:10 +0300
commit304725adecd7b1e08c5cd810d761e9c218839b12 (patch)
tree55625e4a9ec10eba84e5bf955843ba3f4029b6d7
parent84cb1dd06fc47c5a7bb797a83bf3a776dcd28afd (diff)
downloadlinux-304725adecd7b1e08c5cd810d761e9c218839b12.tar.xz
RDMA/core: Add FRMR pools statistics
Count for each pool the number of FRMR handles popped and held by user MRs. Also keep track of the max value of this counter. Next patches will expose the statistics through netlink. Signed-off-by: Michael Guralnik <michaelgur@nvidia.com> Reviewed-by: Yishai Hadas <yishaih@nvidia.com> Signed-off-by: Edward Srouji <edwards@nvidia.com> Link: https://patch.msgid.link/20260226-frmr_pools-v4-4-95360b54f15e@nvidia.com Signed-off-by: Leon Romanovsky <leon@kernel.org>
-rw-r--r--drivers/infiniband/core/frmr_pools.c12
-rw-r--r--drivers/infiniband/core/frmr_pools.h3
2 files changed, 13 insertions, 2 deletions
diff --git a/drivers/infiniband/core/frmr_pools.c b/drivers/infiniband/core/frmr_pools.c
index 1be7253d7afd..5a9c60f19e4e 100644
--- a/drivers/infiniband/core/frmr_pools.c
+++ b/drivers/infiniband/core/frmr_pools.c
@@ -310,19 +310,24 @@ static int get_frmr_from_pool(struct ib_device *device,
if (pool->inactive_queue.ci > 0) {
handle = pop_handle_from_queue_locked(
&pool->inactive_queue);
- spin_unlock(&pool->lock);
} else {
spin_unlock(&pool->lock);
err = pools->pool_ops->create_frmrs(device, &pool->key,
&handle, 1);
if (err)
return err;
+ spin_lock(&pool->lock);
}
} else {
handle = pop_handle_from_queue_locked(&pool->queue);
- spin_unlock(&pool->lock);
}
+ pool->in_use++;
+ if (pool->in_use > pool->max_in_use)
+ pool->max_in_use = pool->in_use;
+
+ spin_unlock(&pool->lock);
+
mr->frmr.pool = pool;
mr->frmr.handle = handle;
@@ -374,6 +379,9 @@ int ib_frmr_pool_push(struct ib_device *device, struct ib_mr *mr)
if (pool->queue.ci == 0)
schedule_aging = true;
ret = push_handle_to_queue_locked(&pool->queue, mr->frmr.handle);
+ if (ret == 0)
+ pool->in_use--;
+
spin_unlock(&pool->lock);
if (ret == 0 && schedule_aging)
diff --git a/drivers/infiniband/core/frmr_pools.h b/drivers/infiniband/core/frmr_pools.h
index a80789c87638..a30f7ce45d38 100644
--- a/drivers/infiniband/core/frmr_pools.h
+++ b/drivers/infiniband/core/frmr_pools.h
@@ -42,6 +42,9 @@ struct ib_frmr_pool {
struct delayed_work aging_work;
struct ib_device *device;
+
+ u32 max_in_use;
+ u32 in_use;
};
struct ib_frmr_pools {