@@ -55,6 +55,11 @@ struct mlx5_create_mkey_mem {
5555 __be64 mtt [];
5656};
5757
58+ struct mlx5_destroy_mkey_mem {
59+ u8 out [MLX5_ST_SZ_BYTES (destroy_mkey_out )];
60+ u8 in [MLX5_ST_SZ_BYTES (destroy_mkey_in )];
61+ };
62+
5863static void fill_create_direct_mr (struct mlx5_vdpa_dev * mvdev ,
5964 struct mlx5_vdpa_direct_mr * mr ,
6065 struct mlx5_create_mkey_mem * mem )
@@ -91,6 +96,17 @@ static void create_direct_mr_end(struct mlx5_vdpa_dev *mvdev,
9196 mr -> mr = mlx5_idx_to_mkey (mkey_index );
9297}
9398
99+ static void fill_destroy_direct_mr (struct mlx5_vdpa_dev * mvdev ,
100+ struct mlx5_vdpa_direct_mr * mr ,
101+ struct mlx5_destroy_mkey_mem * mem )
102+ {
103+ void * in = & mem -> in ;
104+
105+ MLX5_SET (destroy_mkey_in , in , uid , mvdev -> res .uid );
106+ MLX5_SET (destroy_mkey_in , in , opcode , MLX5_CMD_OP_DESTROY_MKEY );
107+ MLX5_SET (destroy_mkey_in , in , mkey_index , mlx5_mkey_to_idx (mr -> mr ));
108+ }
109+
94110static void destroy_direct_mr (struct mlx5_vdpa_dev * mvdev , struct mlx5_vdpa_direct_mr * mr )
95111{
96112 if (!mr -> mr )
@@ -257,6 +273,53 @@ static int create_direct_keys(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_mr *
257273 return err ;
258274}
259275
276+ DEFINE_FREE (free_cmds , struct mlx5_vdpa_async_cmd * , kvfree (_T ))
277+ DEFINE_FREE (free_cmd_mem , struct mlx5_destroy_mkey_mem * , kvfree (_T ))
278+
279+ static int destroy_direct_keys (struct mlx5_vdpa_dev * mvdev , struct mlx5_vdpa_mr * mr )
280+ {
281+ struct mlx5_destroy_mkey_mem * cmd_mem __free (free_cmd_mem ) = NULL ;
282+ struct mlx5_vdpa_async_cmd * cmds __free (free_cmds ) = NULL ;
283+ struct mlx5_vdpa_direct_mr * dmr ;
284+ int err = 0 ;
285+ int i = 0 ;
286+
287+ cmds = kvcalloc (mr -> num_directs , sizeof (* cmds ), GFP_KERNEL );
288+ cmd_mem = kvcalloc (mr -> num_directs , sizeof (* cmd_mem ), GFP_KERNEL );
289+ if (!cmds || !cmd_mem )
290+ return - ENOMEM ;
291+
292+ list_for_each_entry (dmr , & mr -> head , list ) {
293+ cmds [i ].out = cmd_mem [i ].out ;
294+ cmds [i ].outlen = sizeof (cmd_mem [i ].out );
295+ cmds [i ].in = cmd_mem [i ].in ;
296+ cmds [i ].inlen = sizeof (cmd_mem [i ].in );
297+ fill_destroy_direct_mr (mvdev , dmr , & cmd_mem [i ]);
298+ i ++ ;
299+ }
300+
301+ err = mlx5_vdpa_exec_async_cmds (mvdev , cmds , mr -> num_directs );
302+ if (err ) {
303+
304+ mlx5_vdpa_err (mvdev , "error issuing MTT mkey deletion for direct mrs: %d\n" , err );
305+ return err ;
306+ }
307+
308+ i = 0 ;
309+ list_for_each_entry (dmr , & mr -> head , list ) {
310+ struct mlx5_vdpa_async_cmd * cmd = & cmds [i ++ ];
311+
312+ dmr -> mr = 0 ;
313+ if (cmd -> err ) {
314+ err = err ? err : cmd -> err ;
315+ mlx5_vdpa_err (mvdev , "error deleting MTT mkey [0x%llx, 0x%llx]: %d\n" ,
316+ dmr -> start , dmr -> end , cmd -> err );
317+ }
318+ }
319+
320+ return err ;
321+ }
322+
260323static int create_indirect_key (struct mlx5_vdpa_dev * mvdev , struct mlx5_vdpa_mr * mr )
261324{
262325 int inlen ;
@@ -565,6 +628,7 @@ static void destroy_user_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_mr *mr
565628 struct mlx5_vdpa_direct_mr * n ;
566629
567630 destroy_indirect_key (mvdev , mr );
631+ destroy_direct_keys (mvdev , mr );
568632 list_for_each_entry_safe_reverse (dmr , n , & mr -> head , list ) {
569633 list_del_init (& dmr -> list );
570634 unmap_direct_mr (mvdev , dmr );
0 commit comments