[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 36/44] x86/monitor: Capture Xen's intent to use monitor at boot time
The ACPI idle driver uses an IPI to retrieve cpuid_ecx(5). This is problematic because it uses a stack pointer, but also wasteful at runtime. Introduce X86_FEATURE_XEN_MONITOR as a synthetic feature bit meaning MONITOR && EXTENSIONS && INTERRUPT_BREAK, and calculate it when a cpu comes up rather than repeatedly at runtime. Drop the duplicate defines for MWAIT cpuid information, and use the definitions from mwait.h Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- xen/arch/x86/acpi/lib.c | 16 +--------------- xen/arch/x86/cpu/common.c | 7 +++++++ xen/include/asm-x86/cpufeature.h | 5 +---- xen/include/asm-x86/cpufeatures.h | 1 + xen/include/asm-x86/mwait.h | 3 +++ 5 files changed, 13 insertions(+), 19 deletions(-) diff --git a/xen/arch/x86/acpi/lib.c b/xen/arch/x86/acpi/lib.c index 7d7c718..1d64e74 100644 --- a/xen/arch/x86/acpi/lib.c +++ b/xen/arch/x86/acpi/lib.c @@ -80,16 +80,10 @@ unsigned int acpi_get_processor_id(unsigned int cpu) return INVALID_ACPIID; } -static void get_mwait_ecx(void *info) -{ - *(u32 *)info = cpuid_ecx(CPUID_MWAIT_LEAF); -} - int arch_acpi_set_pdc_bits(u32 acpi_id, u32 *pdc, u32 mask) { unsigned int cpu = get_cpu_id(acpi_id); struct cpuinfo_x86 *c; - u32 ecx; if (!(acpi_id + 1)) c = &boot_cpu_data; @@ -110,15 +104,7 @@ int arch_acpi_set_pdc_bits(u32 acpi_id, u32 *pdc, u32 mask) * If mwait/monitor or its break-on-interrupt extension are * unsupported, Cx_FFH will be disabled. */ - if (!cpu_has(c, X86_FEATURE_MONITOR) || - c->cpuid_level < CPUID_MWAIT_LEAF) - ecx = 0; - else if (c == &boot_cpu_data || cpu == smp_processor_id()) - ecx = cpuid_ecx(CPUID_MWAIT_LEAF); - else - on_selected_cpus(cpumask_of(cpu), get_mwait_ecx, &ecx, 1); - if (!(ecx & CPUID5_ECX_EXTENSIONS_SUPPORTED) || - !(ecx & CPUID5_ECX_INTERRUPT_BREAK)) + if ( !cpu_has_xen_monitor ) pdc[2] &= ~(ACPI_PDC_C_C1_FFH | ACPI_PDC_C_C2C3_FFH); return 0; diff --git a/xen/arch/x86/cpu/common.c b/xen/arch/x86/cpu/common.c index decdcd5..262eccc 100644 --- a/xen/arch/x86/cpu/common.c +++ b/xen/arch/x86/cpu/common.c @@ -12,6 +12,7 @@ #include <mach_apic.h> #include <asm/setup.h> #include <public/sysctl.h> /* for XEN_INVALID_{SOCKET,CORE}_ID */ +#include <asm/mwait.h> #include "cpu.h" @@ -312,6 +313,12 @@ static void generic_identify(struct cpuinfo_x86 *c) if ( cpu_has(c, X86_FEATURE_CLFLUSH) ) c->x86_clflush_size = ((ebx >> 8) & 0xff) * 8; + /* Xen only uses MONITOR if INTERRUPT_BREAK is available. */ + if ( cpu_has(c, X86_FEATURE_MONITOR) && + ((cpuid_ecx(CPUID_MWAIT_LEAF) & CPUID_MWAIT_MIN_FEATURES) == + CPUID_MWAIT_MIN_FEATURES) ) + set_bit(X86_FEATURE_XEN_MONITOR, c->x86_capability); + if ( (c->cpuid_level >= CPUID_PM_LEAF) && (cpuid_ecx(CPUID_PM_LEAF) & CPUID6_ECX_APERFMPERF_CAPABILITY) ) set_bit(X86_FEATURE_APERFMPERF, c->x86_capability); diff --git a/xen/include/asm-x86/cpufeature.h b/xen/include/asm-x86/cpufeature.h index 84cc51d..8b24e0e 100644 --- a/xen/include/asm-x86/cpufeature.h +++ b/xen/include/asm-x86/cpufeature.h @@ -22,10 +22,6 @@ #define cpu_has(c, bit) test_bit(bit, (c)->x86_capability) #define boot_cpu_has(bit) test_bit(bit, boot_cpu_data.x86_capability) -#define CPUID_MWAIT_LEAF 5 -#define CPUID5_ECX_EXTENSIONS_SUPPORTED 0x1 -#define CPUID5_ECX_INTERRUPT_BREAK 0x2 - #define CPUID_PM_LEAF 6 #define CPUID6_ECX_APERFMPERF_CAPABILITY 0x1 @@ -104,6 +100,7 @@ #define cpu_has_arch_perfmon boot_cpu_has(X86_FEATURE_ARCH_PERFMON) #define cpu_has_cpuid_faulting boot_cpu_has(X86_FEATURE_CPUID_FAULTING) #define cpu_has_aperfmperf boot_cpu_has(X86_FEATURE_APERFMPERF) +#define cpu_has_xen_monitor boot_cpu_has(X86_FEATURE_XEN_MONITOR) enum _cache_type { CACHE_TYPE_NULL = 0, diff --git a/xen/include/asm-x86/cpufeatures.h b/xen/include/asm-x86/cpufeatures.h index bc98227..98637d0 100644 --- a/xen/include/asm-x86/cpufeatures.h +++ b/xen/include/asm-x86/cpufeatures.h @@ -22,3 +22,4 @@ XEN_CPUFEATURE(APERFMPERF, (FSCAPINTS+0)*32+ 8) /* APERFMPERF */ XEN_CPUFEATURE(MFENCE_RDTSC, (FSCAPINTS+0)*32+ 9) /* MFENCE synchronizes RDTSC */ XEN_CPUFEATURE(XEN_SMEP, (FSCAPINTS+0)*32+10) /* SMEP gets used by Xen itself */ XEN_CPUFEATURE(XEN_SMAP, (FSCAPINTS+0)*32+11) /* SMAP gets used by Xen itself */ +XEN_CPUFEATURE(XEN_MONITOR, (FSCAPINTS+0)*32+12) /* Xen uses MONITOR */ diff --git a/xen/include/asm-x86/mwait.h b/xen/include/asm-x86/mwait.h index ba9c0ea..a1bfeb1 100644 --- a/xen/include/asm-x86/mwait.h +++ b/xen/include/asm-x86/mwait.h @@ -9,6 +9,9 @@ #define CPUID5_ECX_EXTENSIONS_SUPPORTED 0x1 #define CPUID5_ECX_INTERRUPT_BREAK 0x2 +#define CPUID_MWAIT_MIN_FEATURES \ + (CPUID5_ECX_EXTENSIONS_SUPPORTED | CPUID5_ECX_INTERRUPT_BREAK) + #define MWAIT_ECX_INTERRUPT_BREAK 0x1 void mwait_idle_with_hints(unsigned int eax, unsigned int ecx); -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |