]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net/mlx4_en: Fix wrong limitation for number of TX rings
authorTariq Toukan <tariqt@mellanox.com>
Mon, 18 Nov 2019 09:41:04 +0000 (11:41 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 29 Nov 2019 09:07:32 +0000 (10:07 +0100)
[ Upstream commit 2744bf42680f64ebf2ee8a00354897857c073331 ]

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: 7e1dc5e926d5 ("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>
drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
drivers/net/ethernet/mellanox/mlx4/en_netdev.c

index 949ec70b6c13c816f5af2ddcdfda13740f62d503..e639a365ac2d4333a667c1be4b69c6b459c0df3b 100644 (file)
@@ -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;
        }
 
index c1438ae52a11922a79b281937f5d6bb5a7b4ca3b..ba4f195a36d6e58a04341deacf7a4e46d0f8cc18 100644 (file)
@@ -91,6 +91,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;
 
@@ -104,6 +105,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;