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
 

Reply via email to