Module Name: src
Committed By: ad
Date: Sun Jan 12 13:29:24 UTC 2020
Modified Files:
src/sys/kern: subr_cpu.c
src/sys/sys: cpu_data.h
Log Message:
cpu topology:
- Fix a stupid bug where it complained about non-existent SMT on assymetric
systems.
- Give each CPU a pointer back to the first CPU in same package.
To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/kern/subr_cpu.c
cvs rdiff -u -r1.47 -r1.48 src/sys/sys/cpu_data.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/kern/subr_cpu.c
diff -u src/sys/kern/subr_cpu.c:1.7 src/sys/kern/subr_cpu.c:1.8
--- src/sys/kern/subr_cpu.c:1.7 Sun Jan 12 09:29:18 2020
+++ src/sys/kern/subr_cpu.c Sun Jan 12 13:29:24 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_cpu.c,v 1.7 2020/01/12 09:29:18 mrg Exp $ */
+/* $NetBSD: subr_cpu.c,v 1.8 2020/01/12 13:29:24 ad Exp $ */
/*-
* Copyright (c) 2007, 2008, 2009, 2010, 2012, 2019, 2020
@@ -61,7 +61,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_cpu.c,v 1.7 2020/01/12 09:29:18 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_cpu.c,v 1.8 2020/01/12 13:29:24 ad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -207,6 +207,8 @@ cpu_topology_dump(void)
}
printf("\n");
}
+ printf("%s first in package: %s\n", cpu_name(ci),
+ cpu_name(ci->ci_package1st));
}
#endif /* DEBUG */
}
@@ -229,6 +231,7 @@ cpu_topology_fake1(struct cpu_info *ci)
}
ci->ci_schedstate.spc_flags |=
(SPCF_CORE1ST | SPCF_PACKAGE1ST | SPCF_1STCLASS);
+ ci->ci_package1st = ci;
}
/*
@@ -338,8 +341,9 @@ cpu_topology_init(void)
ci3->ci_schedstate.spc_flags |= SPCF_PACKAGE1ST;
/* Walk through all CPUs in package and point to first. */
- ci2 = ci;
+ ci2 = ci3;
do {
+ ci2->ci_package1st = ci3;
ci2->ci_sibling[CPUREL_PACKAGE1ST] = ci3;
ci2 = ci2->ci_sibling[CPUREL_PACKAGE];
} while (ci2 != ci);
@@ -376,7 +380,7 @@ cpu_topology_init(void)
* others, mark first class CPUs for the scheduler. This
* conflicts with SMT right now so whinge if observed.
*/
- if (curcpu()->ci_nsibling[CPUREL_CORE] == 1) {
+ if (curcpu()->ci_nsibling[CPUREL_CORE] > 1) {
printf("cpu_topology_init: asymmetric & SMT??\n");
}
for (CPU_INFO_FOREACH(cii, ci)) {
Index: src/sys/sys/cpu_data.h
diff -u src/sys/sys/cpu_data.h:1.47 src/sys/sys/cpu_data.h:1.48
--- src/sys/sys/cpu_data.h:1.47 Thu Jan 9 16:35:03 2020
+++ src/sys/sys/cpu_data.h Sun Jan 12 13:29:24 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu_data.h,v 1.47 2020/01/09 16:35:03 ad Exp $ */
+/* $NetBSD: cpu_data.h,v 1.48 2020/01/12 13:29:24 ad Exp $ */
/*-
* Copyright (c) 2004, 2006, 2007, 2008, 2019 The NetBSD Foundation, Inc.
@@ -151,6 +151,7 @@ struct cpu_data {
bool cpu_is_slow;
u_int cpu_nsibling[CPUREL_COUNT];
struct cpu_info *cpu_sibling[CPUREL_COUNT];
+ struct cpu_info *cpu_package1st; /* 1st CPU in our package */
/*
* This section is mostly CPU-private.
@@ -203,6 +204,7 @@ struct cpu_data {
#define ci_is_slow ci_data.cpu_is_slow
#define ci_nsibling ci_data.cpu_nsibling
#define ci_sibling ci_data.cpu_sibling
+#define ci_package1st ci_data.cpu_package1st
#define ci_faultrng ci_data.cpu_faultrng
#define ci_counts ci_data.cpu_counts