vdpa/mlx5: move virtual doorbell alloc to probe
[dpdk.git] / drivers / vdpa / mlx5 / mlx5_vdpa_virtq.c
index 32a13ce..dd37016 100644 (file)
@@ -105,14 +105,10 @@ 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;
 }
 
-static int
+int
 mlx5_vdpa_virtq_modify(struct mlx5_vdpa_virtq *virtq, int state)
 {
        struct mlx5_devx_virtq_attr attr = {
@@ -236,10 +232,17 @@ mlx5_vdpa_virtq_setup(struct mlx5_vdpa_priv *priv,
                }
                attr.available_addr = gpa;
        }
-       rte_vhost_get_vring_base(priv->vid, index, &last_avail_idx,
+       ret = rte_vhost_get_vring_base(priv->vid, index, &last_avail_idx,
                                 &last_used_idx);
-       DRV_LOG(INFO, "vid %d: Init last_avail_idx=%d, last_used_idx=%d for "
-               "virtq %d.", priv->vid, last_avail_idx, last_used_idx, index);
+       if (ret) {
+               last_avail_idx = 0;
+               last_used_idx = 0;
+               DRV_LOG(WARNING, "Couldn't get vring base, idx are set to 0");
+       } else {
+               DRV_LOG(INFO, "vid %d: Init last_avail_idx=%d, last_used_idx=%d for "
+                               "virtq %d.", priv->vid, last_avail_idx,
+                               last_used_idx, index);
+       }
        attr.hw_available_index = last_avail_idx;
        attr.hw_used_index = last_used_idx;
        attr.q_size = vq.size;
@@ -253,6 +256,11 @@ mlx5_vdpa_virtq_setup(struct mlx5_vdpa_priv *priv,
        if (mlx5_vdpa_virtq_modify(virtq, 1))
                goto error;
        virtq->enable = 1;
+       virtq->priv = priv;
+       /* Be sure notifications are not missed during configuration. */
+       claim_zero(rte_vhost_enable_guest_notification(priv->vid, index, 1));
+       rte_write32(virtq->index, priv->virtq_db_addr);
+       /* Setup doorbell mapping. */
        virtq->intr_handle.fd = vq.kickfd;
        virtq->intr_handle.type = RTE_INTR_HANDLE_EXT;
        if (rte_intr_callback_register(&virtq->intr_handle,
@@ -338,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,