linux/drivers/ptp
Wei Fang 54ad7ea45d ptp: netc: fix potential interrupt storm caused by incorrect unbind order
In netc_timer_remove(), hardware interrupts are disabled by clearing
TMR_TEMASK before ptp_clock_unregister() is called. This may cause a
race condition during driver unbind that could leave hardware interrupts
active. For example, a concurrent PTP_CLK_REQ_EXTTS ioctl can re-enable
TMR_TEMASK after it has been cleared, leaving a pending hardware
interrupt when the driver unbinds.

Since the NETC Timer does not support PCIe FLR, hardware state is not
reset during probe. When the driver is rebound and the IRQ is registered,
the pending interrupt fires immediately. At that point priv->tmr_emask
is still zero, so netc_timer_isr() does not clear the interrupt status
and unconditionally returns IRQ_HANDLED, resulting in an uninterruptible
infinite interrupt storm.

Fix this in several ways. First, request the IRQ with IRQF_NO_AUTOEN so
it is not enabled when request_irq() runs, and clear TMR_TEMASK in
netc_timer_init() before enabling it. The IRQ is only enabled at the end
of probe once the timer has been reprogrammed and the PTP clock has been
registered. This ensures a stale pending interrupt from a previous unbind
or an unclean shutdown cannot be delivered before the driver is fully
initialized.

Second, in netc_timer_remove() call disable_irq() before
ptp_clock_unregister() and move the TMR_TEMASK/TMR_CTRL clearing after
it. disable_irq() masks the line and waits for any in-flight
netc_timer_isr() to finish, so no ISR can dereference priv->clock after
ptp_clock_unregister() has freed it. Unregistering the PTP clock before
clearing the mask also guarantees that no in-flight or concurrent ioctl
can re-enable hardware interrupts.

Finally, return IRQ_NONE from netc_timer_isr() when the masked event
status is zero, so the kernel's spurious interrupt detection can disable
a stuck line instead of looping forever.

Fixes: 671e266835 ("ptp: netc: add periodic pulse output support")
Reported-by: Sashiko <sashiko-bot@kernel.org>
Closes: https://sashiko.dev/#/patchset/20260720012508.23227-1-wei.fang%40oss.nxp.com
Signed-off-by: Wei Fang <wei.fang@nxp.com>
Link: https://patch.msgid.link/20260727060348.1887464-1-wei.fang@oss.nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2026-07-29 17:54:06 -07:00
..
Kconfig ptp: ptp_vmclock: remove dependency on CONFIG_ACPI 2026-02-02 18:06:01 -08:00
Makefile ptp: qoriq: convert to use generic interfaces to set loopback mode 2025-09-09 19:28:52 -07:00
ptp_chardev.c ptp: Switch to ktime_get_snapshot_id() for pre/post timestamps 2026-06-04 11:04:18 +02:00
ptp_clock.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
ptp_clockmatrix.c ptp: ptp_clockmatrix: Remove redundant semicolons 2025-08-14 17:35:49 -07:00
ptp_clockmatrix.h ptp: ptp_clockmatrix: Add .getmaxphase ptp_clock_info callback 2023-06-20 09:02:33 +01:00
ptp_dfl_tod.c ptp: add ToD device driver for Intel FPGA cards 2023-03-29 21:25:48 -07:00
ptp_dte.c Replace <linux/mod_devicetable.h> by more specific <linux/device-id/*.h> (c files) 2026-07-03 07:38:17 +02:00
ptp_fc3.c ptp: switch to using FIELD_GET_SIGNED() 2026-05-20 11:18:27 -04:00
ptp_fc3.h ptp: add FemtoClock3 Wireless as ptp hardware clock 2024-01-29 13:00:23 +00:00
ptp_idt82p33.c net: ptp: introduce .supported_extts_flags to ptp_clock_info 2025-04-15 20:20:57 -07:00
ptp_idt82p33.h ptp: idt82p33: Add .getmaxphase ptp_clock_info callback 2023-06-20 09:02:33 +01:00
ptp_ines.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
ptp_kvm_arm.c treewide: Remove system_counterval_t.cs, which is never read 2024-02-07 17:05:21 +01:00
ptp_kvm_common.c treewide: Remove system_counterval_t.cs, which is never read 2024-02-07 17:05:21 +01:00
ptp_kvm_x86.c ptp: kvm: x86: Return EOPNOTSUPP instead of ENODEV from kvm_arch_ptp_init() 2024-12-06 17:38:11 -08:00
ptp_mock.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
ptp_netc.c ptp: netc: fix potential interrupt storm caused by incorrect unbind order 2026-07-29 17:54:06 -07:00
ptp_ocp.c Networking changes for 7.2. 2026-06-17 08:17:00 +01:00
ptp_pch.c kernel.h: drop hex.h and update all hex.h users 2026-01-20 19:44:19 -08:00
ptp_private.h Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2025-10-01 10:14:49 +02:00
ptp_qoriq.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
ptp_s390.c ptp: ptp_s390: Add missing facility check 2026-07-23 07:02:34 -07:00
ptp_sysfs.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
ptp_vclock.c ptp: vclock: Switch from RCU to SRCU 2026-06-03 18:58:54 -07:00
ptp_vmclock.c ptp: vmclock: Use hw_cycles from snapshot for precise TSC pairing 2026-06-05 14:25:03 +02:00
ptp_vmw.c ptp: vmw: Drop ptp_vmw_acpi_device 2026-05-14 16:50:09 -07:00