From: Simon Horman <horms@kernel.org>
To: Daniel Machon <daniel.machon@microchip.com>
Cc: netdev-bot+sashiko@kernel.org, andrew+netdev@lunn.ch,
davem@davemloft.net, edumazet@kernel.org, kuba@kernel.org,
pabeni@redhat.com, Steen.Hegelund@microchip.com,
UNGLinuxDriver@microchip.com, richardcochran@gmail.com,
horatiu.vultur@microchip.com, netdev@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH net] net: sparx5/lan969x: release the in-flight slot of a stale TX skb
Date: Mon, 2 Nov 2026 11:56:09 +0000 [thread overview]
Message-ID: <20261102115609.GA257209@horms.kernel.org> (raw)
In-Reply-To: <20261102091449.oigddj44eapymqua@DEN-DL-M70577>
On Mon, Nov 02, 2026 at 10:14:49AM +0100, Daniel Machon wrote:
...
> > [Severity: Medium]
> > Can this decrement race with sparx5_ptp_txtstamp_release() and count the
> > same skb down twice?
> >
> > Each port netdev has SPX5_PRIOS TX queues and there is no
> > ndo_select_queue, so two CPUs can run sparx5_port_xmit_impl() for the same
> > port at the same time. sparx5_ptp_txtstamp_old_release() unlinks while
> > holding only tx_skbs.lock. The busy path decrements without checking
> > whether the skb is still on the list:
> >
> > drivers/net/ethernet/microchip/sparx5/sparx5_ptp.c:sparx5_ptp_txtstamp_release() {
> > ...
> > spin_lock_irqsave(&sparx5->ptp_ts_id_lock, flags);
> > port->ts_id--;
> > sparx5->ptp_skbs--;
> > skb_unlink(skb, &port->tx_skbs);
> > spin_unlock_irqrestore(&sparx5->ptp_ts_id_lock, flags);
> > }
> >
> > A possible sequence:
> >
> > CPU0
> > sparx5_ptp_txtstamp_request()
> > skb_queue_tail(&port->tx_skbs, X)
> > sparx5->ptp_skbs++
> > spin_lock(&sparx5->tx_lock) /* waits */
> >
> > CPU1
> > sparx5_ptp_txtstamp_request()
> > sparx5_ptp_txtstamp_old_release()
> > /* X looks older than SPARX5_PTP_TIMEOUT */
> > __skb_unlink(X); dev_kfree_skb_any(X); purged++
> > sparx5->ptp_skbs -= purged
> >
> > CPU0
> > ops->fdma_xmit() or sparx5_inject() returns -EBUSY
> > sparx5_ptp_txtstamp_release(port, X)
> > sparx5->ptp_skbs--
> >
> > At HZ=100, SPARX5_PTP_TIMEOUT is one jiffy, so crossing a single tick is
> > enough for X to look expired.
> >
> > Before this patch the purge path did not decrement, so X was counted down
> > only once. ptp_skbs is a u16 and the limit check only tests for equality.
> >
> > If the counter wraps to 65535, does the SPARX5_MAX_PTP_ID limit stop
> > working, so that ts_id values can be reused while they are still
> > outstanding?
> >
> > The same window already lets CPU0 keep using X after CPU1 has freed it.
> > That part predates this patch; the double decrement is new.
>
> This fixes a leak seen in normal operation. Each lost timestamp keeps
> an in-flight slot, and after SPARX5_MAX_PTP_ID losses, two step
> timestamping stops on all ports. The lan966x twin (074caa30a627) is
> already in net.
>
> AFAICT, the wrong count can never be used. The second decrement is in the busy
> path, which on the very next line unlinks an skb that a purge on
> another TX queue has already freed. That use-after-free is
> pre-existing and crashes before the count matters.
>
> I am working on a net-next series that reworks PTP TX timestamping and fixes
> this and several related issues.
Thanks Daniel,
I agree that is a good approach.
Reviewed-by: Simon Horman <horms@kernel.org>
...
next prev parent reply other threads:[~2026-11-02 11:56 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-29 11:48 [PATCH net] net: sparx5/lan969x: release the in-flight slot of a stale TX skb Daniel Machon
2026-10-30 22:37 ` netdev-bot+sashiko
2026-11-02 9:14 ` Daniel Machon
2026-11-02 11:56 ` Simon Horman [this message]
2026-11-02 14:40 ` 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=20261102115609.GA257209@horms.kernel.org \
--to=horms@kernel.org \
--cc=Steen.Hegelund@microchip.com \
--cc=UNGLinuxDriver@microchip.com \
--cc=andrew+netdev@lunn.ch \
--cc=daniel.machon@microchip.com \
--cc=davem@davemloft.net \
--cc=edumazet@kernel.org \
--cc=horatiu.vultur@microchip.com \
--cc=kuba@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev-bot+sashiko@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=richardcochran@gmail.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.