Commit ebcb0840 authored by Tariq Toukan's avatar Tariq Toukan Committed by Greg Kroah-Hartman

net/mlx4_en: Fix wrong limitation for number of TX rings

[ Upstream commit 2744bf42 ]

XDP_TX rings should not be limited by max_num_tx_rings_p_up.
To make sure total number of TX rings never exceed MAX_TX_RINGS,
add similar check in mlx4_en_alloc_tx_queue_per_tc(), where
a new value is assigned for num_up.

Fixes: 7e1dc5e9 ("net/mlx4_en: Limit the number of TX rings")
Signed-off-by: default avatarTariq Toukan <tariqt@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 5408138d
...@@ -1812,6 +1812,7 @@ static int mlx4_en_set_channels(struct net_device *dev, ...@@ -1812,6 +1812,7 @@ static int mlx4_en_set_channels(struct net_device *dev,
struct mlx4_en_dev *mdev = priv->mdev; struct mlx4_en_dev *mdev = priv->mdev;
struct mlx4_en_port_profile new_prof; struct mlx4_en_port_profile new_prof;
struct mlx4_en_priv *tmp; struct mlx4_en_priv *tmp;
int total_tx_count;
int port_up = 0; int port_up = 0;
int xdp_count; int xdp_count;
int err = 0; int err = 0;
...@@ -1826,13 +1827,12 @@ static int mlx4_en_set_channels(struct net_device *dev, ...@@ -1826,13 +1827,12 @@ static int mlx4_en_set_channels(struct net_device *dev,
mutex_lock(&mdev->state_lock); mutex_lock(&mdev->state_lock);
xdp_count = priv->tx_ring_num[TX_XDP] ? channel->rx_count : 0; xdp_count = priv->tx_ring_num[TX_XDP] ? channel->rx_count : 0;
if (channel->tx_count * priv->prof->num_up + xdp_count > total_tx_count = channel->tx_count * priv->prof->num_up + xdp_count;
priv->mdev->profile.max_num_tx_rings_p_up * priv->prof->num_up) { if (total_tx_count > MAX_TX_RINGS) {
err = -EINVAL; err = -EINVAL;
en_err(priv, en_err(priv,
"Total number of TX and XDP rings (%d) exceeds the maximum supported (%d)\n", "Total number of TX and XDP rings (%d) exceeds the maximum supported (%d)\n",
channel->tx_count * priv->prof->num_up + xdp_count, total_tx_count, MAX_TX_RINGS);
MAX_TX_RINGS);
goto out; goto out;
} }
......
...@@ -92,6 +92,7 @@ int mlx4_en_alloc_tx_queue_per_tc(struct net_device *dev, u8 tc) ...@@ -92,6 +92,7 @@ int mlx4_en_alloc_tx_queue_per_tc(struct net_device *dev, u8 tc)
struct mlx4_en_dev *mdev = priv->mdev; struct mlx4_en_dev *mdev = priv->mdev;
struct mlx4_en_port_profile new_prof; struct mlx4_en_port_profile new_prof;
struct mlx4_en_priv *tmp; struct mlx4_en_priv *tmp;
int total_count;
int port_up = 0; int port_up = 0;
int err = 0; int err = 0;
...@@ -105,6 +106,14 @@ int mlx4_en_alloc_tx_queue_per_tc(struct net_device *dev, u8 tc) ...@@ -105,6 +106,14 @@ int mlx4_en_alloc_tx_queue_per_tc(struct net_device *dev, u8 tc)
MLX4_EN_NUM_UP_HIGH; MLX4_EN_NUM_UP_HIGH;
new_prof.tx_ring_num[TX] = new_prof.num_tx_rings_p_up * new_prof.tx_ring_num[TX] = new_prof.num_tx_rings_p_up *
new_prof.num_up; new_prof.num_up;
total_count = new_prof.tx_ring_num[TX] + new_prof.tx_ring_num[TX_XDP];
if (total_count > MAX_TX_RINGS) {
err = -EINVAL;
en_err(priv,
"Total number of TX and XDP rings (%d) exceeds the maximum supported (%d)\n",
total_count, MAX_TX_RINGS);
goto out;
}
err = mlx4_en_try_alloc_resources(priv, tmp, &new_prof, true); err = mlx4_en_try_alloc_resources(priv, tmp, &new_prof, true);
if (err) if (err)
goto out; goto out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment