]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net/mlx5e: Replace recursive VLAN push handling with an iterative loop
authorGal Pressman <gal@nvidia.com>
Tue, 8 Jul 2025 21:16:25 +0000 (00:16 +0300)
committerJakub Kicinski <kuba@kernel.org>
Thu, 10 Jul 2025 02:47:43 +0000 (19:47 -0700)
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>
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/vlan.c

index a13c5e707b83cfe62593cae080a3b880172fb6b8..9bdb5820c55383aead1cd0d049f591ddbcb31797 100644 (file)
@@ -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