diff options
| -rw-r--r-- | arch/x86/xen/enlighten.c | 4 | ||||
| -rw-r--r-- | arch/x86/xen/smp.c | 15 | ||||
| -rw-r--r-- | arch/x86/xen/xen-asm.S | 2 | ||||
| -rw-r--r-- | drivers/xen/events.c | 2 | ||||
| -rw-r--r-- | drivers/xen/xen-acpi-processor.c | 5 |
5 files changed, 23 insertions, 5 deletions
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 4f51bebac02c..a8f8844b8d32 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
| @@ -261,7 +261,8 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, | |||
| 261 | 261 | ||
| 262 | static bool __init xen_check_mwait(void) | 262 | static bool __init xen_check_mwait(void) |
| 263 | { | 263 | { |
| 264 | #ifdef CONFIG_ACPI | 264 | #if defined(CONFIG_ACPI) && !defined(CONFIG_ACPI_PROCESSOR_AGGREGATOR) && \ |
| 265 | !defined(CONFIG_ACPI_PROCESSOR_AGGREGATOR_MODULE) | ||
| 265 | struct xen_platform_op op = { | 266 | struct xen_platform_op op = { |
| 266 | .cmd = XENPF_set_processor_pminfo, | 267 | .cmd = XENPF_set_processor_pminfo, |
| 267 | .u.set_pminfo.id = -1, | 268 | .u.set_pminfo.id = -1, |
| @@ -349,7 +350,6 @@ static void __init xen_init_cpuid_mask(void) | |||
| 349 | /* Xen will set CR4.OSXSAVE if supported and not disabled by force */ | 350 | /* Xen will set CR4.OSXSAVE if supported and not disabled by force */ |
| 350 | if ((cx & xsave_mask) != xsave_mask) | 351 | if ((cx & xsave_mask) != xsave_mask) |
| 351 | cpuid_leaf1_ecx_mask &= ~xsave_mask; /* disable XSAVE & OSXSAVE */ | 352 | cpuid_leaf1_ecx_mask &= ~xsave_mask; /* disable XSAVE & OSXSAVE */ |
| 352 | |||
| 353 | if (xen_check_mwait()) | 353 | if (xen_check_mwait()) |
| 354 | cpuid_leaf1_ecx_set_mask = (1 << (X86_FEATURE_MWAIT % 32)); | 354 | cpuid_leaf1_ecx_set_mask = (1 << (X86_FEATURE_MWAIT % 32)); |
| 355 | } | 355 | } |
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 5fac6919b957..0503c0c493a9 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
| @@ -178,6 +178,7 @@ static void __init xen_fill_possible_map(void) | |||
| 178 | static void __init xen_filter_cpu_maps(void) | 178 | static void __init xen_filter_cpu_maps(void) |
| 179 | { | 179 | { |
| 180 | int i, rc; | 180 | int i, rc; |
| 181 | unsigned int subtract = 0; | ||
| 181 | 182 | ||
| 182 | if (!xen_initial_domain()) | 183 | if (!xen_initial_domain()) |
| 183 | return; | 184 | return; |
| @@ -192,8 +193,22 @@ static void __init xen_filter_cpu_maps(void) | |||
| 192 | } else { | 193 | } else { |
| 193 | set_cpu_possible(i, false); | 194 | set_cpu_possible(i, false); |
| 194 | set_cpu_present(i, false); | 195 | set_cpu_present(i, false); |
| 196 | subtract++; | ||
| 195 | } | 197 | } |
| 196 | } | 198 | } |
| 199 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 200 | /* This is akin to using 'nr_cpus' on the Linux command line. | ||
| 201 | * Which is OK as when we use 'dom0_max_vcpus=X' we can only | ||
| 202 | * have up to X, while nr_cpu_ids is greater than X. This | ||
| 203 | * normally is not a problem, except when CPU hotplugging | ||
| 204 | * is involved and then there might be more than X CPUs | ||
| 205 | * in the guest - which will not work as there is no | ||
| 206 | * hypercall to expand the max number of VCPUs an already | ||
| 207 | * running guest has. So cap it up to X. */ | ||
| 208 | if (subtract) | ||
| 209 | nr_cpu_ids = nr_cpu_ids - subtract; | ||
| 210 | #endif | ||
| 211 | |||
| 197 | } | 212 | } |
| 198 | 213 | ||
| 199 | static void __init xen_smp_prepare_boot_cpu(void) | 214 | static void __init xen_smp_prepare_boot_cpu(void) |
diff --git a/arch/x86/xen/xen-asm.S b/arch/x86/xen/xen-asm.S index 79d7362ad6d1..3e45aa000718 100644 --- a/arch/x86/xen/xen-asm.S +++ b/arch/x86/xen/xen-asm.S | |||
| @@ -96,7 +96,7 @@ ENTRY(xen_restore_fl_direct) | |||
| 96 | 96 | ||
| 97 | /* check for unmasked and pending */ | 97 | /* check for unmasked and pending */ |
| 98 | cmpw $0x0001, PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_pending | 98 | cmpw $0x0001, PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_pending |
| 99 | jz 1f | 99 | jnz 1f |
| 100 | 2: call check_events | 100 | 2: call check_events |
| 101 | 1: | 101 | 1: |
| 102 | ENDPATCH(xen_restore_fl_direct) | 102 | ENDPATCH(xen_restore_fl_direct) |
diff --git a/drivers/xen/events.c b/drivers/xen/events.c index 4b33acd8ed4e..0a8a17cd80be 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c | |||
| @@ -274,7 +274,7 @@ static unsigned int cpu_from_evtchn(unsigned int evtchn) | |||
| 274 | 274 | ||
| 275 | static bool pirq_check_eoi_map(unsigned irq) | 275 | static bool pirq_check_eoi_map(unsigned irq) |
| 276 | { | 276 | { |
| 277 | return test_bit(irq, pirq_eoi_map); | 277 | return test_bit(pirq_from_irq(irq), pirq_eoi_map); |
| 278 | } | 278 | } |
| 279 | 279 | ||
| 280 | static bool pirq_needs_eoi_flag(unsigned irq) | 280 | static bool pirq_needs_eoi_flag(unsigned irq) |
diff --git a/drivers/xen/xen-acpi-processor.c b/drivers/xen/xen-acpi-processor.c index 174b5653cd8a..0b48579a9cd6 100644 --- a/drivers/xen/xen-acpi-processor.c +++ b/drivers/xen/xen-acpi-processor.c | |||
| @@ -128,7 +128,10 @@ static int push_cxx_to_hypervisor(struct acpi_processor *_pr) | |||
| 128 | pr_debug(" C%d: %s %d uS\n", | 128 | pr_debug(" C%d: %s %d uS\n", |
| 129 | cx->type, cx->desc, (u32)cx->latency); | 129 | cx->type, cx->desc, (u32)cx->latency); |
| 130 | } | 130 | } |
| 131 | } else | 131 | } else if (ret != -EINVAL) |
| 132 | /* EINVAL means the ACPI ID is incorrect - meaning the ACPI | ||
| 133 | * table is referencing a non-existing CPU - which can happen | ||
| 134 | * with broken ACPI tables. */ | ||
| 132 | pr_err(DRV_NAME "(CX): Hypervisor error (%d) for ACPI CPU%u\n", | 135 | pr_err(DRV_NAME "(CX): Hypervisor error (%d) for ACPI CPU%u\n", |
| 133 | ret, _pr->acpi_id); | 136 | ret, _pr->acpi_id); |
| 134 | 137 | ||
