irq: shared-IRQ re-arm bug-class sweep across base drivers + plan update

Bump base fork to 28afc1fe:
- ad40fffd ahcid: always re-arm the IRQ line, even for foreign interrupts
  (from the UAS workstream)
- 92924224 e1000d/ihdad/vboxd/xhcid: unconditional ack
- 28afc1fe sb16d/ac97d/rtl8139d/rtl8168d/ixgbed/ihdgd: unconditional ack
- 54e89a33 fbcond: perform the display handoff open off the console loop
  (concurrent session's root-cause fix for the '-vga std' boot freeze)

Bug class: kernel masks the IRQ line on delivery and only re-arms on the
userspace write-back; conditional acks wedged shared INTx lines forever.
Explains a class of 'works in QEMU, wedges on real hardware' failures.
Full audit + unaffected-driver rationale recorded in the IRQ plan P3
section.
This commit is contained in:
2026-07-20 18:52:34 +09:00
parent 5c6cd18599
commit 9245ad426a
2 changed files with 32 additions and 1 deletions
@@ -571,6 +571,37 @@ Why third:
This improves reliability without changing the underlying architecture.
### Shared-IRQ re-arm bug class — FIXED (2026-07-20)
A systematic driver bug class was found and fixed across the base driver tree:
the kernel masks the IRQ line when it delivers an interrupt and only re-arms it
on the userspace write-back (irq scheme `write``acknowledge()`
`pic_unmask()`/`ioapic_unmask()`). Drivers that acked only when the interrupt
was their own wedged the line permanently on the first foreign interrupt on a
shared INTx line — every later interrupt for the device was silently lost.
This is exactly the "works in QEMU (dedicated MSI/INTx), wedges on real
hardware (shared INTx)" failure signature that P1/P6 hardware validation was
expected to hunt.
Fixed (always ack, tick/process only when ours, device-level status cleared
before re-arm so no interrupt storm):
- `ahcid` (`ad40fffd`, from the UAS workstream)
- `e1000d`, `ihdad`, `vboxd`, `xhcid` (`92924224`)
- `sb16d`, `ac97d`, `rtl8139d`, `rtl8168d`, `ixgbed`, `ihdgd` (`28afc1fe`)
Audited, NOT affected:
- `ided` — already acked unconditionally
- `nvmed` — the shared `executor` crate acks unconditionally for INTx; MSI
vectors are never shared so every delivery is ours by construction
- `virtio-core` consumers — MSI-X only, same reasoning
- `ps2d` — does not use the irq scheme fd path
Both fix commits verified with `cargo check -Z build-std --target
x86_64-unknown-redox` for every touched crate — clean, no new warnings.
## Priority 4 — input/controller runtime proof
Goal: continue turning the existing input substrate into a well-proven low-level controller path.