[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