net/mlx5: fix green meter policy RSS queues
authorBing Zhao <bingz@nvidia.com>
Thu, 29 Jul 2021 16:04:04 +0000 (19:04 +0300)
committerRaslan Darawsheh <rasland@nvidia.com>
Thu, 29 Jul 2021 20:06:42 +0000 (22:06 +0200)
Both green policy and yellow policy could support RSS actions
simultaneous, the Rx queues configuration may be different between
them while the other fields should be the same.

When the only green color policy was supported in the past, the
queues copied and saved in the temporary workspace were used. Since
the yellow support was added, the queues stored in the thread
workspace would be overwritten by the yellow color policy. The flow
rule created using a meter with such a policy would have the same
RSS distribution for both green and yellow packets.

By using the meter action containers RSS information instead of the
workspace RSS, this overwritten can be prevented.

Fixes: b38a12272b3a ("net/mlx5: split meter color policy handling")

Signed-off-by: Bing Zhao <bingz@nvidia.com>
Acked-by: Matan Azrad <matan@nvidia.com>
drivers/net/mlx5/mlx5_flow.c

index f7f1688..0689e6d 100644 (file)
@@ -4710,7 +4710,7 @@ get_meter_sub_policy(struct rte_eth_dev *dev,
                        uint8_t fate = final_policy->act_cnt[i].fate_action;
 
                        if (fate == MLX5_FLOW_FATE_SHARED_RSS) {
-                               const void *rss_act =
+                               const struct rte_flow_action_rss *rss_act =
                                        final_policy->act_cnt[i].rss->conf;
                                struct rte_flow_action rss_actions[2] = {
                                        [0] = {
@@ -4746,6 +4746,9 @@ get_meter_sub_policy(struct rte_eth_dev *dev,
                                rss_desc_v[i].tunnel =
                                                !!(dev_flow.handle->layers &
                                                   MLX5_FLOW_LAYER_TUNNEL);
+                               /* Use the RSS queues in the containers. */
+                               rss_desc_v[i].queue =
+                                       (uint16_t *)(uintptr_t)rss_act->queue;
                                rss_desc[i] = &rss_desc_v[i];
                        } else if (fate == MLX5_FLOW_FATE_QUEUE) {
                                /* This is queue action. */