[dpdk-dev] [PATCH] vdpa/mlx5: fix steering update in virtq unset

Matan Azrad matan at mellanox.com
Mon Jul 27 10:07:59 CEST 2020


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: 9f09b1ca15c5 ("vdpa/mlx5: recreate a virtq becoming enabled")
Cc: stable at dpdk.org

Signed-off-by: Xueming Li <xuemingl at mellanox.com>
Signed-off-by: Matan Azrad <matan at mellanox.com>
---
 drivers/vdpa/mlx5/mlx5_vdpa_virtq.c | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/drivers/vdpa/mlx5/mlx5_vdpa_virtq.c b/drivers/vdpa/mlx5/mlx5_vdpa_virtq.c
index 3e61264..19554f6 100644
--- a/drivers/vdpa/mlx5/mlx5_vdpa_virtq.c
+++ b/drivers/vdpa/mlx5/mlx5_vdpa_virtq.c
@@ -482,6 +482,13 @@
 		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 @@
 			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;
-- 
1.8.3.1



More information about the dev mailing list