From: "Théo Lebrun" <theo.lebrun@bootlin.com>
To: "Théo Lebrun" <theo.lebrun@bootlin.com>,
"Conor Dooley" <conor.dooley@microchip.com>,
"Andrew Lunn" <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
"Eric Dumazet" <edumazet@google.com>,
"Jakub Kicinski" <kuba@kernel.org>,
"Paolo Abeni" <pabeni@redhat.com>,
"Richard Cochran" <richardcochran@gmail.com>,
"Russell King" <linux@armlinux.org.uk>
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
"Nicolas Ferre" <nicolas.ferre@microchip.com>,
"Claudiu Beznea" <claudiu.beznea@tuxon.dev>,
"Paolo Valerio" <pvalerio@redhat.com>,
"Nicolai Buchwitz" <nb@tipi-net.de>,
"Vladimir Kondratiev" <vladimir.kondratiev@mobileye.com>,
"Gregory CLEMENT" <gregory.clement@bootlin.com>,
"Benoît Monin" <benoit.monin@bootlin.com>,
"Tawfik Bayouk" <tawfik.bayouk@mobileye.com>,
"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
"Maxime Chevallier" <maxime.chevallier@bootlin.com>
Subject: Re: [PATCH net-next v8 17/17] net: macb: use context swapping in .ndo_change_mtu()
Date: Fri, 07 Aug 2026 18:11:06 +0200 [thread overview]
Message-ID: <DKIUD7FKQWRG.NJU9WAALIS4G@bootlin.com> (raw)
In-Reply-To: <20260805-macb-context-v8-17-bc302ffd1174@bootlin.com>
Replying to sashiko
https://sashiko.dev/#/patchset/20260805-macb-context-v8-0-bc302ffd1174%40bootlin.com
> commit 370786abcd6adf66f9c2032c12fec77c99f4d627
> Author: Théo Lebrun <theo.lebrun@bootlin.com>
>
> 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.
>
> > diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c
> > index 4e004a5345b39..b3d84a65078f8 100644
> > --- a/drivers/net/ethernet/cadence/macb_main.c
> > +++ b/drivers/net/ethernet/cadence/macb_main.c
> > @@ -3533,11 +3533,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);
>
> [Severity: High]
> Can the watchdog timer cause a use-after-free by concurrently accessing the
> old context pointer while macb_context_swap_end() is freeing it?
>
> If the interface is idle when the MTU is changed, the trans_start timestamp
> may be older than the watchdog timeout. macb_context_swap_start() calls
> netif_tx_disable() to stop the tx queues, but does not update trans_start.
>
> This can allow the asynchronous dev_watchdog timer to conclude a tx timeout
> has occurred and trigger macb_tx_timeout() -> macb_tx_restart(), which reads
> the context:
>
> static void macb_tx_restart(struct macb_queue *queue)
> {
> struct macb_context *ctx = queue->bp->ctx;
> struct macb_txq *txq = macb_txq(queue);
>
> At the same time, macb_context_swap_end() replaces the context pointer
> and frees the old context:
>
> macb_free(old_ctx);
> kfree(old_ctx);
>
> Could this race cause memory corruption if macb_tx_restart() accesses the old
> context after it is freed?
Well, this is a fresh report for once! But it is completely unrelated to
our series at hand. We implement context swapping.
Let's investigate anyway.
- First I checked and nothing serialises all those call together at the
subsystem layer. ndo_tx_timeout is only under netdev->tx_global_lock.
- ndo_tx_timeout is in softirq context so no bp->mac_cfg_lock mutex to
save us, that would have been the easy solution.
- The proper solution is therefore bp->lock with a bp->ctx_swap check
inside. As queue->tx_ptr_lock is also involved we must make sure to
respect the ordering done elsewhere in the driver, so something like
the following in macb_tx_timeout() should fix it:
spin_lock_irqsave(&queue->tx_ptr_lock, flags);
spin_lock(&bp->lock);
if (bp->ctx_swap)
goto out;
...
spin_unlock(&bp->lock);
spin_unlock_irqrestore(&queue->tx_ptr_lock, flags);
This is all out of scope and series is way too large already, it'll have
to wait.
Thanks,
--
Théo Lebrun, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
prev parent reply other threads:[~2026-08-07 16:11 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-05 17:42 [PATCH net-next v8 00/17] net: macb: implement context swapping Théo Lebrun
2026-08-05 17:42 ` [PATCH net-next v8 01/17] net: macb: drop "consistent" from alloc/free function names Théo Lebrun
2026-08-05 17:42 ` [PATCH net-next v8 02/17] net: macb: unify device pointer naming convention Théo Lebrun
2026-08-05 17:42 ` [PATCH net-next v8 03/17] net: macb: unify variable naming convention in at91ether functions Théo Lebrun
2026-08-05 17:42 ` [PATCH net-next v8 04/17] net: macb: unify queue index variable naming convention and types Théo Lebrun
2026-08-05 17:42 ` [PATCH net-next v8 05/17] net: macb: enforce reverse christmas tree (RCT) convention Théo Lebrun
2026-08-05 17:42 ` [PATCH net-next v8 06/17] net: macb: allocate tieoff descriptor once across device lifetime Théo Lebrun
2026-08-05 17:42 ` [PATCH net-next v8 07/17] net: macb: refuse set_ringparam on EMAC Théo Lebrun
2026-08-05 17:42 ` [PATCH net-next v8 08/17] net: macb: introduce macb_context struct for buffer management Théo Lebrun
2026-08-07 15:10 ` Théo Lebrun
2026-08-05 17:42 ` [PATCH net-next v8 09/17] net: macb: avoid macb_init_rx_buffer_size() modifying state Théo Lebrun
2026-08-05 17:42 ` [PATCH net-next v8 10/17] net: macb: make `struct macb` subset reachable from macb_context struct Théo Lebrun
2026-08-05 17:42 ` [PATCH net-next v8 11/17] net: macb: change caps helpers signatures Théo Lebrun
2026-08-05 17:42 ` [PATCH net-next v8 12/17] net: macb: change function signatures to take contexts Théo Lebrun
2026-08-07 15:16 ` Théo Lebrun
2026-08-05 17:42 ` [PATCH net-next v8 13/17] net: macb: introduce macb_context_alloc() helper Théo Lebrun
2026-08-05 17:42 ` [PATCH net-next v8 14/17] net: macb: move printk() calls out of bp->lock critical section Théo Lebrun
2026-08-11 0:08 ` Jakub Kicinski
2026-08-05 17:42 ` [PATCH net-next v8 15/17] net: macb: read ISR inside " Théo Lebrun
2026-08-07 15:42 ` Théo Lebrun
2026-08-05 17:42 ` [PATCH net-next v8 16/17] net: macb: use context swapping in .set_ringparam() Théo Lebrun
2026-08-05 17:42 ` [PATCH net-next v8 17/17] net: macb: use context swapping in .ndo_change_mtu() Théo Lebrun
2026-08-07 16:11 ` Théo Lebrun [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DKIUD7FKQWRG.NJU9WAALIS4G@bootlin.com \
--to=theo.lebrun@bootlin.com \
--cc=andrew+netdev@lunn.ch \
--cc=benoit.monin@bootlin.com \
--cc=claudiu.beznea@tuxon.dev \
--cc=conor.dooley@microchip.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=gregory.clement@bootlin.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=maxime.chevallier@bootlin.com \
--cc=nb@tipi-net.de \
--cc=netdev@vger.kernel.org \
--cc=nicolas.ferre@microchip.com \
--cc=pabeni@redhat.com \
--cc=pvalerio@redhat.com \
--cc=richardcochran@gmail.com \
--cc=tawfik.bayouk@mobileye.com \
--cc=thomas.petazzoni@bootlin.com \
--cc=vladimir.kondratiev@mobileye.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.