mirror of
https://github.com/torvalds/linux.git
synced 2026-07-31 11:37:06 +02:00
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:
parent
8c76126b86
commit
ddbc251be1
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user