WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

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

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] x86: increase MAX_LOCAL_APIC
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Thu, 23 Dec 2010 05:34:36 -0800
Delivery-date: Thu, 23 Dec 2010 05:42:57 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# 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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] x86: increase MAX_LOCAL_APIC, Xen patchbot-unstable <=