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 = {
}
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;
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,
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,