diff options
| author | Michael Guralnik <michaelgur@nvidia.com> | 2026-02-26 16:52:09 +0300 |
|---|---|---|
| committer | Leon Romanovsky <leon@kernel.org> | 2026-03-02 21:45:10 +0300 |
| commit | 304725adecd7b1e08c5cd810d761e9c218839b12 (patch) | |
| tree | 55625e4a9ec10eba84e5bf955843ba3f4029b6d7 | |
| parent | 84cb1dd06fc47c5a7bb797a83bf3a776dcd28afd (diff) | |
| download | linux-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.c | 12 | ||||
| -rw-r--r-- | drivers/infiniband/core/frmr_pools.h | 3 |
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 { |
