90 lines
2.8 KiB
Diff
90 lines
2.8 KiB
Diff
From d0850dc98029f973ea0cdf275fb32cf5758aedb7 Mon Sep 17 00:00:00 2001
|
|
From: Kamal Heib <kheib@redhat.com>
|
|
Date: Thu, 16 Apr 2026 18:03:21 -0400
|
|
Subject: [PATCH] net/mlx5e: Replace recursive VLAN push handling with an
|
|
iterative loop
|
|
|
|
JIRA: https://redhat.atlassian.net/browse/RHEL-169055
|
|
|
|
commit c0ca344d796cf00c169f63f09eea0f4905778be1
|
|
Author: Gal Pressman <gal@nvidia.com>
|
|
Date: Wed Jul 9 00:16:25 2025 +0300
|
|
|
|
net/mlx5e: Replace recursive VLAN push handling with an iterative loop
|
|
|
|
mlx5e_tc_act_vlan_add_push_action() uses tail-recursion to walk through
|
|
a stack of VLAN devices.
|
|
|
|
There is no need for a complicated recursion with unnecessary stack
|
|
consumption and less obvious code flow, rewrite the function so that it
|
|
uses a do while loop instead.
|
|
|
|
Signed-off-by: Gal Pressman <gal@nvidia.com>
|
|
Reviewed-by: Cosmin Ratiu <cratiu@nvidia.com>
|
|
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
|
|
Reviewed-by: Simon Horman <horms@kernel.org>
|
|
Link: https://patch.msgid.link/1752009387-13300-4-git-send-email-tariqt@nvidia.com
|
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
|
|
Signed-off-by: Kamal Heib <kheib@redhat.com>
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/vlan.c b/drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/vlan.c
|
|
index a13c5e707b83..9bdb5820c553 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/vlan.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/vlan.c
|
|
@@ -94,29 +94,30 @@ mlx5e_tc_act_vlan_add_push_action(struct mlx5e_priv *priv,
|
|
struct net_device **out_dev,
|
|
struct netlink_ext_ack *extack)
|
|
{
|
|
- struct net_device *vlan_dev = *out_dev;
|
|
- struct flow_action_entry vlan_act = {
|
|
- .id = FLOW_ACTION_VLAN_PUSH,
|
|
- .vlan.vid = vlan_dev_vlan_id(vlan_dev),
|
|
- .vlan.proto = vlan_dev_vlan_proto(vlan_dev),
|
|
- .vlan.prio = 0,
|
|
- };
|
|
- int err;
|
|
-
|
|
- err = parse_tc_vlan_action(priv, &vlan_act, attr->esw_attr, &attr->action, extack, NULL);
|
|
- if (err)
|
|
- return err;
|
|
-
|
|
- rcu_read_lock();
|
|
- *out_dev = dev_get_by_index_rcu(dev_net(vlan_dev), dev_get_iflink(vlan_dev));
|
|
- rcu_read_unlock();
|
|
- if (!*out_dev)
|
|
- return -ENODEV;
|
|
+ do {
|
|
+ struct net_device *vlan_dev = *out_dev;
|
|
+ struct flow_action_entry vlan_act = {
|
|
+ .id = FLOW_ACTION_VLAN_PUSH,
|
|
+ .vlan.vid = vlan_dev_vlan_id(vlan_dev),
|
|
+ .vlan.proto = vlan_dev_vlan_proto(vlan_dev),
|
|
+ .vlan.prio = 0,
|
|
+ };
|
|
+ int err;
|
|
+
|
|
+ err = parse_tc_vlan_action(priv, &vlan_act, attr->esw_attr,
|
|
+ &attr->action, extack, NULL);
|
|
+ if (err)
|
|
+ return err;
|
|
|
|
- if (is_vlan_dev(*out_dev))
|
|
- err = mlx5e_tc_act_vlan_add_push_action(priv, attr, out_dev, extack);
|
|
+ rcu_read_lock();
|
|
+ *out_dev = dev_get_by_index_rcu(dev_net(vlan_dev),
|
|
+ dev_get_iflink(vlan_dev));
|
|
+ rcu_read_unlock();
|
|
+ if (!*out_dev)
|
|
+ return -ENODEV;
|
|
+ } while (is_vlan_dev(*out_dev));
|
|
|
|
- return err;
|
|
+ return 0;
|
|
}
|
|
|
|
int
|
|
--
|
|
2.50.1 (Apple Git-155)
|
|
|