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 <bi...@nvidia.com>
Acked-by: Matan Azrad <ma...@nvidia.com>
---
 drivers/net/mlx5/mlx5_flow.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
index f7f16883cd..0689e6d45d 100644
--- a/drivers/net/mlx5/mlx5_flow.c
+++ b/drivers/net/mlx5/mlx5_flow.c
@@ -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. */
-- 
2.27.0

Reply via email to