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 v9 15/17] net: macb: read ISR inside bp->lock critical section
Date: Fri, 11 Sep 2026 19:33:55 +0200 [thread overview]
Message-ID: <DLCO1OTT6D7E.3KIF8LWG9FMRT@bootlin.com> (raw)
In-Reply-To: <20260812-macb-context-v9-15-7ddbf5f715e0@bootlin.com>
Replying to non-net sashiko
https://sashiko.dev/#/patchset/20260812-macb-context-v9-0-7ddbf5f715e0%40bootlin.com
> commit 48c8a049fccfd5d7c55b15a7fd08dc4eca66d836
> Author: Théo Lebrun <theo.lebrun@bootlin.com>
> Date: Wed Aug 12 08:03:29 2026 +0000
>
> net: macb: read ISR inside bp->lock critical section
>
> The IRQ handler reads ISR register into the `status` stack variable.
> If empty, it early returns. Else, it grabs bp->lock and iterates on
> the status bits.
>
> We risk a race on spinlock acquire; status might have changed.
> Move the readl(ISR) inside the bp->lock critical section.
>
> > diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c
> > index d23a0d08c2769..6d79663e42bfe 100644
> > --- a/drivers/net/ethernet/cadence/macb_main.c
> > +++ b/drivers/net/ethernet/cadence/macb_main.c
> > @@ -2190,12 +2190,13 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id)
> > bool hresp_err = false;
> > u32 status;
> >
> > - status = queue_readl(queue, ISR);
> > + spin_lock(&bp->lock);
>
> [Severity: High]
> Does taking this lock unconditionally cause severe latency spikes for other
> devices on a shared interrupt line?
>
> If a shared interrupt fires while the driver's error handling task is running,
> this CPU might spin with local interrupts disabled for up to 14ms:
>
> macb_tx_error_task()
> spin_lock(&bp->lock);
> macb_halt_tx()
> read_poll_timeout_atomic(..., MACB_HALT_TIMEOUT, ...)
>
> (MACB_HALT_TIMEOUT is 14000us)
Yes this is correct. And something we will live with.
- Our IRQ line is shared only with other queues of the same MAC.
- That timeout is scaled to 10 Mbits/s, on 1G this timeout should be
100 times smaller. We just don't bother scaling it with link speed.
[...]
> > - if (unlikely(!status))
> > + status = queue_readl(queue, ISR);
>
> [Severity: High]
> This is a pre-existing issue, but can this unconditional hardware register
> read trigger a synchronous external abort (bus fault) if the MAC is in
> runtime suspend?
>
> If another device on the same shared IRQ line triggers an interrupt while
> the MAC's clocks are gated via macb_clks_disable() in macb_runtime_suspend(),
> accessing memory-mapped registers of a clock-gated peripheral typically
> causes a bus fault.
Again, we have IRQF_SHARED only to share with other queues of the same
MAC. So that theory is moot. Long term I'd like to drop IRQF_SHARED.
>
> > + if (unlikely(!status)) {
> > + spin_unlock(&bp->lock);
> > return IRQ_NONE;
> > -
> > - spin_lock(&bp->lock);
> > + }
> >
> > while (status) {
>
> [Severity: High]
> This is a pre-existing issue, but will this loop infinitely if an unhandled
> interrupt bit (like PFR) is set on hardware with Write-1-to-Clear ISR
> behavior?
Yes. Long term I'd like to introduce a max iteration count.
Completely unrelated to context swapping.
> [Severity: High]
> This isn't a bug introduced by this patch, but does the driver have a
> use-after-free risk during interface closure or driver removal?
>
> In macb_close(), the context structure is freed without synchronizing with
> or cancelling the asynchronous error tasks:
Yes. This one I'll fix. See previous email.
Re: [PATCH net-next v9 08/17] net: macb: introduce macb_context struct for buffer management
https://lore.kernel.org/netdev/DLCLQPVD8B9N.NFKWDS6SH0QN@bootlin.com/
[...]
---
Replying to net sashiko
https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260812-macb-context-v9-0-7ddbf5f715e0%40bootlin.com
> commit 4cc0cf203c223199f230330ef1014c2cac4c4841
> Author: Théo Lebrun <theo.lebrun@bootlin.com>
>
> net: macb: read ISR inside bp->lock critical section
>
> This moves the queue_readl(queue, ISR) in macb_interrupt() from before the
> bp->lock acquisition to inside the critical section, and unlocks on the
> early return path when status is zero. The stated goal is to avoid acting
> on a stale ISR sample.
>
> > We risk a race on spinlock acquire; status might have changed.
> > Move the readl(ISR) inside the bp->lock critical section.
> >
> > In practice, we protect ourselves from interpreting the same ISR status
> > twice.
>
> [Severity: Low]
> [Finding: gpt-5-6-sol-1-3]
> [Sources: gpt-5-6-sol, opus-5]
> Could the changelog name the two contexts that can observe the same ISR
> sample, and the hardware precondition?
If any other context clears an IRQ then we race against that. Grep for
macb_queue_isr_clear in the code; for example the suspend !WOL case.
Maybe the commit message is badly written; it isn't a notion of
interpreting the same bit twice.
[...]
> > diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c
> > index d23a0d08c276..6d79663e42bf 100644
> > --- a/drivers/net/ethernet/cadence/macb_main.c
> > +++ b/drivers/net/ethernet/cadence/macb_main.c
> > @@ -2190,12 +2190,13 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id)
> > bool hresp_err = false;
> > u32 status;
> >
> > - status = queue_readl(queue, ISR);
> > + spin_lock(&bp->lock);
> >
> > - if (unlikely(!status))
> > + status = queue_readl(queue, ISR);
> > + if (unlikely(!status)) {
> > + spin_unlock(&bp->lock);
> > return IRQ_NONE;
> > -
> > - spin_lock(&bp->lock);
> > + }
>
> [Severity: Medium]
> [Finding: main-3-6]
> [Sources: opus-5]
> Does this remove the lock-free "not my interrupt" fast path?
>
> The handler is registered shared in macb_init():
Yes! Once again, we share only with other queues of the same MAC.
We don't support running alongside other devices.
[...]
Thanks,
--
Théo Lebrun, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
next prev parent reply other threads:[~2026-09-11 17:34 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-12 8:03 [PATCH net-next v9 00/17] net: macb: implement context swapping Théo Lebrun
2026-08-12 8:03 ` [PATCH net-next v9 01/17] net: macb: drop "consistent" from alloc/free function names Théo Lebrun
2026-08-12 8:03 ` [PATCH net-next v9 02/17] net: macb: unify device pointer naming convention Théo Lebrun
2026-08-12 8:03 ` [PATCH net-next v9 03/17] net: macb: unify variable naming convention in at91ether functions Théo Lebrun
2026-08-12 8:03 ` [PATCH net-next v9 04/17] net: macb: unify queue index variable naming convention and types Théo Lebrun
2026-08-12 8:03 ` [PATCH net-next v9 05/17] net: macb: enforce reverse christmas tree (RCT) convention Théo Lebrun
2026-09-01 9:10 ` Théo Lebrun
2026-08-12 8:03 ` [PATCH net-next v9 06/17] net: macb: allocate tieoff descriptor once across device lifetime Théo Lebrun
2026-08-12 8:03 ` [PATCH net-next v9 07/17] net: macb: refuse set_ringparam on EMAC Théo Lebrun
2026-08-12 8:03 ` [PATCH net-next v9 08/17] net: macb: introduce macb_context struct for buffer management Théo Lebrun
2026-09-11 15:45 ` Théo Lebrun
2026-08-12 8:03 ` [PATCH net-next v9 09/17] net: macb: avoid macb_init_rx_buffer_size() modifying state Théo Lebrun
2026-08-12 8:03 ` [PATCH net-next v9 10/17] net: macb: make `struct macb` subset reachable from macb_context struct Théo Lebrun
2026-08-12 8:03 ` [PATCH net-next v9 11/17] net: macb: change caps helpers signatures Théo Lebrun
2026-08-12 8:03 ` [PATCH net-next v9 12/17] net: macb: change function signatures to take contexts Théo Lebrun
2026-08-12 8:03 ` [PATCH net-next v9 13/17] net: macb: introduce macb_context_alloc() helper Théo Lebrun
2026-08-12 8:03 ` [PATCH net-next v9 14/17] net: macb: move printk() calls out of bp->lock critical section Théo Lebrun
2026-08-12 8:03 ` [PATCH net-next v9 15/17] net: macb: read ISR inside " Théo Lebrun
2026-09-11 17:33 ` Théo Lebrun [this message]
2026-08-12 8:03 ` [PATCH net-next v9 16/17] net: macb: use context swapping in .set_ringparam() Théo Lebrun
2026-09-11 21:53 ` Théo Lebrun
2026-08-12 8:03 ` [PATCH net-next v9 17/17] net: macb: use context swapping in .ndo_change_mtu() Théo Lebrun
2026-08-15 9:31 ` [PATCH net-next v9 00/17] net: macb: implement context swapping Théo Lebrun
2026-08-18 0:24 ` Jakub Kicinski
2026-08-18 0:30 ` patchwork-bot+netdevbpf
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=DLCO1OTT6D7E.3KIF8LWG9FMRT@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.