vdpa/mlx5: fix steering update in virtq unset

When a virtq is destroyed by the driver, it must be removed from the
steering RQT which holds its reference.

The driver didn't remove the virtq from RQT before destroying it what
caused HW syndrome in virtq unset.

Remove the virtq from RQT before destroying it.

Fixes: 9f09b1ca15 ("vdpa/mlx5: recreate a virtq becoming enabled")
Cc: stable@dpdk.org

Signed-off-by: Xueming Li <xuemingl@mellanox.com>
Signed-off-by: Matan Azrad <matan@mellanox.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
This commit is contained in:
Matan Azrad 2020-07-27 08:07:59 +00:00 committed by Ferruh Yigit
parent 251691f107
commit d2a58c2402

View File

@ -482,6 +482,13 @@ mlx5_vdpa_virtq_enable(struct mlx5_vdpa_priv *priv, int index, int enable)
DRV_LOG(INFO, "Virtq %d was modified, recreate it.", index);
}
if (virtq->virtq) {
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);
}
ret = mlx5_vdpa_virtq_stop(priv, index);
if (ret)
DRV_LOG(WARNING, "Failed to stop virtq %d.", index);
@ -493,14 +500,12 @@ mlx5_vdpa_virtq_enable(struct mlx5_vdpa_priv *priv, int index, int 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;