Skip to content

Commit e1ba5c9

Browse files
dtatuleamstsirkin
authored andcommitted
vdpa/mlx5: Delete direct MKEYs in parallel
Use the async interface to issue MTT MKEY deletion. This makes destroy_user_mr() on average 8x times faster. This number is also dependent on the size of the MR being deleted. Signed-off-by: Dragos Tatulea <[email protected]> Reviewed-by: Cosmin Ratiu <[email protected]> Acked-by: Eugenio Pérez <[email protected]> Message-Id: <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]>
1 parent 0071b13 commit e1ba5c9

File tree

1 file changed

+64
-0
lines changed
  • drivers/vdpa/mlx5/core

1 file changed

+64
-0
lines changed

drivers/vdpa/mlx5/core/mr.c

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
5863
static 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+
94110
static 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+
260323
static 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

Comments
 (0)