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