The mlx5 PMD probes the Verbs flow priorities supported with
ibv_create_flow() function. If rdma-core or kernel fails for
some reason, the returned error causes the drop queue is not
destroyed, and pd is locked by not freed resource.

Also the mlx5_flow_discover_priorities() returned negative value
as error, and this code was reported "as is", without sign
changing (eventually causing assert(err > 0)).

Fixes: 2815702baea7 ("net/mlx5: replace verbs priorities by flow")
Cc: sta...@dpdk.org

Signed-off-by: Viacheslav Ovsiienko <viachesl...@mellanox.com>
---
 drivers/net/mlx5/mlx5.c      | 4 +++-
 drivers/net/mlx5/mlx5_flow.c | 4 ++--
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index df71707..6679676 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -1243,8 +1243,10 @@
        priv->config = config;
        /* Supported Verbs flow priority number detection. */
        err = mlx5_flow_discover_priorities(eth_dev);
-       if (err < 0)
+       if (err < 0) {
+               err = -err;
                goto error;
+       }
        priv->config.flow_prio = err;
        /*
         * Once the device is added to the list of memory event
diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
index 11213e2..97af57b 100644
--- a/drivers/net/mlx5/mlx5_flow.c
+++ b/drivers/net/mlx5/mlx5_flow.c
@@ -350,6 +350,7 @@ struct mlx5_flow_tunnel_info {
                claim_zero(mlx5_glue->destroy_flow(flow));
                priority = vprio[i];
        }
+       mlx5_hrxq_drop_release(dev);
        switch (priority) {
        case 8:
                priority = RTE_DIM(priority_map_3);
@@ -361,10 +362,9 @@ struct mlx5_flow_tunnel_info {
                rte_errno = ENOTSUP;
                DRV_LOG(ERR,
                        "port %u verbs maximum priority: %d expected 8/16",
-                       dev->data->port_id, vprio[i]);
+                       dev->data->port_id, priority);
                return -rte_errno;
        }
-       mlx5_hrxq_drop_release(dev);
        DRV_LOG(INFO, "port %u flow maximum priority: %d",
                dev->data->port_id, priority);
        return priority;
-- 
1.8.3.1

Reply via email to