[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] x86: increase MAX_LOCAL_APIC



# HG changeset patch
# User Keir Fraser <keir@xxxxxxx>
# Date 1292414148 0
# Node ID d4b373ec948bed71b8683e09e41c6afc99f1edb6
# Parent  548c808be2a6f166657ce7cfb86df7a296a9526a
x86: increase MAX_LOCAL_APIC

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@xxxxxxxxxx>

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@xxxxxxxxxx>
---
 xen/arch/x86/acpi/boot.c     |   11 ++++++-----
 xen/arch/x86/acpi/cpu_idle.c |    2 +-
 xen/arch/x86/smpboot.c       |    7 ++++---
 xen/include/asm-x86/acpi.h   |    6 ++++--
 xen/include/asm-x86/numa.h   |    2 +-
 xen/include/public/vcpu.h    |    9 +++------
 6 files changed, 19 insertions(+), 18 deletions(-)

diff -r 548c808be2a6 -r d4b373ec948b xen/arch/x86/acpi/boot.c
--- a/xen/arch/x86/acpi/boot.c  Wed Dec 15 11:52:14 2010 +0000
+++ b/xen/arch/x86/acpi/boot.c  Wed Dec 15 11:55:48 2010 +0000
@@ -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,
@@ -1000,12 +1001,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;
+}
diff -r 548c808be2a6 -r d4b373ec948b xen/arch/x86/acpi/cpu_idle.c
--- a/xen/arch/x86/acpi/cpu_idle.c      Wed Dec 15 11:52:14 2010 +0000
+++ b/xen/arch/x86/acpi/cpu_idle.c      Wed Dec 15 11:55:48 2010 +0000
@@ -869,7 +869,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++ )
diff -r 548c808be2a6 -r d4b373ec948b xen/arch/x86/smpboot.c
--- a/xen/arch/x86/smpboot.c    Wed Dec 15 11:52:14 2010 +0000
+++ b/xen/arch/x86/smpboot.c    Wed Dec 15 11:55:48 2010 +0000
@@ -67,7 +67,8 @@ EXPORT_SYMBOL(cpu_online_map);
 
 struct cpuinfo_x86 cpu_data[NR_CPUS];
 
-u32 x86_cpu_to_apicid[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = -1U };
+u32 x86_cpu_to_apicid[NR_CPUS] __read_mostly =
+       { [0 ... NR_CPUS-1] = BAD_APICID };
 
 static void map_cpu_to_logical_apicid(void);
 
@@ -882,7 +883,7 @@ int cpu_add(uint32_t apic_id, uint32_t a
         return -EBUSY;
 
     /* 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 )
     {
         cpu = (x86_acpiid_to_apicid[acpi_id] != apic_id)
             ? -EINVAL : -EEXIST;
@@ -906,7 +907,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);
             cpu = node;
             goto out;
diff -r 548c808be2a6 -r d4b373ec948b xen/include/asm-x86/acpi.h
--- a/xen/include/asm-x86/acpi.h        Wed Dec 15 11:52:14 2010 +0000
+++ b/xen/include/asm-x86/acpi.h        Wed Dec 15 11:55:48 2010 +0000
@@ -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;
 
diff -r 548c808be2a6 -r d4b373ec948b xen/include/asm-x86/numa.h
--- a/xen/include/asm-x86/numa.h        Wed Dec 15 11:52:14 2010 +0000
+++ b/xen/include/asm-x86/numa.h        Wed Dec 15 11:55:48 2010 +0000
@@ -37,7 +37,7 @@ extern void srat_detect_node(int cpu);
 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);
 
diff -r 548c808be2a6 -r d4b373ec948b xen/include/public/vcpu.h
--- a/xen/include/public/vcpu.h Wed Dec 15 11:52:14 2010 +0000
+++ b/xen/include/public/vcpu.h Wed Dec 15 11:55:48 2010 +0000
@@ -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

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.