mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
net: macb: use context swapping in .ndo_change_mtu()
Use newly introduced context buffer management to implement .ndo_change_mtu() as a context swap: allocate new context -> reconfigure HW -> free old context. This resists memory pressure well by failing without closing the interface and it is much faster by avoiding PHY reinit. AT91 EMAC is handled differently as their buffer management is separate and they don't do NAPI. They cannot land in macb_change_mtu as they use a different ndo struct. We still defensively protect against it in code. Reviewed-by: Nicolai Buchwitz <nb@tipi-net.de> Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com> Link: https://patch.msgid.link/20261013-macb-context-v11-9-b27785167566@bootlin.com Tested-by: Nicolai Buchwitz <nb@tipi-net.de> # RPi CM5 with RP1 GEM Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
dcc3288b94
commit
a98375924d
|
|
@ -3658,11 +3658,29 @@ static int macb_close(struct net_device *netdev)
|
|||
|
||||
static int macb_change_mtu(struct net_device *netdev, int new_mtu)
|
||||
{
|
||||
if (netif_running(netdev))
|
||||
return -EBUSY;
|
||||
struct macb *bp = netdev_priv(netdev);
|
||||
bool running = netif_running(netdev);
|
||||
struct macb_context *new_ctx;
|
||||
|
||||
if (running) {
|
||||
/* Context swapping is not supported for AT91. */
|
||||
if (bp->caps & MACB_CAPS_MACB_IS_EMAC)
|
||||
return -EBUSY;
|
||||
|
||||
new_ctx = macb_context_alloc(bp, new_mtu,
|
||||
bp->configured_rx_ring_size,
|
||||
bp->configured_tx_ring_size);
|
||||
if (IS_ERR(new_ctx))
|
||||
return PTR_ERR(new_ctx);
|
||||
|
||||
macb_context_swap_start(bp);
|
||||
}
|
||||
|
||||
WRITE_ONCE(netdev->mtu, new_mtu);
|
||||
|
||||
if (running)
|
||||
macb_context_swap_end(bp, new_ctx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user