@@ -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+
922941int 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)
970989err :
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