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

Reply via email to