Skip to content

Commit 3cdb826

Browse files
committed
x86/irq: Track if IRQ was found in PIR during initial loop (to load PIR vals)
Track whether or not at least one IRQ was found in PIR during the initial loop to load PIR chunks from memory. Doing so generates slightly better code (arguably) for processing the for-loop of XCHGs, especially for the case where there are no pending IRQs. Note, while PIR can be modified between the initial load and the XCHG, it can only _gain_ new IRQs, i.e. there is no danger of a false positive due to the final version of pir_copy[] being empty. Opportunistically convert the boolean to an "unsigned long" and compute the effective boolean result via bitwise-OR. Some compilers, e.g. clang-14, need the extra "hint" to elide conditional branches. Opportunistically rename the variable in anticipation of moving the PIR accesses to a common helper that can be shared by posted MSIs and KVM. Old: <+74>: test %rdx,%rdx <+77>: je 0xffffffff812bbeb0 <handle_pending_pir+144> <pir[0]> <+88>: mov $0x1,%dl> <+90>: test %rsi,%rsi <+93>: je 0xffffffff812bbe8c <handle_pending_pir+108> <pir[1]> <+106>: mov $0x1,%dl <+108>: test %rcx,%rcx <+111>: je 0xffffffff812bbe9e <handle_pending_pir+126> <pir[2]> <+124>: mov $0x1,%dl <+126>: test %rax,%rax <+129>: je 0xffffffff812bbeb9 <handle_pending_pir+153> <pir[3]> <+142>: jmp 0xffffffff812bbec1 <handle_pending_pir+161> <+144>: xor %edx,%edx <+146>: test %rsi,%rsi <+149>: jne 0xffffffff812bbe7f <handle_pending_pir+95> <+151>: jmp 0xffffffff812bbe8c <handle_pending_pir+108> <+153>: test %dl,%dl <+155>: je 0xffffffff812bbf8e <handle_pending_pir+366> New: <+74>: mov %rax,%r8 <+77>: or %rcx,%r8 <+80>: or %rdx,%r8 <+83>: or %rsi,%r8 <+86>: setne %bl <+89>: je 0xffffffff812bbf88 <handle_pending_pir+360> <+95>: test %rsi,%rsi <+98>: je 0xffffffff812bbe8d <handle_pending_pir+109> <pir[0]> <+109>: test %rdx,%rdx <+112>: je 0xffffffff812bbe9d <handle_pending_pir+125> <pir[1]> <+125>: test %rcx,%rcx <+128>: je 0xffffffff812bbead <handle_pending_pir+141> <pir[2]> <+141>: test %rax,%rax <+144>: je 0xffffffff812bbebd <handle_pending_pir+157> <pir[3]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Sean Christopherson <[email protected]>
1 parent 600e960 commit 3cdb826

File tree

1 file changed

+10
-9
lines changed

1 file changed

+10
-9
lines changed

arch/x86/kernel/irq.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -414,27 +414,28 @@ void intel_posted_msi_init(void)
414414
*/
415415
static __always_inline bool handle_pending_pir(u64 *pir, struct pt_regs *regs)
416416
{
417+
unsigned long pir_copy[4], pending = 0;
417418
int i, vec = FIRST_EXTERNAL_VECTOR;
418-
unsigned long pir_copy[4];
419-
bool handled = false;
420419

421-
for (i = 0; i < 4; i++)
420+
for (i = 0; i < 4; i++) {
422421
pir_copy[i] = READ_ONCE(pir[i]);
422+
pending |= pir_copy[i];
423+
}
424+
425+
if (!pending)
426+
return false;
423427

424428
for (i = 0; i < 4; i++) {
425429
if (!pir_copy[i])
426430
continue;
427431

428432
pir_copy[i] = arch_xchg(&pir[i], 0);
429-
handled = true;
430433
}
431434

432-
if (handled) {
433-
for_each_set_bit_from(vec, pir_copy, FIRST_SYSTEM_VECTOR)
434-
call_irq_handler(vec, regs);
435-
}
435+
for_each_set_bit_from(vec, pir_copy, FIRST_SYSTEM_VECTOR)
436+
call_irq_handler(vec, regs);
436437

437-
return handled;
438+
return true;
438439
}
439440

440441
/*

0 commit comments

Comments
 (0)