[SRU][J:linux-azure][PATCH 1/2] Revert "net: mana: Improve mana_set_channels() in low mem conditions"

John Cabaj john.cabaj at canonical.com
Tue Nov 18 22:23:59 UTC 2025


BugLink: https://bugs.launchpad.net/bugs/2131828

This reverts commit 827c33e9b0e189acedba4081bff3829a43f9c1b1.

Signed-off-by: John Cabaj <john.cabaj at canonical.com>
---
 drivers/net/ethernet/microsoft/mana/mana_en.c |  6 ++--
 .../ethernet/microsoft/mana/mana_ethtool.c    | 28 +++++++++----------
 include/net/mana/mana.h                       |  2 +-
 3 files changed, 17 insertions(+), 19 deletions(-)

diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c
index 8b3845da6bae3..671e3253180ad 100644
--- a/drivers/net/ethernet/microsoft/mana/mana_en.c
+++ b/drivers/net/ethernet/microsoft/mana/mana_en.c
@@ -659,7 +659,7 @@ static void mana_get_rxbuf_cfg(struct mana_port_context *apc,
 	*alloc_size = buf_size;
 }
 
-int mana_pre_alloc_rxbufs(struct mana_port_context *mpc, int new_mtu, int num_queues)
+int mana_pre_alloc_rxbufs(struct mana_port_context *mpc, int new_mtu)
 {
 	struct device *dev;
 	struct page *page;
@@ -674,7 +674,7 @@ int mana_pre_alloc_rxbufs(struct mana_port_context *mpc, int new_mtu, int num_qu
 
 	dev = mpc->ac->gdma_dev->gdma_context->dev;
 
-	num_rxb = num_queues * mpc->rx_queue_size;
+	num_rxb = mpc->num_queues * mpc->rx_queue_size;
 
 	WARN(mpc->rxbufs_pre, "mana rxbufs_pre exists\n");
 	mpc->rxbufs_pre = kmalloc_array(num_rxb, sizeof(void *), GFP_KERNEL);
@@ -721,7 +721,7 @@ static int mana_change_mtu(struct net_device *ndev, int new_mtu)
 	int err;
 
 	/* Pre-allocate buffers to prevent failure in mana_attach later */
-	err = mana_pre_alloc_rxbufs(mpc, new_mtu, mpc->num_queues);
+	err = mana_pre_alloc_rxbufs(mpc, new_mtu);
 	if (err) {
 		netdev_err(ndev, "Insufficient memory for new MTU\n");
 		return err;
diff --git a/drivers/net/ethernet/microsoft/mana/mana_ethtool.c b/drivers/net/ethernet/microsoft/mana/mana_ethtool.c
index c583f8800e431..a7d5bd81f18cd 100644
--- a/drivers/net/ethernet/microsoft/mana/mana_ethtool.c
+++ b/drivers/net/ethernet/microsoft/mana/mana_ethtool.c
@@ -349,29 +349,27 @@ static int mana_set_channels(struct net_device *ndev,
 	struct mana_port_context *apc = netdev_priv(ndev);
 	unsigned int new_count = channels->combined_count;
 	unsigned int old_count = apc->num_queues;
-	int err;
-
-	err = mana_pre_alloc_rxbufs(apc, ndev->mtu, new_count);
-	if (err) {
-		netdev_err(ndev, "Insufficient memory for new allocations");
-		return err;
-	}
+	int err, err2;
 
 	err = mana_detach(ndev, false);
 	if (err) {
 		netdev_err(ndev, "mana_detach failed: %d\n", err);
-		goto out;
+		return err;
 	}
 
 	apc->num_queues = new_count;
 	err = mana_attach(ndev);
-	if (err) {
-		apc->num_queues = old_count;
-		netdev_err(ndev, "mana_attach failed: %d\n", err);
-	}
+	if (!err)
+		return 0;
+
+	netdev_err(ndev, "mana_attach failed: %d\n", err);
+
+	/* Try to roll it back to the old configuration. */
+	apc->num_queues = old_count;
+	err2 = mana_attach(ndev);
+	if (err2)
+		netdev_err(ndev, "mana re-attach failed: %d\n", err2);
 
-out:
-	mana_pre_dealloc_rxbufs(apc);
 	return err;
 }
 
@@ -416,7 +414,7 @@ static int mana_set_ringparam(struct net_device *ndev,
 
 	/* pre-allocating new buffers to prevent failures in mana_attach() later */
 	apc->rx_queue_size = new_rx;
-	err = mana_pre_alloc_rxbufs(apc, ndev->mtu, apc->num_queues);
+	err = mana_pre_alloc_rxbufs(apc, ndev->mtu);
 	apc->rx_queue_size = old_rx;
 	if (err) {
 		netdev_err(ndev, "Insufficient memory for new allocations\n");
diff --git a/include/net/mana/mana.h b/include/net/mana/mana.h
index 8cfd103de0226..dfc929f0b8c6e 100644
--- a/include/net/mana/mana.h
+++ b/include/net/mana/mana.h
@@ -540,7 +540,7 @@ u32 mana_run_xdp(struct net_device *ndev, struct mana_rxq *rxq,
 struct bpf_prog *mana_xdp_get(struct mana_port_context *apc);
 void mana_chn_setxdp(struct mana_port_context *apc, struct bpf_prog *prog);
 int mana_bpf(struct net_device *ndev, struct netdev_bpf *bpf);
-int mana_pre_alloc_rxbufs(struct mana_port_context *apc, int mtu, int num_queues);
+int mana_pre_alloc_rxbufs(struct mana_port_context *apc, int mtu);
 void mana_query_phy_stats(struct mana_port_context *apc);
 void mana_pre_dealloc_rxbufs(struct mana_port_context *apc);
 void mana_query_gf_stats(struct mana_port_context *apc);
-- 
2.43.0




More information about the kernel-team mailing list