Thomas Bogendoerfer 8072fe
From: Tariq Toukan <tariqt@mellanox.com>
Thomas Bogendoerfer 8072fe
Date: Mon, 18 Nov 2019 11:41:04 +0200
Thomas Bogendoerfer 8072fe
Subject: net/mlx4_en: Fix wrong limitation for number of TX rings
Thomas Bogendoerfer 8072fe
Patch-mainline: v5.4
Thomas Bogendoerfer 8072fe
Git-commit: 2744bf42680f64ebf2ee8a00354897857c073331
Thomas Bogendoerfer 8072fe
References: bsc#1103989 FATE#326004
Thomas Bogendoerfer 8072fe
Thomas Bogendoerfer 8072fe
XDP_TX rings should not be limited by max_num_tx_rings_p_up.
Thomas Bogendoerfer 8072fe
To make sure total number of TX rings never exceed MAX_TX_RINGS,
Thomas Bogendoerfer 8072fe
add similar check in mlx4_en_alloc_tx_queue_per_tc(), where
Thomas Bogendoerfer 8072fe
a new value is assigned for num_up.
Thomas Bogendoerfer 8072fe
Thomas Bogendoerfer 8072fe
Fixes: 7e1dc5e926d5 ("net/mlx4_en: Limit the number of TX rings")
Thomas Bogendoerfer 8072fe
Signed-off-by: Tariq Toukan <tariqt@mellanox.com>
Thomas Bogendoerfer 8072fe
Signed-off-by: David S. Miller <davem@davemloft.net>
Thomas Bogendoerfer 8072fe
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
Thomas Bogendoerfer 8072fe
---
Thomas Bogendoerfer 8072fe
 drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |    8 ++++----
Thomas Bogendoerfer 8072fe
 drivers/net/ethernet/mellanox/mlx4/en_netdev.c  |    9 +++++++++
Thomas Bogendoerfer 8072fe
 2 files changed, 13 insertions(+), 4 deletions(-)
Thomas Bogendoerfer 8072fe
Thomas Bogendoerfer 8072fe
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
Thomas Bogendoerfer 8072fe
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
Thomas Bogendoerfer 8072fe
@@ -1811,6 +1811,7 @@ static int mlx4_en_set_channels(struct n
Thomas Bogendoerfer 8072fe
 	struct mlx4_en_dev *mdev = priv->mdev;
Thomas Bogendoerfer 8072fe
 	struct mlx4_en_port_profile new_prof;
Thomas Bogendoerfer 8072fe
 	struct mlx4_en_priv *tmp;
Thomas Bogendoerfer 8072fe
+	int total_tx_count;
Thomas Bogendoerfer 8072fe
 	int port_up = 0;
Thomas Bogendoerfer 8072fe
 	int xdp_count;
Thomas Bogendoerfer 8072fe
 	int err = 0;
Thomas Bogendoerfer 8072fe
@@ -1825,13 +1826,12 @@ static int mlx4_en_set_channels(struct n
Thomas Bogendoerfer 8072fe
 
Thomas Bogendoerfer 8072fe
 	mutex_lock(&mdev->state_lock);
Thomas Bogendoerfer 8072fe
 	xdp_count = priv->tx_ring_num[TX_XDP] ? channel->rx_count : 0;
Thomas Bogendoerfer 8072fe
-	if (channel->tx_count * priv->prof->num_up + xdp_count >
Thomas Bogendoerfer 8072fe
-	    priv->mdev->profile.max_num_tx_rings_p_up * priv->prof->num_up) {
Thomas Bogendoerfer 8072fe
+	total_tx_count = channel->tx_count * priv->prof->num_up + xdp_count;
Thomas Bogendoerfer 8072fe
+	if (total_tx_count > MAX_TX_RINGS) {
Thomas Bogendoerfer 8072fe
 		err = -EINVAL;
Thomas Bogendoerfer 8072fe
 		en_err(priv,
Thomas Bogendoerfer 8072fe
 		       "Total number of TX and XDP rings (%d) exceeds the maximum supported (%d)\n",
Thomas Bogendoerfer 8072fe
-		       channel->tx_count * priv->prof->num_up  + xdp_count,
Thomas Bogendoerfer 8072fe
-		       MAX_TX_RINGS);
Thomas Bogendoerfer 8072fe
+		       total_tx_count, MAX_TX_RINGS);
Thomas Bogendoerfer 8072fe
 		goto out;
Thomas Bogendoerfer 8072fe
 	}
Thomas Bogendoerfer 8072fe
 
Thomas Bogendoerfer 8072fe
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
Thomas Bogendoerfer 8072fe
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
Thomas Bogendoerfer 8072fe
@@ -91,6 +91,7 @@ int mlx4_en_alloc_tx_queue_per_tc(struct
Thomas Bogendoerfer 8072fe
 	struct mlx4_en_dev *mdev = priv->mdev;
Thomas Bogendoerfer 8072fe
 	struct mlx4_en_port_profile new_prof;
Thomas Bogendoerfer 8072fe
 	struct mlx4_en_priv *tmp;
Thomas Bogendoerfer 8072fe
+	int total_count;
Thomas Bogendoerfer 8072fe
 	int port_up = 0;
Thomas Bogendoerfer 8072fe
 	int err = 0;
Thomas Bogendoerfer 8072fe
 
Thomas Bogendoerfer 8072fe
@@ -104,6 +105,14 @@ int mlx4_en_alloc_tx_queue_per_tc(struct
Thomas Bogendoerfer 8072fe
 				      MLX4_EN_NUM_UP_HIGH;
Thomas Bogendoerfer 8072fe
 	new_prof.tx_ring_num[TX] = new_prof.num_tx_rings_p_up *
Thomas Bogendoerfer 8072fe
 				   new_prof.num_up;
Thomas Bogendoerfer 8072fe
+	total_count = new_prof.tx_ring_num[TX] + new_prof.tx_ring_num[TX_XDP];
Thomas Bogendoerfer 8072fe
+	if (total_count > MAX_TX_RINGS) {
Thomas Bogendoerfer 8072fe
+		err = -EINVAL;
Thomas Bogendoerfer 8072fe
+		en_err(priv,
Thomas Bogendoerfer 8072fe
+		       "Total number of TX and XDP rings (%d) exceeds the maximum supported (%d)\n",
Thomas Bogendoerfer 8072fe
+		       total_count, MAX_TX_RINGS);
Thomas Bogendoerfer 8072fe
+		goto out;
Thomas Bogendoerfer 8072fe
+	}
Thomas Bogendoerfer 8072fe
 	err = mlx4_en_try_alloc_resources(priv, tmp, &new_prof, true);
Thomas Bogendoerfer 8072fe
 	if (err)
Thomas Bogendoerfer 8072fe
 		goto out;