Commit 3c5e0267 authored by Thomas Gleixner's avatar Thomas Gleixner

x86/apic: Split out spurious handling code

sysvec_spurious_apic_interrupt() calls into the handling body of
__spurious_interrupt() which is not obvious as that function is declared
inside the DEFINE_IDTENTRY_IRQ(spurious_interrupt) macro.

As __spurious_interrupt() is currently always inlined this ends up with two
copies of the same code for no reason.

Split the handling function out and invoke it from both entry points.
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarKees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20210210002512.469379641@linutronix.de
parent 951c2a51
...@@ -2133,18 +2133,11 @@ void __init register_lapic_address(unsigned long address) ...@@ -2133,18 +2133,11 @@ void __init register_lapic_address(unsigned long address)
* Local APIC interrupts * Local APIC interrupts
*/ */
/** /*
* spurious_interrupt - Catch all for interrupts raised on unused vectors * Common handling code for spurious_interrupt and spurious_vector entry
* @regs: Pointer to pt_regs on stack * points below. No point in allowing the compiler to inline it twice.
* @vector: The vector number
*
* This is invoked from ASM entry code to catch all interrupts which
* trigger on an entry which is routed to the common_spurious idtentry
* point.
*
* Also called from sysvec_spurious_apic_interrupt().
*/ */
DEFINE_IDTENTRY_IRQ(spurious_interrupt) static noinline void handle_spurious_interrupt(u8 vector)
{ {
u32 v; u32 v;
...@@ -2179,9 +2172,23 @@ DEFINE_IDTENTRY_IRQ(spurious_interrupt) ...@@ -2179,9 +2172,23 @@ DEFINE_IDTENTRY_IRQ(spurious_interrupt)
trace_spurious_apic_exit(vector); trace_spurious_apic_exit(vector);
} }
/**
* spurious_interrupt - Catch all for interrupts raised on unused vectors
* @regs: Pointer to pt_regs on stack
* @vector: The vector number
*
* This is invoked from ASM entry code to catch all interrupts which
* trigger on an entry which is routed to the common_spurious idtentry
* point.
*/
DEFINE_IDTENTRY_IRQ(spurious_interrupt)
{
handle_spurious_interrupt(vector);
}
DEFINE_IDTENTRY_SYSVEC(sysvec_spurious_apic_interrupt) DEFINE_IDTENTRY_SYSVEC(sysvec_spurious_apic_interrupt)
{ {
__spurious_interrupt(regs, SPURIOUS_APIC_VECTOR); handle_spurious_interrupt(SPURIOUS_APIC_VECTOR);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment