Commit c0ca344d authored by Gal Pressman's avatar Gal Pressman Committed by Jakub Kicinski
Browse files

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: default avatarGal Pressman <gal@nvidia.com>
Reviewed-by: default avatarCosmin Ratiu <cratiu@nvidia.com>
Signed-off-by: default avatarTariq Toukan <tariqt@nvidia.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Link: https://patch.msgid.link/1752009387-13300-4-git-send-email-tariqt@nvidia.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 122d86aa
Loading
Loading
Loading
Loading
+22 −21
Original line number Diff line number Diff line
@@ -94,6 +94,7 @@ mlx5e_tc_act_vlan_add_push_action(struct mlx5e_priv *priv,
				  struct net_device **out_dev,
				  struct netlink_ext_ack *extack)
{
	do {
		struct net_device *vlan_dev = *out_dev;
		struct flow_action_entry vlan_act = {
			.id = FLOW_ACTION_VLAN_PUSH,
@@ -103,20 +104,20 @@ mlx5e_tc_act_vlan_add_push_action(struct mlx5e_priv *priv,
		};
		int err;

	err = parse_tc_vlan_action(priv, &vlan_act, attr->esw_attr, &attr->action, extack, NULL);
		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));
		*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));

	if (is_vlan_dev(*out_dev))
		err = mlx5e_tc_act_vlan_add_push_action(priv, attr, out_dev, extack);

	return err;
	return 0;
}

int