}
virtq->intr_handle.fd = -1;
}
- if (virtq->virtq)
+ if (virtq->virtq) {
+ ret = mlx5_vdpa_virtq_stop(virtq->priv, virtq->index);
+ if (ret)
+ DRV_LOG(WARNING, "Failed to stop virtq %d.",
+ virtq->index);
claim_zero(mlx5_devx_cmd_destroy(virtq->virtq));
+ }
virtq->virtq = NULL;
for (i = 0; i < RTE_DIM(virtq->umems); ++i) {
if (virtq->umems[i].obj)
{
struct mlx5_devx_virtq_attr attr = {0};
struct mlx5_vdpa_virtq *virtq = &priv->virtqs[index];
- int ret = mlx5_vdpa_virtq_modify(virtq, 0);
+ int ret;
+ if (virtq->stopped)
+ return 0;
+ ret = mlx5_vdpa_virtq_modify(virtq, 0);
if (ret)
return -1;
+ virtq->stopped = true;
if (mlx5_devx_cmd_query_virtq(virtq->virtq, &attr)) {
DRV_LOG(ERR, "Failed to query virtq %d.", index);
return -1;
virtq->intr_handle.fd, index);
}
}
+ virtq->stopped = false;
DRV_LOG(DEBUG, "vid %u virtq %u was created successfully.", priv->vid,
index);
return 0;
DRV_LOG(INFO, "Virtq %d was modified, recreate it.", index);
}
if (virtq->virtq) {
- ret = mlx5_vdpa_virtq_stop(priv, index);
- if (ret)
- DRV_LOG(WARNING, "Failed to stop virtq %d.", index);
+ virtq->enable = 0;
+ if (is_virtq_recvq(virtq->index, priv->nr_virtqs)) {
+ ret = mlx5_vdpa_steer_update(priv);
+ if (ret)
+ DRV_LOG(WARNING, "Failed to disable steering "
+ "for virtq %d.", index);
+ }
mlx5_vdpa_virtq_unset(virtq);
}
if (enable) {
DRV_LOG(ERR, "Failed to setup virtq %d.", index);
return ret;
}
- }
- virtq->enable = !!enable;
- if (is_virtq_recvq(virtq->index, priv->nr_virtqs)) {
- /* Need to add received virtq to the RQT table of the TIRs. */
- ret = mlx5_vdpa_steer_update(priv);
- if (ret) {
- virtq->enable = !enable;
- return ret;
+ virtq->enable = 1;
+ if (is_virtq_recvq(virtq->index, priv->nr_virtqs)) {
+ ret = mlx5_vdpa_steer_update(priv);
+ if (ret)
+ DRV_LOG(WARNING, "Failed to enable steering "
+ "for virtq %d.", index);
}
}
return 0;