summaryrefslogtreecommitdiffstats
path: root/sys/amd64/amd64/mp_machdep.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2009-04-22 21:40:37 +0000
committerjhb <jhb@FreeBSD.org>2009-04-22 21:40:37 +0000
commit5ff418d07144cf4e3e408792042d9be38a391296 (patch)
tree8e44dd5c2be65e206ddba4a7a6a8b2c55ec00efe /sys/amd64/amd64/mp_machdep.c
parentcb075fbf998f15ec0a9d6630f5aa9d18c492247f (diff)
downloadFreeBSD-src-5ff418d07144cf4e3e408792042d9be38a391296.zip
FreeBSD-src-5ff418d07144cf4e3e408792042d9be38a391296.tar.gz
Adjust the way we number CPUs on x86 so that we attempt to "group" all
logical CPUs in a package. We do this by numbering the non-boot CPUs by starting with the first CPU whose APIC ID is after the boot CPU and wrapping back around to APIC ID 0 if needed rather than always starting at APIC ID 0. While here, adjust the cpu_mp_announce() routine to list CPUs based on the mapping established by assign_cpu_ids() rather than making assumptions about the algorithm assign_cpu_ids() uses. MFC after: 1 month
Diffstat (limited to 'sys/amd64/amd64/mp_machdep.c')
-rw-r--r--sys/amd64/amd64/mp_machdep.c50
1 files changed, 29 insertions, 21 deletions
diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c
index 59e3e9b..a45b398 100644
--- a/sys/amd64/amd64/mp_machdep.c
+++ b/sys/amd64/amd64/mp_machdep.c
@@ -354,8 +354,6 @@ cpu_mp_start(void)
} else
KASSERT(boot_cpu_id == PCPU_GET(apic_id),
("BSP's APIC ID doesn't match boot_cpu_id"));
- cpu_apic_ids[0] = boot_cpu_id;
- apic_cpuids[boot_cpu_id] = 0;
/* Setup the initial logical CPUs info. */
logical_cpus = logical_cpus_mask = 0;
@@ -418,28 +416,30 @@ cpu_mp_start(void)
void
cpu_mp_announce(void)
{
- int i, x;
const char *hyperthread;
+ int i;
- /* List CPUs */
+ /* List active CPUs first. */
printf(" cpu0 (BSP): APIC ID: %2d\n", boot_cpu_id);
- for (i = 1, x = 0; x <= MAX_APIC_ID; x++) {
- if (!cpu_info[x].cpu_present || cpu_info[x].cpu_bsp)
+ for (i = 1; i < mp_ncpus; i++) {
+ if (cpu_info[cpu_apic_ids[i]].cpu_hyperthread)
+ hyperthread = "/HT";
+ else
+ hyperthread = "";
+ printf(" cpu%d (AP%s): APIC ID: %2d\n", i, hyperthread,
+ cpu_apic_ids[i]);
+ }
+
+ /* List disabled CPUs last. */
+ for (i = 0; i <= MAX_APIC_ID; i++) {
+ if (!cpu_info[i].cpu_present || !cpu_info[i].cpu_disabled)
continue;
- if (cpu_info[x].cpu_hyperthread) {
+ if (cpu_info[i].cpu_hyperthread)
hyperthread = "/HT";
- } else {
+ else
hyperthread = "";
- }
- if (cpu_info[x].cpu_disabled)
- printf(" cpu (AP%s): APIC ID: %2d (disabled)\n",
- hyperthread, x);
- else {
- KASSERT(i < mp_ncpus,
- ("mp_ncpus and actual cpus are out of whack"));
- printf(" cpu%d (AP%s): APIC ID: %2d\n", i++,
- hyperthread, x);
- }
+ printf(" cpu (AP%s): APIC ID: %2d (disabled)\n", hyperthread,
+ i);
}
}
@@ -693,11 +693,19 @@ assign_cpu_ids(void)
/*
* Assign CPU IDs to local APIC IDs and disable any CPUs
- * beyond MAXCPU. CPU 0 has already been assigned to the BSP,
- * so we only have to assign IDs for APs.
+ * beyond MAXCPU. CPU 0 is always assigned to the BSP.
+ *
+ * To minimize confusion for userland, we attempt to number
+ * CPUs such that all threads and cores in a package are
+ * grouped together. For now we assume that the BSP is always
+ * the first thread in a package and just start adding APs
+ * starting with the BSP's APIC ID.
*/
mp_ncpus = 1;
- for (i = 0; i <= MAX_APIC_ID; i++) {
+ cpu_apic_ids[0] = boot_cpu_id;
+ apic_cpuids[boot_cpu_id] = 0;
+ for (i = boot_cpu_id + 1; i != boot_cpu_id;
+ i == MAX_APIC_ID ? i = 0 : i++) {
if (!cpu_info[i].cpu_present || cpu_info[i].cpu_bsp ||
cpu_info[i].cpu_disabled)
continue;
OpenPOWER on IntegriCloud