On Fri, Mar 14 2025 at 20:06, Sean Christopherson wrote: > @@ -409,25 +409,28 @@ static __always_inline bool handle_pending_pir(u64 *pir, struct pt_regs *regs) > { > int i, vec = FIRST_EXTERNAL_VECTOR; > unsigned long pir_copy[4]; > - bool handled = false; > + bool found_irq = false; > > - for (i = 0; i < 4; i++) > + for (i = 0; i < 4; i++) { > pir_copy[i] = READ_ONCE(pir[i]); > + if (pir_copy[i]) > + found_irq = true; > + } That's four extra conditional branches. You can avoid them completely. See delta patch below. Thanks, tglx --- --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c @@ -407,17 +407,15 @@ void intel_posted_msi_init(void) */ static __always_inline bool handle_pending_pir(u64 *pir, struct pt_regs *regs) { + unsigned long pir_copy[4], pend = 0; int i, vec = FIRST_EXTERNAL_VECTOR; - unsigned long pir_copy[4]; - bool found_irq = false; for (i = 0; i < 4; i++) { pir_copy[i] = READ_ONCE(pir[i]); - if (pir_copy[i]) - found_irq = true; + pend |= pir_copy[i]; } - if (!found_irq) + if (!pend) return false; for (i = 0; i < 4; i++) {