mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
net/mlx4_en: Fix wrong limitation for number of TX rings
[ Upstream commit2744bf4268] 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:7e1dc5e926("net/mlx4_en: Limit the number of TX rings") Signed-off-by: Tariq Toukan <tariqt@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
5408138df1
commit
ebcb0840a7
@@ -1812,6 +1812,7 @@ static int mlx4_en_set_channels(struct net_device *dev,
|
||||
struct mlx4_en_dev *mdev = priv->mdev;
|
||||
struct mlx4_en_port_profile new_prof;
|
||||
struct mlx4_en_priv *tmp;
|
||||
int total_tx_count;
|
||||
int port_up = 0;
|
||||
int xdp_count;
|
||||
int err = 0;
|
||||
@@ -1826,13 +1827,12 @@ static int mlx4_en_set_channels(struct net_device *dev,
|
||||
|
||||
mutex_lock(&mdev->state_lock);
|
||||
xdp_count = priv->tx_ring_num[TX_XDP] ? channel->rx_count : 0;
|
||||
if (channel->tx_count * priv->prof->num_up + xdp_count >
|
||||
priv->mdev->profile.max_num_tx_rings_p_up * priv->prof->num_up) {
|
||||
total_tx_count = channel->tx_count * priv->prof->num_up + xdp_count;
|
||||
if (total_tx_count > MAX_TX_RINGS) {
|
||||
err = -EINVAL;
|
||||
en_err(priv,
|
||||
"Total number of TX and XDP rings (%d) exceeds the maximum supported (%d)\n",
|
||||
channel->tx_count * priv->prof->num_up + xdp_count,
|
||||
MAX_TX_RINGS);
|
||||
total_tx_count, MAX_TX_RINGS);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
@@ -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_port_profile new_prof;
|
||||
struct mlx4_en_priv *tmp;
|
||||
int total_count;
|
||||
int port_up = 0;
|
||||
int err = 0;
|
||||
|
||||
@@ -105,6 +106,14 @@ int mlx4_en_alloc_tx_queue_per_tc(struct net_device *dev, u8 tc)
|
||||
MLX4_EN_NUM_UP_HIGH;
|
||||
new_prof.tx_ring_num[TX] = new_prof.num_tx_rings_p_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);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
Reference in New Issue
Block a user