linux/kernel/irq
Linus Torvalds dba3ec9f2a Updates for the interrupt core subsystem:
- Prevent a interrupt migration related live lock in handle_edge_irq()
 
     If the interrupt affinity is moved to a new target CPU and the
     interrupt is currently handled on the previous target CPU for edge type
     interrupts the handler might get stuck on the previous target for a
     long time, which causes both involved CPUs to waste cycles and
     eventually run into a soft-lockup situation.
 
     Solve this by checking whether the interrupt is redirected to a new
     target CPU and if the interrupt is handled on that new target CPU, busy
     wait for completion instead of masking it and sending the pending but
     which would cause the old CPU to re-run the handler and in the worst
     case repeating this excercise for a long time.
 
     This only works on architectures which use single CPU interrupt
     targets, but that's so far the only ones where this behaviour has been
     observed.
 
   - Add a kunit test for interrupt disable depth counts
 
     The nested interrupt disable depth has been an issue in the past
     especially vs. free_irq(), interrupt shutdown and CPU hotplug and their
     interactions. The test exercises the combinations of these scenarios
     and checks for correctness.
 -----BEGIN PGP SIGNATURE-----
 
 iQJHBAABCgAxFiEEQp8+kY+LLUocC4bMphj1TA10mKEFAmiGjEUTHHRnbHhAbGlu
 dXRyb25peC5kZQAKCRCmGPVMDXSYoWemD/0XUR2xjN5pdlJSDqSehKfUbI2psqij
 TPWyNmttyw3vLAkzQZjlsrTANfJq8XnEvAYZSK/Qu+4ogQvTYlw3FPoesWLDScfD
 yUN0vKnKM8xJ04YRSKBOWcbLve/MjwbAp77PTPalOTF8wpcj2InoawwjD7pTcWwL
 8PG0cW26Rx6iuIFVfFhv+QMUZC+oS/66CfQTQ/Uf+02mAOhprs7I5pgINb5F+drQ
 XR4TyMnaePmZ1i8ULa4SPnw7AzfPRhJM/m+jhA2NZJwbpTGnKGueE7SLJ//wX08p
 woT3cf7DQCHeMPIZQAOLJ181LWbHz7EJFxJ+7Ba/FWP/X/Ep0EG9BwuK5Gg6/Auj
 73xEnria3+Nw1hM6hlfRVX0+osizO35X91q63QUIejYDtM9Y9ByOjmi1o334sVjl
 iFLq2jAw8H0phYia67kDtoPmc94GsvqLJwRt5JtxN6MRF5L1CspqEveQOJuoO/Tg
 ZlToL+U16bkf7PI25e6d1t9OjqeK5GhOL3/Ygt8HwO9m4jIE7JCIIlMnQXpxl54I
 s5H467lJwVqeiOqiU4UWhPM++hvxCE0/FuOZHAgbC4/fYPR/+WkZdEfyA/Rhz88g
 B4yhq5+SBE8cMr0kh2e7c6mC505KICCEeyAU3iadfKlu3bhd7sVfFrgjRLoiCAym
 XC+Vi+Q7lu0J7w==
 =IgyG
 -----END PGP SIGNATURE-----

Merge tag 'irq-core-2025-07-27' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull irq updates from Thomas Gleixner:

 - Prevent a interrupt migration related live lock in handle_edge_irq()

   If the interrupt affinity is moved to a new target CPU and the
   interrupt is currently handled on the previous target CPU for edge
   type interrupts the handler might get stuck on the previous target
   for a long time, which causes both involved CPUs to waste cycles and
   eventually run into a soft-lockup situation.

   Solve this by checking whether the interrupt is redirected to a new
   target CPU and if the interrupt is handled on that new target CPU,
   busy wait for completion instead of masking it and sending the
   pending but which would cause the old CPU to re-run the handler and
   in the worst case repeating this excercise for a long time.

   This only works on architectures which use single CPU interrupt
   targets, but that's so far the only ones where this behaviour has
   been observed.

 - Add a kunit test for interrupt disable depth counts

   The nested interrupt disable depth has been an issue in the past
   especially vs. free_irq(), interrupt shutdown and CPU hotplug and
   their interactions. The test exercises the combinations of these
   scenarios and checks for correctness.

* tag 'irq-core-2025-07-27' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  genirq: Prevent migration live lock in handle_edge_irq()
  genirq: Split up irq_pm_check_wakeup()
  genirq: Move irq_wait_for_poll() to call site
  genirq: Remove pointless local variable
  genirq: Add kunit tests for depth counts
2025-07-29 12:55:12 -07:00
..
affinity.c lib/group_cpus: Let group_cpu_evenly() return the number of initialized masks 2025-07-01 10:24:11 -06:00
autoprobe.c genirq/autoprobe: Switch to lock guards 2025-05-07 09:08:11 +02:00
chip.c genirq: Prevent migration live lock in handle_edge_irq() 2025-07-22 14:30:42 +02:00
cpuhotplug.c genirq/cpuhotplug: Restore affinity even for suspended IRQ 2025-06-13 15:13:35 +02:00
debug.h
debugfs.c genirq: Bump the size of the local variable for sprintf() 2025-05-15 16:28:09 +02:00
devres.c genirq/devres: Don't free interrupt which is not managed by devres 2024-10-24 11:20:06 +02:00
dummychip.c
generic-chip.c genirq/generic-chip: Fix incorrect lock guard conversions 2025-04-08 22:49:02 +02:00
handle.c irq: remove unused flags argument from __handle_irq_event_percpu() 2022-01-07 00:25:25 +01:00
internals.h genirq: Split up irq_pm_check_wakeup() 2025-07-22 14:30:42 +02:00
ipi-mux.c genirq/ipi-mux: Use irq_domain_alloc_irqs() 2023-02-06 17:21:15 +00:00
ipi.c genirq/ipi: Fix NULL pointer deref in irq_data_get_affinity_mask() 2023-02-20 13:53:41 +01:00
irq_sim.c genirq/irq_sim: Initialize work context pointers properly 2025-06-13 15:36:35 +02:00
irq_test.c genirq: Add kunit tests for depth counts 2025-06-13 15:24:44 +02:00
irqdesc.c genirq/irqdesc: Remove double locking in hwirq_show() 2025-05-21 17:48:23 +02:00
irqdomain.c irqdomain: Fix kernel-doc and add it to Documentation 2025-05-16 21:06:13 +02:00
Kconfig genirq: Add kunit tests for depth counts 2025-06-13 15:24:44 +02:00
kexec.c genirq/kexec: Prevent redundant IRQ masking by checking state before shutdown 2024-12-11 20:32:34 +01:00
Makefile genirq: Add kunit tests for depth counts 2025-06-13 15:24:44 +02:00
manage.c genirq/manage: Use the correct lock guard in irq_set_irq_wake() 2025-05-14 12:05:58 +02:00
matrix.c genirq/matrix: Dynamic bitmap allocation 2024-02-23 10:18:44 +01:00
migration.c genirq/migration: Use irqd_get_parent_data() in irq_force_complete_move() 2025-04-04 17:08:36 +02:00
msi.c Updates for the MSI subsystem (core code and PCI): 2025-05-27 08:15:26 -07:00
pm.c genirq: Split up irq_pm_check_wakeup() 2025-07-22 14:30:42 +02:00
proc.c genirq: Consistently use '%u' format specifier for unsigned int variables 2025-05-13 09:43:32 +02:00
resend.c genirq/resend: Switch to lock guards 2025-05-07 09:08:11 +02:00
settings.h genirq: Remove IRQ_MOVE_PCNTXT and related code 2025-01-15 21:38:53 +01:00
spurious.c genirq: Move irq_wait_for_poll() to call site 2025-07-22 14:30:42 +02:00
timings.c genirq/timings: Add kernel-doc for a function parameter 2025-01-15 21:38:53 +01:00