[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |