@@ -919,6 +919,25 @@ mlx5r_cache_create_ent_locked(struct mlx5_ib_dev *dev,
919
919
return ERR_PTR (ret );
920
920
}
921
921
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
+
922
941
int mlx5_mkey_cache_init (struct mlx5_ib_dev * dev )
923
942
{
924
943
struct mlx5_mkey_cache * cache = & dev -> cache ;
@@ -970,6 +989,8 @@ int mlx5_mkey_cache_init(struct mlx5_ib_dev *dev)
970
989
err :
971
990
mutex_unlock (& cache -> rb_lock );
972
991
mlx5_mkey_cache_debugfs_cleanup (dev );
992
+ mlx5r_destroy_cache_entries (dev );
993
+ destroy_workqueue (cache -> wq );
973
994
mlx5_ib_warn (dev , "failed to create mkey cache entry\n" );
974
995
return ret ;
975
996
}
@@ -1003,17 +1024,7 @@ void mlx5_mkey_cache_cleanup(struct mlx5_ib_dev *dev)
1003
1024
mlx5_cmd_cleanup_async_ctx (& dev -> async_ctx );
1004
1025
1005
1026
/* 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 );
1017
1028
1018
1029
destroy_workqueue (dev -> cache .wq );
1019
1030
del_timer_sync (& dev -> delay_timer );
0 commit comments