x86/xen/apic: Use standard apic driver mechanism for Xen PV
authorJuergen Gross <jgross@suse.com>
Tue, 8 Aug 2023 22:04:18 +0000 (15:04 -0700)
committerDave Hansen <dave.hansen@linux.intel.com>
Wed, 9 Aug 2023 19:00:41 +0000 (12:00 -0700)
Instead of setting the Xen PV apic driver very early during boot, just use
the standard apic driver probing by setting an appropriate
x86_init.irqs.intr_mode_init callback.

At the same time eliminate xen_apic_check() which has never been used.

The #ifdef CONFIG_X86_LOCAL_APIC around the call of xen_init_apic()
can be removed, too, as CONFIG_XEN depends on CONFIG_X86_LOCAL_APIC.

Signed-off-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Tested-by: Michael Kelley <mikelley@microsoft.com>
Tested-by: Sohil Mehta <sohil.mehta@intel.com>
Tested-by: Juergen Gross <jgross@suse.com> # Xen PV (dom0 and unpriv. guest)
Link: https://lore.kernel.org/lkml/aa086365-fd02-210f-67c6-5c9175c0dfee@suse.com
arch/x86/xen/apic.c
arch/x86/xen/enlighten_pv.c

index 1838aef..315ffd8 100644 (file)
@@ -158,19 +158,8 @@ static struct apic xen_pv_apic = {
        .icr_write                      = xen_apic_icr_write,
 };
 
-static void __init xen_apic_check(void)
-{
-       apic_install_driver(&xen_pv_apic);
-}
-
 void __init xen_init_apic(void)
 {
        x86_apic_ops.io_apic_read = xen_io_apic_read;
-       /* On PV guests the APIC CPUID bit is disabled so none of the
-        * routines end up executing. */
-       if (!xen_initial_domain())
-               apic_install_driver(&xen_pv_apic);
-
-       x86_platform.apic_post_init = xen_apic_check;
 }
 apic_driver(xen_pv_apic);
index 93b6582..c393c44 100644 (file)
@@ -1326,7 +1326,7 @@ asmlinkage __visible void __init xen_start_kernel(struct start_info *si)
 
        x86_init.resources.memory_setup = xen_memory_setup;
        x86_init.irqs.intr_mode_select  = x86_init_noop;
-       x86_init.irqs.intr_mode_init    = x86_init_noop;
+       x86_init.irqs.intr_mode_init    = x86_64_probe_apic;
        x86_init.oem.arch_setup = xen_arch_setup;
        x86_init.oem.banner = xen_banner;
        x86_init.hyper.init_platform = xen_pv_init_platform;
@@ -1366,12 +1366,10 @@ asmlinkage __visible void __init xen_start_kernel(struct start_info *si)
 
        xen_init_capabilities();
 
-#ifdef CONFIG_X86_LOCAL_APIC
        /*
         * set up the basic apic ops.
         */
        xen_init_apic();
-#endif
 
        machine_ops = xen_machine_ops;