Skip to content

Commit a0130ef

Browse files
mikijoyrleon
authored andcommitted
RDMA/mlx5: Fix MR cache initialization error flow
Destroy all previously created cache entries and work queue when rolling back the MR cache initialization upon an error. Fixes: 73d09b2 ("RDMA/mlx5: Introduce mlx5r_cache_rb_key") Signed-off-by: Michael Guralnik <[email protected]> Reviewed-by: Yishai Hadas <[email protected]> Link: https://patch.msgid.link/c41d525fb3c72e28dd38511bf3aaccb5d584063e.1741875692.git.leon@kernel.org Signed-off-by: Leon Romanovsky <[email protected]>
1 parent fd24c9e commit a0130ef

File tree

1 file changed

+22
-11
lines changed
  • drivers/infiniband/hw/mlx5

1 file changed

+22
-11
lines changed

drivers/infiniband/hw/mlx5/mr.c

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,25 @@ mlx5r_cache_create_ent_locked(struct mlx5_ib_dev *dev,
919919
return ERR_PTR(ret);
920920
}
921921

922+
static void mlx5r_destroy_cache_entries(struct mlx5_ib_dev *dev)
923+
{
924+
struct rb_root *root = &dev->cache.rb_root;
925+
struct mlx5_cache_ent *ent;
926+
struct rb_node *node;
927+
928+
mutex_lock(&dev->cache.rb_lock);
929+
node = rb_first(root);
930+
while (node) {
931+
ent = rb_entry(node, struct mlx5_cache_ent, node);
932+
node = rb_next(node);
933+
clean_keys(dev, ent);
934+
rb_erase(&ent->node, root);
935+
mlx5r_mkeys_uninit(ent);
936+
kfree(ent);
937+
}
938+
mutex_unlock(&dev->cache.rb_lock);
939+
}
940+
922941
int mlx5_mkey_cache_init(struct mlx5_ib_dev *dev)
923942
{
924943
struct mlx5_mkey_cache *cache = &dev->cache;
@@ -970,6 +989,8 @@ int mlx5_mkey_cache_init(struct mlx5_ib_dev *dev)
970989
err:
971990
mutex_unlock(&cache->rb_lock);
972991
mlx5_mkey_cache_debugfs_cleanup(dev);
992+
mlx5r_destroy_cache_entries(dev);
993+
destroy_workqueue(cache->wq);
973994
mlx5_ib_warn(dev, "failed to create mkey cache entry\n");
974995
return ret;
975996
}
@@ -1003,17 +1024,7 @@ void mlx5_mkey_cache_cleanup(struct mlx5_ib_dev *dev)
10031024
mlx5_cmd_cleanup_async_ctx(&dev->async_ctx);
10041025

10051026
/* At this point all entries are disabled and have no concurrent work. */
1006-
mutex_lock(&dev->cache.rb_lock);
1007-
node = rb_first(root);
1008-
while (node) {
1009-
ent = rb_entry(node, struct mlx5_cache_ent, node);
1010-
node = rb_next(node);
1011-
clean_keys(dev, ent);
1012-
rb_erase(&ent->node, root);
1013-
mlx5r_mkeys_uninit(ent);
1014-
kfree(ent);
1015-
}
1016-
mutex_unlock(&dev->cache.rb_lock);
1027+
mlx5r_destroy_cache_entries(dev);
10171028

10181029
destroy_workqueue(dev->cache.wq);
10191030
del_timer_sync(&dev->delay_timer);

0 commit comments

Comments
 (0)