Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/sys Some more CPU topology stuff:



details:   https://anonhg.NetBSD.org/src/rev/eec32f92c67c
branches:  trunk
changeset: 1005784:eec32f92c67c
user:      ad <ad%NetBSD.org@localhost>
date:      Fri Dec 20 21:05:33 2019 +0000

description:
Some more CPU topology stuff:

- Use cegger@'s ACPI SRAT parsing code to figure out NUMA node ID for each
  CPU as it is attached.

- For scheduler experiments with SMT, flag CPUs with the lowest numbered SMT
  IDs as "primaries", link back to the primaries from secondaries, and build
  a circular list of CPUs in each package with identical SMT IDs.

- No need for package/core/smt/numa IDs to be anything other than a u_int.

diffstat:

 sys/arch/aarch64/aarch64/cpu.c     |    7 +-
 sys/arch/aarch64/aarch64/cpufunc.c |    8 +-
 sys/arch/arm/arm32/arm32_boot.c    |    8 +-
 sys/arch/arm/arm32/cpu.c           |    8 +-
 sys/arch/macppc/macppc/cpu.c       |    6 +-
 sys/arch/mips/mips/cpu_subr.c      |    6 +-
 sys/arch/x86/x86/cpu.c             |   18 +++++-
 sys/arch/x86/x86/cpu_topology.c    |   40 ++++++++++-
 sys/arch/x86/x86/identcpu.c        |    7 +-
 sys/kern/kern_cpu.c                |  117 ++++++++++++++++++++++++------------
 sys/sys/cpu.h                      |    5 +-
 sys/sys/cpu_data.h                 |   13 ++-
 sys/sys/sched.h                    |    3 +-
 13 files changed, 169 insertions(+), 77 deletions(-)

diffs (truncated from 640 to 300 lines):

diff -r d1a594a3cda2 -r eec32f92c67c sys/arch/aarch64/aarch64/cpu.c
--- a/sys/arch/aarch64/aarch64/cpu.c    Fri Dec 20 20:54:48 2019 +0000
+++ b/sys/arch/aarch64/aarch64/cpu.c    Fri Dec 20 21:05:33 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.c,v 1.26 2019/11/22 05:21:19 mlelstv Exp $ */
+/* $NetBSD: cpu.c,v 1.27 2019/12/20 21:05:33 ad Exp $ */
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <ryo%nerv.org@localhost>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: cpu.c,v 1.26 2019/11/22 05:21:19 mlelstv Exp $");
+__KERNEL_RCSID(1, "$NetBSD: cpu.c,v 1.27 2019/12/20 21:05:33 ad Exp $");
 
 #include "locators.h"
 #include "opt_arm_debug.h"
@@ -230,8 +230,7 @@
 
        aprint_naive("\n");
        aprint_normal(": %s\n", model);
-       aprint_normal_dev(ci->ci_dev, "package %lu, core %lu, smt %lu\n",
-           ci->ci_package_id, ci->ci_core_id, ci->ci_smt_id);
+       cpu_topology_print(ci);
 }
 
 static void
diff -r d1a594a3cda2 -r eec32f92c67c sys/arch/aarch64/aarch64/cpufunc.c
--- a/sys/arch/aarch64/aarch64/cpufunc.c        Fri Dec 20 20:54:48 2019 +0000
+++ b/sys/arch/aarch64/aarch64/cpufunc.c        Fri Dec 20 21:05:33 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cpufunc.c,v 1.11 2019/12/05 05:45:52 ryo Exp $ */
+/*     $NetBSD: cpufunc.c,v 1.12 2019/12/20 21:05:33 ad Exp $  */
 
 /*
  * Copyright (c) 2017 Ryo Shimizu <ryo%nerv.org@localhost>
@@ -29,7 +29,7 @@
 #include "opt_multiprocessor.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.11 2019/12/05 05:45:52 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.12 2019/12/20 21:05:33 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -96,11 +96,13 @@
                cpu_topology_set(ci,
                    __SHIFTOUT(mpidr, MPIDR_AFF2),
                    __SHIFTOUT(mpidr, MPIDR_AFF1),
-                   __SHIFTOUT(mpidr, MPIDR_AFF0));
+                   __SHIFTOUT(mpidr, MPIDR_AFF0),
+                   0);
        } else {
                cpu_topology_set(ci,
                    __SHIFTOUT(mpidr, MPIDR_AFF1),
                    __SHIFTOUT(mpidr, MPIDR_AFF0),
+                   0,
                    0);
        }
 }
diff -r d1a594a3cda2 -r eec32f92c67c sys/arch/arm/arm32/arm32_boot.c
--- a/sys/arch/arm/arm32/arm32_boot.c   Fri Dec 20 20:54:48 2019 +0000
+++ b/sys/arch/arm/arm32/arm32_boot.c   Fri Dec 20 21:05:33 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: arm32_boot.c,v 1.34 2019/12/02 23:22:43 ad Exp $       */
+/*     $NetBSD: arm32_boot.c,v 1.35 2019/12/20 21:05:33 ad Exp $       */
 
 /*
  * Copyright (c) 2002, 2003, 2005  Genetec Corporation.  All rights reserved.
@@ -122,7 +122,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: arm32_boot.c,v 1.34 2019/12/02 23:22:43 ad Exp $");
+__KERNEL_RCSID(1, "$NetBSD: arm32_boot.c,v 1.35 2019/12/20 21:05:33 ad Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_cputypes.h"
@@ -361,11 +361,13 @@
                cpu_topology_set(ci,
                    __SHIFTOUT(mpidr, MPIDR_AFF2),
                    __SHIFTOUT(mpidr, MPIDR_AFF1),
-                   __SHIFTOUT(mpidr, MPIDR_AFF0));
+                   __SHIFTOUT(mpidr, MPIDR_AFF0),
+                   0);
        } else {
                cpu_topology_set(ci,
                    __SHIFTOUT(mpidr, MPIDR_AFF1),
                    __SHIFTOUT(mpidr, MPIDR_AFF0),
+                   0,
                    0);
        }
 
diff -r d1a594a3cda2 -r eec32f92c67c sys/arch/arm/arm32/cpu.c
--- a/sys/arch/arm/arm32/cpu.c  Fri Dec 20 20:54:48 2019 +0000
+++ b/sys/arch/arm/arm32/cpu.c  Fri Dec 20 21:05:33 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cpu.c,v 1.135 2019/12/02 23:22:43 ad Exp $     */
+/*     $NetBSD: cpu.c,v 1.136 2019/12/20 21:05:33 ad Exp $     */
 
 /*
  * Copyright (c) 1995 Mark Brinicombe.
@@ -46,7 +46,7 @@
 #include "opt_multiprocessor.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.135 2019/12/02 23:22:43 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.136 2019/12/20 21:05:33 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/conf.h>
@@ -114,11 +114,13 @@
                        cpu_topology_set(ci,
                            __SHIFTOUT(mpidr, MPIDR_AFF2),
                            __SHIFTOUT(mpidr, MPIDR_AFF1),
-                           __SHIFTOUT(mpidr, MPIDR_AFF0));
+                           __SHIFTOUT(mpidr, MPIDR_AFF0),
+                           0);
                } else {
                        cpu_topology_set(ci,
                            __SHIFTOUT(mpidr, MPIDR_AFF1),
                            __SHIFTOUT(mpidr, MPIDR_AFF0),
+                           0,
                            0);
                }
 #endif
diff -r d1a594a3cda2 -r eec32f92c67c sys/arch/macppc/macppc/cpu.c
--- a/sys/arch/macppc/macppc/cpu.c      Fri Dec 20 20:54:48 2019 +0000
+++ b/sys/arch/macppc/macppc/cpu.c      Fri Dec 20 21:05:33 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cpu.c,v 1.68 2019/12/13 23:01:41 macallan Exp $        */
+/*     $NetBSD: cpu.c,v 1.69 2019/12/20 21:05:33 ad Exp $      */
 
 /*-
  * Copyright (c) 2001 Tsubai Masanari.
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.68 2019/12/13 23:01:41 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.69 2019/12/20 21:05:33 ad Exp $");
 
 #include "opt_ppcparam.h"
 #include "opt_multiprocessor.h"
@@ -175,7 +175,7 @@
                core = package & 1;
                package >>= 1;
        }
-       cpu_topology_set(ci, package, core, 0);
+       cpu_topology_set(ci, package, core, 0, 0);
 
        if (ci->ci_khz == 0) {
                cpu_OFgetspeed(self, ci);
diff -r d1a594a3cda2 -r eec32f92c67c sys/arch/mips/mips/cpu_subr.c
--- a/sys/arch/mips/mips/cpu_subr.c     Fri Dec 20 20:54:48 2019 +0000
+++ b/sys/arch/mips/mips/cpu_subr.c     Fri Dec 20 21:05:33 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cpu_subr.c,v 1.40 2019/12/03 15:20:59 riastradh Exp $  */
+/*     $NetBSD: cpu_subr.c,v 1.41 2019/12/20 21:05:33 ad Exp $ */
 
 /*-
  * Copyright (c) 2010, 2019 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.40 2019/12/03 15:20:59 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.41 2019/12/20 21:05:33 ad Exp $");
 
 #include "opt_cputype.h"
 #include "opt_ddb.h"
@@ -189,7 +189,7 @@
        ci->ci_divisor_recip = cpu_info_store.ci_divisor_recip;
        ci->ci_cpuwatch_count = cpu_info_store.ci_cpuwatch_count;
 
-       cpu_topology_set(ci, cpu_package_id, cpu_core_id, cpu_smt_id);
+       cpu_topology_set(ci, cpu_package_id, cpu_core_id, cpu_smt_id, 0);
 
        pmap_md_alloc_ephemeral_address_space(ci);
 
diff -r d1a594a3cda2 -r eec32f92c67c sys/arch/x86/x86/cpu.c
--- a/sys/arch/x86/x86/cpu.c    Fri Dec 20 20:54:48 2019 +0000
+++ b/sys/arch/x86/x86/cpu.c    Fri Dec 20 21:05:33 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cpu.c,v 1.178 2019/12/07 11:45:45 nonaka Exp $ */
+/*     $NetBSD: cpu.c,v 1.179 2019/12/20 21:05:34 ad Exp $     */
 
 /*
  * Copyright (c) 2000-2012 NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.178 2019/12/07 11:45:45 nonaka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.179 2019/12/20 21:05:34 ad Exp $");
 
 #include "opt_ddb.h"
 #include "opt_mpbios.h"                /* for MPDEBUG */
@@ -72,6 +72,7 @@
 
 #include "lapic.h"
 #include "ioapic.h"
+#include "acpica.h"
 
 #include <sys/param.h>
 #include <sys/proc.h>
@@ -106,6 +107,10 @@
 
 #include <x86/fpu.h>
 
+#if NACPICA > 0
+#include <dev/acpi/acpi_srat.h>
+#endif
+
 #if NLAPIC > 0
 #include <machine/apicvar.h>
 #include <machine/i82489reg.h>
@@ -404,6 +409,10 @@
                cpu_init_tss(ci);
        } else {
                KASSERT(ci->ci_data.cpu_idlelwp != NULL);
+#if NACPICA > 0
+               /* Parse out NUMA info for cpu_identify(). */
+               acpisrat_init();
+#endif
        }
 
 #ifdef SVS
@@ -706,6 +715,11 @@
        x86_patch(false);
 #endif
 
+#if NACPICA > 0
+       /* Finished with NUMA info for now. */
+       acpisrat_exit();
+#endif
+
        kcpuset_create(&cpus, true);
        kcpuset_set(cpus, cpu_index(curcpu()));
        for (i = 0; i < maxcpus; i++) {
diff -r d1a594a3cda2 -r eec32f92c67c sys/arch/x86/x86/cpu_topology.c
--- a/sys/arch/x86/x86/cpu_topology.c   Fri Dec 20 20:54:48 2019 +0000
+++ b/sys/arch/x86/x86/cpu_topology.c   Fri Dec 20 21:05:33 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cpu_topology.c,v 1.15 2019/12/02 23:22:43 ad Exp $     */
+/*     $NetBSD: cpu_topology.c,v 1.16 2019/12/20 21:05:34 ad Exp $     */
 
 /*-
  * Copyright (c) 2009 Mindaugas Rasiukevicius <rmind at NetBSD org>,
@@ -36,7 +36,9 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu_topology.c,v 1.15 2019/12/02 23:22:43 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu_topology.c,v 1.16 2019/12/20 21:05:34 ad Exp $");
+
+#include "acpica.h"
 
 #include <sys/param.h>
 #include <sys/bitops.h>
@@ -44,10 +46,33 @@
 
 #include <machine/specialreg.h>
 
+#include <dev/acpi/acpi_srat.h>
+
 #include <x86/cpufunc.h>
 #include <x86/cputypes.h>
 #include <x86/cpuvar.h>
 
+static uint32_t
+x86_cpu_get_numa_node(uint32_t apic_id)
+{
+#if NACPICA > 0
+       uint32_t i, j, nn, nc;
+       struct acpisrat_cpu c;
+
+       nn = acpisrat_nodes();
+       for (i = 0; i < nn; i++) {
+               nc = acpisrat_node_cpus(i);
+               for (j = 0; j < nc; j++) {
+                       acpisrat_cpu(i, j, &c);
+                       if (c.apicid == apic_id) {
+                               return c.nodeid;
+                       }
+               }
+       }
+#endif
+       return 0;
+}
+
 void
 x86_cpu_topology(struct cpu_info *ci)
 {
@@ -55,7 +80,7 @@
        u_int core_max;         /* Core per package */
        int n, cpu_family, apic_id, smt_bits, core_bits = 0;
        uint32_t descs[4];
-       int package_id, core_id, smt_id;



Home | Main Index | Thread Index | Old Index