• Jacob Pan's avatar
    x86/irq: Extend checks for pending vectors to posted interrupts · ce0a9287
    Jacob Pan authored
    During interrupt affinity change, it is possible to have interrupts delivered
    to the old CPU after the affinity has changed to the new one. To prevent lost
    interrupts, local APIC IRR is checked on the old CPU. Similar checks must be
    done for posted MSIs given the same reason.
    
    Consider the following scenario:
    	Device		system agent		iommu		memory 		CPU/LAPIC
    1	FEEX_XXXX
    2			Interrupt request
    3						Fetch IRTE	->
    4						->Atomic Swap PID.PIR(vec)
    						Push to Global Observable(GO)
    5						if (ON*)
    							done;*
    						else
    6							send a notification ->
    
    * ON: outstanding notification, 1 will suppress new notifications
    
    If the affinity change happens between 3 and 5 in the IOMMU, the old CPU's
    posted interrupt request (PIR) could have the pending bit set for the
    vector being moved.
    
    Add a helper function to check individual vector status. Then use the
    helper to check for pending interrupts on the source CPU's PID.
    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-11-jacob.jun.pan@linux.intel.com
    ce0a9287
posted_intr.h 2.89 KB