0c76f22ef1
- bnc#633573 - System fail to boot after running several warm reboot tests 22749-vtd-workarounds.patch - Upstream patches from Jan 22744-ept-pod-locking.patch 22777-vtd-ats-fixes.patch 22781-pod-hap-logdirty.patch 22782-x86-emul-smsw.patch 22789-i386-no-x2apic.patch 22790-svm-resume-migrate-pirqs.patch 22816-x86-pirq-drop-priv-check.patch OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=94
166 lines
6.2 KiB
Diff
166 lines
6.2 KiB
Diff
# HG changeset patch
|
|
# User Keir Fraser <keir@xen.org>
|
|
# Date 1292414148 0
|
|
# Node ID d4b373ec948bed71b8683e09e41c6afc99f1edb6
|
|
# Parent 548c808be2a6f166657ce7cfb86df7a296a9526a
|
|
x86: increase MAX_LOCAL_APIC
|
|
References: bnc#656369, bnc#658704
|
|
|
|
otherwise apicid_to_node[MAX_LOCAL_APIC] will be overrun if apicid >
|
|
255. After patch, the mapping get right.
|
|
|
|
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
|
|
|
|
Make this and also MAX_MADT_ENTRIES loosely depend on NR_CPUS. Tie
|
|
MAX_APICS to MAX_LOCAL_APIC. Fix initializer of x86_acpiid_to_apicid[]
|
|
to match the array member type of u32, as well as all checks in
|
|
readers of this array and x86_cpu_to_apicid[].
|
|
|
|
While the adjustment to xen_vcpu_physid_to_x86_{acpi,apic}id() is not
|
|
backward compatible, I think it should still be done this way as the
|
|
former reserving of values beyond 0xff should never have been part of
|
|
the interface. If considered impossible, a second best solution would
|
|
appear to be to make the macros depend on __XEN_INTERFACE_VERSION__.
|
|
|
|
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
|
|
Index: xen-4.0.2-testing/xen/arch/x86/acpi/boot.c
|
|
===================================================================
|
|
--- xen-4.0.2-testing.orig/xen/arch/x86/acpi/boot.c
|
|
+++ xen-4.0.2-testing/xen/arch/x86/acpi/boot.c
|
|
@@ -82,7 +82,7 @@ u8 acpi_enable_value, acpi_disable_value
|
|
#endif
|
|
|
|
u32 x86_acpiid_to_apicid[MAX_MADT_ENTRIES] =
|
|
- {[0 ... MAX_MADT_ENTRIES - 1] = 0xff };
|
|
+ {[0 ... MAX_MADT_ENTRIES - 1] = BAD_APICID };
|
|
EXPORT_SYMBOL(x86_acpiid_to_apicid);
|
|
|
|
/* --------------------------------------------------------------------------
|
|
@@ -534,6 +534,7 @@ static int __init acpi_parse_madt_lapic_
|
|
|
|
mp_register_lapic_address(acpi_lapic_addr);
|
|
|
|
+ BUILD_BUG_ON(MAX_APICS != MAX_LOCAL_APIC);
|
|
count = acpi_table_parse_madt(ACPI_MADT_LAPIC, acpi_parse_lapic,
|
|
MAX_APICS);
|
|
x2count = acpi_table_parse_madt(ACPI_MADT_X2APIC, acpi_parse_x2apic,
|
|
@@ -998,12 +999,12 @@ unsigned int acpi_get_processor_id(unsig
|
|
{
|
|
unsigned int acpiid, apicid;
|
|
|
|
- if ((apicid = x86_cpu_to_apicid[cpu]) == 0xff)
|
|
- return 0xff;
|
|
+ if ((apicid = x86_cpu_to_apicid[cpu]) == BAD_APICID)
|
|
+ return INVALID_ACPIID;
|
|
|
|
for (acpiid = 0; acpiid < ARRAY_SIZE(x86_acpiid_to_apicid); acpiid++)
|
|
if (x86_acpiid_to_apicid[acpiid] == apicid)
|
|
return acpiid;
|
|
|
|
- return 0xff;
|
|
+ return INVALID_ACPIID;
|
|
}
|
|
Index: xen-4.0.2-testing/xen/arch/x86/acpi/cpu_idle.c
|
|
===================================================================
|
|
--- xen-4.0.2-testing.orig/xen/arch/x86/acpi/cpu_idle.c
|
|
+++ xen-4.0.2-testing/xen/arch/x86/acpi/cpu_idle.c
|
|
@@ -745,7 +745,7 @@ int get_cpu_id(u8 acpi_id)
|
|
u32 apic_id;
|
|
|
|
apic_id = x86_acpiid_to_apicid[acpi_id];
|
|
- if ( apic_id == 0xff )
|
|
+ if ( apic_id == BAD_APICID )
|
|
return -1;
|
|
|
|
for ( i = 0; i < NR_CPUS; i++ )
|
|
Index: xen-4.0.2-testing/xen/arch/x86/smpboot.c
|
|
===================================================================
|
|
--- xen-4.0.2-testing.orig/xen/arch/x86/smpboot.c
|
|
+++ xen-4.0.2-testing/xen/arch/x86/smpboot.c
|
|
@@ -96,7 +96,7 @@ struct cpuinfo_x86 cpu_data[NR_CPUS];
|
|
EXPORT_SYMBOL(cpu_data);
|
|
|
|
u32 x86_cpu_to_apicid[NR_CPUS] __read_mostly =
|
|
- { [0 ... NR_CPUS-1] = -1U };
|
|
+ { [0 ... NR_CPUS-1] = BAD_APICID };
|
|
EXPORT_SYMBOL(x86_cpu_to_apicid);
|
|
|
|
static void map_cpu_to_logical_apicid(void);
|
|
@@ -1479,7 +1479,7 @@ int cpu_add(uint32_t apic_id, uint32_t a
|
|
return -EINVAL;
|
|
|
|
/* Detect if the cpu has been added before */
|
|
- if ( x86_acpiid_to_apicid[acpi_id] != 0xff)
|
|
+ if ( x86_acpiid_to_apicid[acpi_id] != BAD_APICID )
|
|
{
|
|
if (x86_acpiid_to_apicid[acpi_id] != apic_id)
|
|
return -EINVAL;
|
|
@@ -1513,7 +1513,7 @@ int cpu_add(uint32_t apic_id, uint32_t a
|
|
{
|
|
dprintk(XENLOG_WARNING,
|
|
"Setup node failed for pxm %x\n", pxm);
|
|
- x86_acpiid_to_apicid[acpi_id] = 0xff;
|
|
+ x86_acpiid_to_apicid[acpi_id] = BAD_APICID;
|
|
mp_unregister_lapic(apic_id, cpu);
|
|
spin_unlock(&cpu_add_remove_lock);
|
|
return node;
|
|
Index: xen-4.0.2-testing/xen/include/asm-x86/acpi.h
|
|
===================================================================
|
|
--- xen-4.0.2-testing.orig/xen/include/asm-x86/acpi.h
|
|
+++ xen-4.0.2-testing/xen/include/asm-x86/acpi.h
|
|
@@ -150,9 +150,11 @@ struct acpi_sleep_info {
|
|
|
|
#endif /* CONFIG_ACPI_SLEEP */
|
|
|
|
-#define MAX_MADT_ENTRIES 256
|
|
+#define MAX_MADT_ENTRIES MAX(256, 2 * NR_CPUS)
|
|
extern u32 x86_acpiid_to_apicid[];
|
|
-#define MAX_LOCAL_APIC 256
|
|
+#define MAX_LOCAL_APIC MAX(256, 4 * NR_CPUS)
|
|
+
|
|
+#define INVALID_ACPIID (-1U)
|
|
|
|
extern u32 pmtmr_ioport;
|
|
|
|
Index: xen-4.0.2-testing/xen/include/asm-x86/numa.h
|
|
===================================================================
|
|
--- xen-4.0.2-testing.orig/xen/include/asm-x86/numa.h
|
|
+++ xen-4.0.2-testing/xen/include/asm-x86/numa.h
|
|
@@ -39,7 +39,7 @@ extern int setup_node(int pxm);
|
|
extern void srat_detect_node(int cpu);
|
|
|
|
extern void setup_node_bootmem(int nodeid, u64 start, u64 end);
|
|
-extern unsigned char apicid_to_node[256];
|
|
+extern unsigned char apicid_to_node[];
|
|
#ifdef CONFIG_NUMA
|
|
extern void __init init_cpu_to_node(void);
|
|
|
|
Index: xen-4.0.2-testing/xen/include/public/vcpu.h
|
|
===================================================================
|
|
--- xen-4.0.2-testing.orig/xen/include/public/vcpu.h
|
|
+++ xen-4.0.2-testing/xen/include/public/vcpu.h
|
|
@@ -187,8 +187,7 @@ DEFINE_XEN_GUEST_HANDLE(vcpu_register_vc
|
|
/*
|
|
* Get the physical ID information for a pinned vcpu's underlying physical
|
|
* processor. The physical ID informmation is architecture-specific.
|
|
- * On x86: id[31:0]=apic_id, id[63:32]=acpi_id, and all values 0xff and
|
|
- * greater are reserved.
|
|
+ * On x86: id[31:0]=apic_id, id[63:32]=acpi_id.
|
|
* This command returns -EINVAL if it is not a valid operation for this VCPU.
|
|
*/
|
|
#define VCPUOP_get_physid 12 /* arg == vcpu_get_physid_t */
|
|
@@ -197,10 +196,8 @@ struct vcpu_get_physid {
|
|
};
|
|
typedef struct vcpu_get_physid vcpu_get_physid_t;
|
|
DEFINE_XEN_GUEST_HANDLE(vcpu_get_physid_t);
|
|
-#define xen_vcpu_physid_to_x86_apicid(physid) \
|
|
- ((((uint32_t)(physid)) >= 0xff) ? 0xff : ((uint8_t)(physid)))
|
|
-#define xen_vcpu_physid_to_x86_acpiid(physid) \
|
|
- ((((uint32_t)((physid)>>32)) >= 0xff) ? 0xff : ((uint8_t)((physid)>>32)))
|
|
+#define xen_vcpu_physid_to_x86_apicid(physid) ((uint32_t)(physid))
|
|
+#define xen_vcpu_physid_to_x86_acpiid(physid) ((uint32_t)((physid) >> 32))
|
|
|
|
/*
|
|
* Register a memory location to get a secondary copy of the vcpu time
|