From: Boris Ostrovsky Date: Tue, 4 Mar 2014 02:40:21 +0000 (-0500) Subject: x86/xen: Disable APIC PM for Xen PV guests X-Git-Tag: v4.1.12-92~327^2~5 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=8d50b6e91fb941d69af3f6cad83826e97a66adee;p=users%2Fjedix%2Flinux-maple.git x86/xen: Disable APIC PM for Xen PV guests Xen PV guests support only few APIC registers and writes to unsupported registers result in WARN_ONs. Most APIC accesses in these guests have been eliminated; however, lapic_suspend/resume are still called (on 32-bit kernels). We can disable APIC power management in xen_smp_prepare_boot_cpu() (which is called after APIC has been initialized). Signed-off-by: Boris Ostrovsky Signed-off-by: Konrad Rzeszutek Wilk --- diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h index 976b86a325e5..010c52d600de 100644 --- a/arch/x86/include/asm/apic.h +++ b/arch/x86/include/asm/apic.h @@ -628,6 +628,8 @@ extern int default_cpu_present_to_apicid(int mps_cpu); extern int default_check_phys_apicid_present(int phys_apicid); #endif +extern void apic_pm_deactivate(void); + #endif /* CONFIG_X86_LOCAL_APIC */ extern void irq_enter(void); extern void irq_exit(void); diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index dcb52850a28f..fda59d9c8634 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c @@ -2379,6 +2379,11 @@ static void apic_pm_activate(void) apic_pm_state.active = 1; } +void apic_pm_deactivate(void) +{ + apic_pm_state.active = 0; +} + static int __init init_lapic_sysfs(void) { /* XXX: remove suspend/resume procs if !apic_pm_state.active? */ @@ -2394,6 +2399,7 @@ core_initcall(init_lapic_sysfs); #else /* CONFIG_PM */ static void apic_pm_activate(void) { } +void apic_pm_deactivate(void) { } #endif /* CONFIG_PM */ diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 86484384492e..6ca5692fd94c 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c @@ -299,6 +299,10 @@ static void __init xen_smp_prepare_boot_cpu(void) xen_filter_cpu_maps(); xen_setup_vcpu_info_placement(); + +#ifdef CONFIG_X86_LOCAL_APIC + apic_pm_deactivate(); +#endif } /* * The alternative logic (which patches the unlock/lock) runs before