RDMA/core: Add ib_frmr_pool_drop for unrecoverable handles

A driver that has popped a handle from an FRMR pool can hit failures
that leave the handle in a state where it can't safely be returned
for reuse. The driver destroys the handle itself, but the pool has
no way to learn about it, so the in_use counter drifts upward.

Add ib_frmr_pool_drop to balance the pool's accounting in this case.
Every pop is now balanced by exactly one push or drop.

Fixes: 36680ef7bc ("RDMA/mlx5: Switch from MR cache to FRMR pools")
Link: https://patch.msgid.link/r/20260610000145.820592-9-michaelgur@nvidia.com
Signed-off-by: Michael Guralnik <michaelgur@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
Michael Guralnik 2026-06-10 03:01:44 +03:00 committed by Jason Gunthorpe
parent 8c76126b86
commit ddbc251be1
2 changed files with 16 additions and 0 deletions

View File

@ -578,3 +578,18 @@ void ib_frmr_pool_push(struct ib_device *device, struct ib_mr *mr)
}
EXPORT_SYMBOL(ib_frmr_pool_push);
/*
* Drop a handle previously popped from the pool without returning it for
* reuse. The caller is responsible for destroying the underlying hardware
* resource.
*/
void ib_frmr_pool_drop(struct ib_mr *mr)
{
struct ib_frmr_pool *pool = mr->frmr.pool;
spin_lock(&pool->lock);
pool->in_use--;
spin_unlock(&pool->lock);
}
EXPORT_SYMBOL(ib_frmr_pool_drop);

View File

@ -35,5 +35,6 @@ int ib_frmr_pools_init(struct ib_device *device,
void ib_frmr_pools_cleanup(struct ib_device *device);
int ib_frmr_pool_pop(struct ib_device *device, struct ib_mr *mr);
void ib_frmr_pool_push(struct ib_device *device, struct ib_mr *mr);
void ib_frmr_pool_drop(struct ib_mr *mr);
#endif /* FRMR_POOLS_H */