Linux 6.10 Adds Support for Posted Interrupts on Bare Metal Hardware
Linux 6.10 Adds Support For Posted Interrupts On Bare Metal Hardware


Merged as part of the IRQ changes for the in-development Linux 6.10 kernel is support for posted interrupts on bare metal hardware.

Thomas Gleixner of Intel-owned Linutronix explained of this posted interrupts on bare metal hardware feature:
"Posted interrupts is a virtualization feature which allows to inject interrupts directly into a guest without host interaction. The VT-d interrupt remapping hardware sets the bit which corresponds to the interrupt vector in a vector bitmap which is either used to inject the interrupt directly into the guest via a virtualized APIC or in case that the guest is scheduled out provides a host side notification interrupt which informs the host that an interrupt has been marked pending in the bitmap.

    This can be utilized on bare metal for scenarios where multiple devices, e.g. NVME storage, raise interrupts with a high frequency.  In the default mode these interrupts are handles independently and therefore require a full roundtrip of interrupt entry/exit.

    Utilizing posted interrupts this roundtrip overhead can be avoided by coalescing these interrupt entries to a single entry for the posted interrupt notification. The notification interrupt then demultiplexes the pending bits in a memory based bitmap and invokes the corresponding device specific handlers.

    Depending on the usage scenario and device utilization throughput improvements between 10% and 130% have been measured.

    As this is only relevant for high end servers with multiple device queues per CPU attached and counterproductive for situations where interrupts are arriving at distinct times, the functionality is opt-in via a kernel command line parameter."
Great and thorough explanation. This feature requires building the Linux 6.10+ kernel with the new "X86_POSTED_MSI" Kconfig option. The "posted_msi" is the command line parameter needed as well for actually enabling the functionality.

More details for those interested via the pull request that has already landed into Linux Git.