• Jacob Pan's avatar
    x86/irq: Install posted MSI notification handler · 1b03d82b
    Jacob Pan authored
    All MSI vectors are multiplexed into a single notification vector when
    posted MSI is enabled. It is the responsibility of the notification vector
    handler to demultiplex MSI vectors. In the handler the MSI vector handlers
    are dispatched without IDT delivery for each pending MSI interrupt.
    
    For example, the interrupt flow will change as follows:
    (3 MSIs of different vectors arrive in a a high frequency burst)
    
    BEFORE:
    interrupt(MSI)
        irq_enter()
        handler() /* EOI */
        irq_exit()
            process_softirq()
    interrupt(MSI)
        irq_enter()
        handler() /* EOI */
        irq_exit()
            process_softirq()
    interrupt(MSI)
        irq_enter()
        handler() /* EOI */
        irq_exit()
            process_softirq()
    
    AFTER:
    interrupt /* Posted MSI notification vector */
        irq_enter()
    	atomic_xchg(PIR)
    	handler()
    	handler()
    	handler()
    	pi_clear_on()
        apic_eoi()
        irq_exit()
            process_softirq()
    
    Except for the leading MSI, CPU notifications are skipped/coalesced.
    
    For MSIs which arrive at a low frequency, the demultiplexing loop does not
    wait for more interrupts to coalesce. Therefore, there's no additional
    latency other than the processing time.
    Signed-off-by: default avatarJacob Pan <jacob.jun.pan@linux.intel.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Link: https://lore.kernel.org/r/20240423174114.526704-9-jacob.jun.pan@linux.intel.com
    1b03d82b
irq.c 15.6 KB