Commit d515f38c authored by Leon Romanovsky's avatar Leon Romanovsky Committed by Jakub Kicinski
Browse files

net/mlx5e: Allocate flow steering storage during uplink initialization



IPsec code relies on valid priv->fs pointer that is the case in NIC
flow, but not correct in uplink. Before commit that mentioned in the
Fixes line, that pointer was valid in all flows as it was allocated
together with priv struct.

In addition, the cleanup representors routine called to that
not-initialized priv->fs pointer and its internals which caused NULL
deference.

So, move FS allocation to be as early as possible.

Fixes: af8bbf73 ("net/mlx5e: Convert mlx5e_flow_steering member of mlx5e_priv to pointer")
Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
Link: https://lore.kernel.org/r/ae46fa5bed3c67f937bfdfc0370101278f5422f1.1660639564.git.leonro@nvidia.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 5b6a0729
Loading
Loading
Loading
Loading
+17 −8
Original line number Diff line number Diff line
@@ -696,6 +696,13 @@ static int mlx5e_init_rep(struct mlx5_core_dev *mdev,
{
	struct mlx5e_priv *priv = netdev_priv(netdev);

	priv->fs = mlx5e_fs_init(priv->profile, mdev,
				 !test_bit(MLX5E_STATE_DESTROYING, &priv->state));
	if (!priv->fs) {
		netdev_err(priv->netdev, "FS allocation failed\n");
		return -ENOMEM;
	}

	mlx5e_build_rep_params(netdev);
	mlx5e_timestamp_init(priv);

@@ -708,12 +715,21 @@ static int mlx5e_init_ul_rep(struct mlx5_core_dev *mdev,
	struct mlx5e_priv *priv = netdev_priv(netdev);
	int err;

	priv->fs = mlx5e_fs_init(priv->profile, mdev,
				 !test_bit(MLX5E_STATE_DESTROYING, &priv->state));
	if (!priv->fs) {
		netdev_err(priv->netdev, "FS allocation failed\n");
		return -ENOMEM;
	}

	err = mlx5e_ipsec_init(priv);
	if (err)
		mlx5_core_err(mdev, "Uplink rep IPsec initialization failed, %d\n", err);

	mlx5e_vxlan_set_netdev_info(priv);
	return mlx5e_init_rep(mdev, netdev);
	mlx5e_build_rep_params(netdev);
	mlx5e_timestamp_init(priv);
	return 0;
}

static void mlx5e_cleanup_rep(struct mlx5e_priv *priv)
@@ -836,13 +852,6 @@ static int mlx5e_init_rep_rx(struct mlx5e_priv *priv)
	struct mlx5_core_dev *mdev = priv->mdev;
	int err;

	priv->fs = mlx5e_fs_init(priv->profile, mdev,
				 !test_bit(MLX5E_STATE_DESTROYING, &priv->state));
	if (!priv->fs) {
		netdev_err(priv->netdev, "FS allocation failed\n");
		return -ENOMEM;
	}

	priv->rx_res = mlx5e_rx_res_alloc();
	if (!priv->rx_res) {
		err = -ENOMEM;