@@ -55,6 +55,11 @@ struct mlx5_create_mkey_mem {
55
55
__be64 mtt [];
56
56
};
57
57
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
+
58
63
static void fill_create_direct_mr (struct mlx5_vdpa_dev * mvdev ,
59
64
struct mlx5_vdpa_direct_mr * mr ,
60
65
struct mlx5_create_mkey_mem * mem )
@@ -91,6 +96,17 @@ static void create_direct_mr_end(struct mlx5_vdpa_dev *mvdev,
91
96
mr -> mr = mlx5_idx_to_mkey (mkey_index );
92
97
}
93
98
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
+
94
110
static void destroy_direct_mr (struct mlx5_vdpa_dev * mvdev , struct mlx5_vdpa_direct_mr * mr )
95
111
{
96
112
if (!mr -> mr )
@@ -257,6 +273,53 @@ static int create_direct_keys(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_mr *
257
273
return err ;
258
274
}
259
275
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
+
260
323
static int create_indirect_key (struct mlx5_vdpa_dev * mvdev , struct mlx5_vdpa_mr * mr )
261
324
{
262
325
int inlen ;
@@ -565,6 +628,7 @@ static void destroy_user_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_mr *mr
565
628
struct mlx5_vdpa_direct_mr * n ;
566
629
567
630
destroy_indirect_key (mvdev , mr );
631
+ destroy_direct_keys (mvdev , mr );
568
632
list_for_each_entry_safe_reverse (dmr , n , & mr -> head , list ) {
569
633
list_del_init (& dmr -> list );
570
634
unmap_direct_mr (mvdev , dmr );
0 commit comments