CVE-2026-98050: mlxsw: spectrum_ptp: Fix napi_gro_receive() call from GC workqueue context

Published Sep 25, 2026
·
Updated

In the Linux kernel, the following vulnerability has been resolved:

mlxsw: spectrumptp: Fix napigroreceive() call from GC workqueue context

Currently mlxswsp1ptphtgccollect() is run from the PTP garbage-collection workqueue, rather than the NAPI poll context. For any unmatched PTP entries carrying an SKB, it calls mlxswsp1ptpunmatchedfinish() -> mlxswsp1ptppacketfinish(). For ingress packets, this calls mlxswsprxlistenernomarkfunc(). The end of that function is the following:

skb->protocol = ethtypetrans(skb, skb->dev); napigroreceive(mlxswskbcb(skb)->rxmdinfo.napi, skb);

The napi pointer is one that was placed in the SKB control block when the trapped packet was received in the NAPI context. Later, when the GC reaps the unmatched entry (up to MLXSWSP1PTPHTGCTIMEOUT later), the call to napigroreceive() mutates the NAPI instance's GRO list, which is unsafe if the poll is running concurrently on another CPU.

In mlxswsp1ptphtgccollect(), localbhdisable() is called to prevent softirq processing, but this only applies to the local CPU. Additionally, its comment is stale. It states that mlxswsp1ptpunmatchedfinish() invokes netifreceiveskb(). This has not been accurate since the referenced commit; this patch makes that comment accurate again. mlxswpcinapidevsinit() calls netifthreadedenable() on the NAPI RX netdevice without any conditions. The NAPI instance's poll, which may be running concurrent to the GC, is running as an independently-scheduled kthread which may be on a different CPU. The call to localbhdisable() does not guard against this.

If a tx-timestamp timeout produces an unmatched entry (which can be easily reproduced by running ptp4l and waiting for a port to reach the UNCALIBRATED/SLAVE state) while the owning NAPI thread is in the middle of a poll on another CPU, both sides mutate the GRO list concurrently, as shown below:

[39.846] port 1 (swp1): MASTER to UNCALIBRATED on RSSLAVE listadd corruption. next->prev should be prev (ffff8d620faf4138), but was ffff8d624150f700. (next=ffff8d620faf4138). kernel BUG at lib/listdebug.c:29! Oops: invalid opcode: 0000 [#1] SMP PTI CPU: 1 UID: 0 PID: 539 Comm: napi/mlxswrx-0 Not tainted 6.18.48 #1-NixOS PREEMPT(lazy) Hardware name: Mellanox Technologies Ltd. MSN2410/VMOD0001, BIOS 4.6.5 09/13/2018 RIP: 0010:listaddvalidorreport+0x79/0xb0 RSP: 0018:ffffcdf8c0f27c08 EFLAGS: 00010246 RAX: 0000000000000075 RBX: ffff8d624150fd00 RCX: 0000000000000000 RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffff8d6315d1e540 RBP: ffff8d620faf4070 R08: 0000000000000000 R09: 00000000ffffdfff R10: ffffffffa5c60fe0 R11: ffffcdf8c0f27ab8 R12: 0000000000000003 R13: 000000000000003d R14: 00000000000001bc R15: 0000000000000001 FS: 0000000000000000(0000) GS:ffff8d636f63f000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000562689a60c24 CR3: 000000015f224004 CR4: 00000000001726f0 Call Trace: <TASK> groreceiveskb+0xee/0x230 mlxswsp1ptpgotpacket+0x61/0x140 [mlxswspectrum] mlxswcoreskbreceive+0xdf/0x1b0 [mlxswcore] mlxswpcinapipollcqrx+0x780/0x9d0 [mlxswpci] napipoll+0x31/0x1e0 napithreadedpollloop+0x16b/0x1c0 napithreadedpoll+0x71/0xa0 kthread+0xfb/0x260 retfromfork+0x22d/0x260 retfromforkasm+0x1a/0x30 </TASK> Kernel panic - not syncing: Fatal exception in interrupt

The machinery that leads to this kernel panic has not been changed between 6.18.48 and mainline.

This patch adds an ingress-delivery helper for the PTP packetfinish() path that calls netifreceiveskb() instead of napigroreceive(). netifreceiveskb(), unlike napigroreceive(), can be called from outside of the NAPI instance's poll context, which can occur at the call site for this path. RX stats accounting and the skb->dev assignment are still preserved; the only change is the delivery call itself.

This removes GR ---truncated---

Affected Software

1 affected component
Linux Linux kernel

Event History

Sep 25, 2026
CVE Published
via MITRE·10:23 AM
Data Sourced
via MITRE·10:23 AM
Description

Frequently Asked Questions

1

Which systems and traffic paths are affected by this race?

The issue is in the Linux kernel mlxsw Spectrum PTP handling path. It involves ingress packets associated with unmatched PTP entries that retain an SKB and are later reaped by the PTP garbage-collection workqueue.

2

What runtime condition makes the race possible?

The garbage-collection worker can call napi_gro_receive() using a NAPI pointer saved when the packet was received, while that NAPI poll is concurrently running on another CPU. Disabling bottom halves in the garbage-collection worker only prevents local softirq processing and does not protect against polling on a different CPU.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203