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] This patch is intended to correct the number of CPUs.

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] This patch is intended to correct the number of CPUs.
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 21 Dec 2005 20:42:15 +0000
Delivery-date: Wed, 21 Dec 2005 20:46:27 +0000
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/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/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 djm@xxxxxxxxxxxxxxx
# Node ID 03ea3784168278c7c90805f99903dc4c548b3ef0
# Parent  663c487a5f2c1bee87062dfe522c4e4516a82f8e
This patch is intended to correct the number of CPUs.

Our IPF machines are the following configurations.
 - Total logical cpus = 16
  -- 4 sockets
  -- 2 cores
  -- 2 threads

I changed the setting of BIOS, and invalidated the hyperthread, and I built Xen 
with NR_CPUS=8.
As a result, it became like attached file xendmesg1.txt.
 - Available cpus 3
 - Total cpus 8

Next, I built Xen with NR_CPUS=16.
As a result, it became like attached file xendmesg2.txt.
 - Available cpus 8
 - Total cpus 16

I thought not to match the analysis of the lsapic entry to the value of 
NR_CPUS. 

It is an outline of patch as follows.
 1. Count up the lsapic entry by using 
acpi_table_count_madt()/acpi_table_count_madt_family().
 2. Call acpi_parse_lsapic() by using the number of lsapic entries.
 3. Count up the available_cpus by using acpi_parse_lsapic(), however NR_CPUS 
is not exceeded.

Signed-off-by: Masaki Kanno <kanno.masaki@xxxxxxxxxxxxxx>

Best Regards,
 Kan

diff -r 663c487a5f2c -r 03ea37841682 xen/arch/ia64/xen/acpi.c
--- a/xen/arch/ia64/xen/acpi.c  Wed Dec 21 14:49:31 2005
+++ b/xen/arch/ia64/xen/acpi.c  Wed Dec 21 14:53:40 2005
@@ -203,12 +203,18 @@
        else {
                printk(" enabled");
 #ifdef CONFIG_SMP
-               smp_boot_data.cpu_phys_id[available_cpus] = (lsapic->id << 8) | 
lsapic->eid;
-               if (hard_smp_processor_id()
-                   == (unsigned int) smp_boot_data.cpu_phys_id[available_cpus])
-                       printk(" (BSP)");
-#endif
+               if (available_cpus < NR_CPUS) {
+                       smp_boot_data.cpu_phys_id[available_cpus] = (lsapic->id 
<< 8) | lsapic->eid;
+                       if (hard_smp_processor_id()
+                           == (unsigned int) 
smp_boot_data.cpu_phys_id[available_cpus])
+                               printk(" (BSP)");
+                       ++available_cpus;
+               } else {
+                       printk(" - however, ignored...");
+               }
+#else
                ++available_cpus;
+#endif
        }
 
        printk("\n");
@@ -598,8 +604,17 @@
        if (acpi_table_parse_madt(ACPI_MADT_LAPIC_ADDR_OVR, 
acpi_parse_lapic_addr_ovr, 0) < 0)
                printk(KERN_ERR PREFIX "Error parsing LAPIC address override 
entry\n");
 
+#ifdef CONFIG_SMP
+       int count;
+       if ((count = acpi_table_count_madt(ACPI_MADT_LSAPIC)) < 1) {
+               printk(KERN_ERR PREFIX "Error parsing MADT - no LSAPIC 
entries\n");
+       } else {
+               acpi_table_parse_madt(ACPI_MADT_LSAPIC, acpi_parse_lsapic, 
count);
+       }
+#else
        if (acpi_table_parse_madt(ACPI_MADT_LSAPIC, acpi_parse_lsapic, NR_CPUS) 
< 1)
-               printk(KERN_ERR PREFIX "Error parsing MADT - no LAPIC 
entries\n");
+               printk(KERN_ERR PREFIX "Error parsing MADT - no LSAPIC 
entries\n");
+#endif
 
        if (acpi_table_parse_madt(ACPI_MADT_LAPIC_NMI, acpi_parse_lapic_nmi, 0) 
< 0)
                printk(KERN_ERR PREFIX "Error parsing LAPIC NMI entry\n");
diff -r 663c487a5f2c -r 03ea37841682 xen/drivers/acpi/tables.c
--- a/xen/drivers/acpi/tables.c Wed Dec 21 14:49:31 2005
+++ b/xen/drivers/acpi/tables.c Wed Dec 21 14:53:40 2005
@@ -607,3 +607,60 @@
 
        return 0;
 }
+
+int __init
+acpi_table_count_madt_family (
+       enum acpi_table_id      id,
+       unsigned long           madt_size,
+       int                     entry_id)
+{
+       void                    *madt = NULL;
+       acpi_table_entry_header *entry;
+       unsigned int            count = 0;
+       unsigned long           madt_end;
+       unsigned int            i;
+
+       /* Locate the MADT (if exists). There should only be one. */
+
+       for (i = 0; i < sdt_count; i++) {
+               if (sdt_entry[i].id != id)
+                       continue;
+               madt = (void *)
+                       __acpi_map_table(sdt_entry[i].pa, sdt_entry[i].size);
+               if (!madt) {
+                       printk(KERN_WARNING PREFIX "Unable to map %s\n",
+                               acpi_table_signatures[id]);
+                       return -ENODEV;
+               }
+               break;
+       }
+
+       if (!madt) {
+               printk(KERN_WARNING PREFIX "%s not present\n",
+                       acpi_table_signatures[id]);
+               return -ENODEV;
+       }
+
+       madt_end = (unsigned long) madt + sdt_entry[i].size;
+
+       /* Parse all entries looking for a match. */
+
+       entry = (acpi_table_entry_header *)
+               ((unsigned long) madt + madt_size);
+
+       while (((unsigned long) entry) + sizeof(acpi_table_entry_header) < 
madt_end) {
+               if (entry->type == entry_id) count++;
+
+               entry = (acpi_table_entry_header *)
+                       ((unsigned long) entry + entry->length);
+       }
+
+       return count;
+}
+
+
+int __init
+acpi_table_count_madt (enum acpi_madt_entry_id id)
+{
+       return acpi_table_count_madt_family(ACPI_APIC, sizeof(struct 
acpi_table_madt), id);
+}
diff -r 663c487a5f2c -r 03ea37841682 xen/include/xen/acpi.h
--- a/xen/include/xen/acpi.h    Wed Dec 21 14:49:31 2005
+++ b/xen/include/xen/acpi.h    Wed Dec 21 14:53:40 2005
@@ -390,6 +390,7 @@
 void acpi_table_print (struct acpi_table_header *header, unsigned long 
phys_addr);
 void acpi_table_print_madt_entry (acpi_table_entry_header *madt);
 void acpi_table_print_srat_entry (acpi_table_entry_header *srat);
+int acpi_table_count_madt (enum acpi_madt_entry_id id);
 
 /* the following four functions are architecture-dependent */
 void acpi_numa_slit_init (struct acpi_table_slit *slit);

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] This patch is intended to correct the number of CPUs., Xen patchbot -unstable <=