]> git.droids-corp.org - dpdk.git/commitdiff
net/mlx5: fix keeping indirect RSS non-isolated mode
authorDmitry Kozlyuk <dkozlyuk@nvidia.com>
Tue, 16 Nov 2021 07:38:34 +0000 (09:38 +0200)
committerRaslan Darawsheh <rasland@nvidia.com>
Tue, 16 Nov 2021 13:05:35 +0000 (14:05 +0100)
When a port starts in non-isolated mode,
an internal indirect RSS is created that includes all configured queues
and a flow rule is created that references this indirect RSS.
If before switching to non-isolated mode an indirect RSS was created
that includes the same set of queues, it would be reused at this point.
However, because the port had been stopped (or not yet started),
the TIR for this indirect RSS had been destroyed (or not yet created).
The flow rule could not be created and the port start failed.

Creation of TIRs is moved before configuring non-isolated mode flows,
but it is not enough because of the following issue.

Commit 0cedf34da78f ("net/mlx5: move Rx queue reference count")
changed mlx5_rxq_get() not to increment RxQ control structure
reference count, mlx5_rxq_ref() was introduced for this purpose.
mlx5_ind_table_obj_attach() was not updated to use the new function,
so when the port was stopped, the control structure reference count
of an RxQ used in RSS reached zero and the structure was destroyed.

Use mlx5_rxq_ref() to keep RxQ control structure
needed for indirect RSS persistence across port restart.

Fixes: ec4e11d41d12 ("net/mlx5: preserve indirect actions on restart")
Fixes: 0cedf34da78f ("net/mlx5: move Rx queue reference count")
Cc: stable@dpdk.org
Signed-off-by: Dmitry Kozlyuk <dkozlyuk@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
drivers/net/mlx5/mlx5_rxq.c
drivers/net/mlx5/mlx5_trigger.c

index 61ef4edff0aa6a8581da4a6bb433ea013726de3f..480f4f9f07c9032b6993cd00c0da496ecc565e8e 100644 (file)
@@ -2439,7 +2439,7 @@ mlx5_ind_table_obj_attach(struct rte_eth_dev *dev,
                return ret;
        }
        for (i = 0; i < ind_tbl->queues_n; i++)
-               mlx5_rxq_get(dev, ind_tbl->queues[i]);
+               mlx5_rxq_ref(dev, ind_tbl->queues[i]);
        return 0;
 }
 
index 1952d684449a3003e320c67b8eeb2c77884f5a9e..65caa5ac14d51e81ee59317ea24bac922f0f1909 100644 (file)
@@ -1172,6 +1172,17 @@ mlx5_dev_start(struct rte_eth_dev *dev)
                goto error;
        }
        mlx5_os_stats_init(dev);
+       /*
+        * Attach indirection table objects detached on port stop.
+        * They may be needed to create RSS in non-isolated mode.
+        */
+       ret = mlx5_action_handle_attach(dev);
+       if (ret) {
+               DRV_LOG(ERR,
+                       "port %u failed to attach indirect actions: %s",
+                       dev->data->port_id, rte_strerror(rte_errno));
+               goto error;
+       }
        ret = mlx5_traffic_enable(dev);
        if (ret) {
                DRV_LOG(ERR, "port %u failed to set defaults flows",
@@ -1184,14 +1195,6 @@ mlx5_dev_start(struct rte_eth_dev *dev)
        mlx5_rxq_timestamp_set(dev);
        /* Set a mask and offset of scheduling on timestamp into Tx queues. */
        mlx5_txq_dynf_timestamp_set(dev);
-       /* Attach indirection table objects detached on port stop. */
-       ret = mlx5_action_handle_attach(dev);
-       if (ret) {
-               DRV_LOG(ERR,
-                       "port %u failed to attach indirect actions: %s",
-                       dev->data->port_id, rte_strerror(rte_errno));
-               goto error;
-       }
        /*
         * In non-cached mode, it only needs to start the default mreg copy
         * action and no flow created by application exists anymore.