From 4cae722c1b06916251fc4f8ed1f838089b567820 Mon Sep 17 00:00:00 2001 From: Matan Azrad Date: Tue, 24 Mar 2020 14:24:34 +0000 Subject: [PATCH] vdpa/mlx5: move virtual doorbell alloc to probe The configure and close operations may be called a lot of time by vhost library according to the virtio connections in the guest. VAR is the device memory space for the virtio queues doorbells. Each VAR page can be shared for more than one queue while its owner must synchronize the writes to it. The mlx5 driver allocates single VAR page for all its queues. Therefore, it is better to allocate it in probe device level instead of creating and destroying it per new connection. Signed-off-by: Matan Azrad Acked-by: Viacheslav Ovsiienko Reviewed-by: Maxime Coquelin --- drivers/vdpa/mlx5/mlx5_vdpa.c | 14 +++++++++++++- drivers/vdpa/mlx5/mlx5_vdpa_virtq.c | 9 --------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/drivers/vdpa/mlx5/mlx5_vdpa.c b/drivers/vdpa/mlx5/mlx5_vdpa.c index 0a9f31a87d..0991e5ae12 100644 --- a/drivers/vdpa/mlx5/mlx5_vdpa.c +++ b/drivers/vdpa/mlx5/mlx5_vdpa.c @@ -447,6 +447,11 @@ mlx5_vdpa_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, priv->ctx = ctx; priv->dev_addr.pci_addr = pci_dev->addr; priv->dev_addr.type = VDPA_ADDR_PCI; + priv->var = mlx5_glue->dv_alloc_var(ctx, 0); + if (!priv->var) { + DRV_LOG(ERR, "Failed to allocate VAR %u.\n", errno); + goto error; + } priv->id = rte_vdpa_register_device(&priv->dev_addr, &mlx5_vdpa_ops); if (priv->id < 0) { DRV_LOG(ERR, "Failed to register vDPA device."); @@ -461,8 +466,11 @@ mlx5_vdpa_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, return 0; error: - if (priv) + if (priv) { + if (priv->var) + mlx5_glue->dv_free_var(priv->var); rte_free(priv); + } if (ctx) mlx5_glue->close_device(ctx); return -rte_errno; @@ -499,6 +507,10 @@ mlx5_vdpa_pci_remove(struct rte_pci_device *pci_dev) if (found) { if (priv->configured) mlx5_vdpa_dev_close(priv->vid); + if (priv->var) { + mlx5_glue->dv_free_var(priv->var); + priv->var = NULL; + } mlx5_glue->close_device(priv->ctx); rte_free(priv); } diff --git a/drivers/vdpa/mlx5/mlx5_vdpa_virtq.c b/drivers/vdpa/mlx5/mlx5_vdpa_virtq.c index cb2d61bd06..dd3701603f 100644 --- a/drivers/vdpa/mlx5/mlx5_vdpa_virtq.c +++ b/drivers/vdpa/mlx5/mlx5_vdpa_virtq.c @@ -105,10 +105,6 @@ mlx5_vdpa_virtqs_release(struct mlx5_vdpa_priv *priv) claim_zero(munmap(priv->virtq_db_addr, priv->var->length)); priv->virtq_db_addr = NULL; } - if (priv->var) { - mlx5_glue->dv_free_var(priv->var); - priv->var = NULL; - } priv->features = 0; } @@ -350,11 +346,6 @@ mlx5_vdpa_virtqs_prepare(struct mlx5_vdpa_priv *priv) DRV_LOG(ERR, "Failed to configure negotiated features."); return -1; } - priv->var = mlx5_glue->dv_alloc_var(priv->ctx, 0); - if (!priv->var) { - DRV_LOG(ERR, "Failed to allocate VAR %u.\n", errno); - return -1; - } /* Always map the entire page. */ priv->virtq_db_addr = mmap(NULL, priv->var->length, PROT_READ | PROT_WRITE, MAP_SHARED, priv->ctx->cmd_fd, -- 2.20.1