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 <matan@mellanox.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
This commit is contained in:
Matan Azrad 2020-03-24 14:24:34 +00:00 committed by Ferruh Yigit
parent 6d6cd38f45
commit 4cae722c1b
2 changed files with 13 additions and 10 deletions

View File

@ -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);
}

View File

@ -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,