On Mon, Mar 06, 2023, Xin Li wrote: > To eliminate dispatching IRQ through the IDT, export external_interrupt() > for VMX IRQ reinjection. > > Tested-by: Shan Kang <shan.kang@xxxxxxxxx> > Signed-off-by: Xin Li <xin3.li@xxxxxxxxx> > --- > arch/x86/include/asm/traps.h | 2 ++ > arch/x86/kernel/traps.c | 14 ++++++++++++++ > 2 files changed, 16 insertions(+) > > diff --git a/arch/x86/include/asm/traps.h b/arch/x86/include/asm/traps.h > index 46f5e4e2a346..da4c21ed68b4 100644 > --- a/arch/x86/include/asm/traps.h > +++ b/arch/x86/include/asm/traps.h > @@ -56,4 +56,6 @@ void __noreturn handle_stack_overflow(struct pt_regs *regs, > void f (struct pt_regs *regs) > typedef DECLARE_SYSTEM_INTERRUPT_HANDLER((*system_interrupt_handler)); > > +int external_interrupt(struct pt_regs *regs, unsigned int vector); > + > #endif /* _ASM_X86_TRAPS_H */ > diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c > index 31ad645be2fb..cebba1f49e19 100644 > --- a/arch/x86/kernel/traps.c > +++ b/arch/x86/kernel/traps.c > @@ -1540,6 +1540,20 @@ int external_interrupt(struct pt_regs *regs, unsigned int vector) > return 0; > } > > +#if IS_ENABLED(CONFIG_KVM_INTEL) > +/* > + * KVM VMX reinjects IRQ on its current stack, it's a sync call > + * thus the values in the pt_regs structure are not used in > + * executing IRQ handlers, except cs.RPL and flags.IF, which > + * are both always 0 in the VMX IRQ reinjection context. > + * > + * However, the pt_regs structure is sometimes used in stack > + * dump, e.g., show_regs(). So let the caller, i.e., KVM VMX > + * decide how to initialize the input pt_regs structure. > + */ > +EXPORT_SYMBOL_GPL(external_interrupt); > +#endif If the x86 maintainers don't object, I would prefer this to be squashed with the actual KVM usage, that way discussions on exactly what the exported API should be can be contained in a single thread.