mlx5_vdpa_steer_update() calls mlx5_vdpa_rss_flows_create() which, on
failure, leaves behind any RSS steering objects (matcher, TIR, TIR
action, flow) it managed to create before the error, relying on the
caller to release them.
mlx5_vdpa_steer_setup() honors that contract by calling
mlx5_vdpa_steer_unset() on its error path, but mlx5_vdpa_virtq_enable()
only logs a warning and continues when mlx5_vdpa_steer_update() fails.
As a result, every failed steering update triggered from the virtq
enable/disable path leaks the partially created software-steering
objects. Over many reconfiguration cycles this exhausts the kernel
software-steering (DR) resources and later probes fail with
"Failed to create Rx domain".
Free the partial RSS flows in mlx5_vdpa_steer_update() itself so that
all callers are covered regardless of how they handle the return value.
mlx5_vdpa_rss_flows_destroy() checks each object for NULL, so the
subsequent steer_unset() on the steer_setup() error path stays a safe
no-op.
Fixes: 9f09b1ca15c5 ("vdpa/mlx5: recreate a virtq becoming enabled")
Cc: [email protected]
Signed-off-by: Maayan Kashani <[email protected]>
Acked-by: Dariusz Sosnowski <[email protected]>
---
drivers/vdpa/mlx5/mlx5_vdpa_steer.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/vdpa/mlx5/mlx5_vdpa_steer.c
b/drivers/vdpa/mlx5/mlx5_vdpa_steer.c
index c2e0a17ace2..b1bca7f0f7d 100644
--- a/drivers/vdpa/mlx5/mlx5_vdpa_steer.c
+++ b/drivers/vdpa/mlx5/mlx5_vdpa_steer.c
@@ -255,6 +255,7 @@ mlx5_vdpa_steer_update(struct mlx5_vdpa_priv *priv, bool
is_dummy)
ret = mlx5_vdpa_rss_flows_create(priv);
if (ret) {
DRV_LOG(ERR, "Cannot create RSS flows.");
+ mlx5_vdpa_rss_flows_destroy(priv);
pthread_mutex_unlock(&priv->steer_update_lock);
return -1;
}
--
2.25.1