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

[Xen-changelog] This patch is intended to correct the number of CPUs.



# 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


 


Rackspace

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