From nobody Tue Feb 3 02:43:25 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4f4nq22HKgz6QxPF for ; Tue, 03 Feb 2026 02:43:26 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R13" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4f4nq204qHz3g0m for ; Tue, 03 Feb 2026 02:43:26 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1770086606; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=6+bNbdV4Zkje9qMIdI387nDt0aVkoa+mWt5XvARBMtg=; b=MG0KnUs9YMd3LfOF4OfGTVZnTUxCQnNovozwl4CNVTu/TftWc2CiGx3AuuUuIeGRMoxpdM WrTEtNQonA283tIJm7t/IXAJukYE4ZQCkKZQ5BBkD3wx4wQEp50K8ISgZKJGSpo5StWbTz r2DTuRSnFBEnqZ/kXFdDRBovxAC3v1tiisYriXBH5bw3xadRZTz6+nvbJ4y7PGlCIOvSII qd5WtArclchY131KCkGvDTG7NjJsRj2atf32WIjCOvXRQyRPRJCvoduVe/Ae6ZGRyRjexw GaiOdqLLDeNBMGjEq+puQiyFlc2DA78jxGbd0J1NR2kHLLoL434XGmBsQmHwmg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1770086606; a=rsa-sha256; cv=none; b=OpcwADJs6nSgtiAMGN4NUciLpSPJWeJSbA4hKXAje3+2BRNsqKLy82p89FHupndcrHwQt8 +2hA7Pm9kBKDZ0ccYqf7Gd+zleU2bxFu/b6SH5A4y5lfSqjJRp7h931IUl8h8HEDV7HpXZ 4GkEEGkneBdfcW97QIwCr4aDzvWk/xbXvPYUwoCOzCOiLVqpO7ZC6mrRjOJ62TeikFDGqc iUWGPDZ4ZrUu46vB1iUC5dza4afgxZUQHggzX5fPlIkNzm+5bO0DPqrkaej/xvi7yVRhqD 2WPQU/JrDvrWfmegZC12tDkF1S0iMOZd2Q87KVDSFn6qF2bzcS59wWK51KyNzw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1770086606; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=6+bNbdV4Zkje9qMIdI387nDt0aVkoa+mWt5XvARBMtg=; b=GLzYxfjN5JgG2blk7Hk41vGQlDmDbwQT3lrGM3iX6vokRNeayDGMKlfEtdBGp8M+SsnqQi El13HzaeHXWihRnxxTRVaVwZmPU1XV5AQZZRerJR+h7Z1o98vOnK3RB9hBgJ0FY66ThwI1 UKBlFlCQSzMRGpfwcvCrWe7fAs/sYgiaydsRQjzPGo1i4ap7pSFRjwwyP0esaQRcHkaSkJ W41QougbkTykcsdDntKXExjPoP6KUYiCVS9+ww4cAQsOC5DQJw0YjhC4HPEZVxXkd+d2rC 1timjPlVdp/rDgAiSW4vuUqboow+9G8R4pV3/Tz8iAuONso+5dhK5VRDWiVJNg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4f4nq16VS7ztsv for ; Tue, 03 Feb 2026 02:43:25 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3ac93 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 03 Feb 2026 02:43:25 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: 120ca8d74b46 - main - Re-introduce kern.sched.topology_spec List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 120ca8d74b46caa260702485e30fe5f9f9984682 Auto-Submitted: auto-generated Date: Tue, 03 Feb 2026 02:43:25 +0000 Message-Id: <698160cd.3ac93.4cb02c9b@gitrepo.freebsd.org> The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=120ca8d74b46caa260702485e30fe5f9f9984682 commit 120ca8d74b46caa260702485e30fe5f9f9984682 Author: Konstantin Belousov AuthorDate: 2026-02-02 20:22:46 +0000 Commit: Konstantin Belousov CommitDate: 2026-02-03 02:43:18 +0000 Re-introduce kern.sched.topology_spec Move it back from kern.sched.ule.topology_spec. Make it scheduler-agnostic. Provide trivial report for UP kernels. Apparently the MIB is used by some third-party software. Obviously it did not worked on UP or 4BSD configs. PR: 292574 Reviewed by: olce Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D55062 --- sys/kern/sched_shim.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++ sys/kern/sched_ule.c | 92 --------------------------------------------------- sys/kern/subr_smp.c | 81 ++++++++++++++++++++++++++------------------- sys/sys/smp.h | 9 +++-- 4 files changed, 144 insertions(+), 129 deletions(-) diff --git a/sys/kern/sched_shim.c b/sys/kern/sched_shim.c index ec5c42c37aab..83e4412494d3 100644 --- a/sys/kern/sched_shim.c +++ b/sys/kern/sched_shim.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -171,9 +172,12 @@ schedinit(void) active_sched->init(); } +struct cpu_group __read_mostly *cpu_top; /* CPU topology */ + static void sched_setup(void *dummy) { + cpu_top = smp_topo(); active_sched->setup(); } SYSINIT(sched_setup, SI_SUB_RUN_QUEUE, SI_ORDER_FIRST, sched_setup, NULL); @@ -232,3 +236,90 @@ SYSCTL_PROC(_kern_sched, OID_AUTO, available, fixpt_t ccpu; SYSCTL_UINT(_kern, OID_AUTO, ccpu, CTLFLAG_RD, &ccpu, 0, "Decay factor used for updating %CPU"); + +/* + * Build the CPU topology dump string. Is recursively called to collect + * the topology tree. + */ +static int +sysctl_kern_sched_topology_spec_internal(struct sbuf *sb, + struct cpu_group *cg, int indent) +{ + char cpusetbuf[CPUSETBUFSIZ]; + int i, first; + + if (cpu_top == NULL) { + sbuf_printf(sb, "%*s\n", + indent, ""); + sbuf_printf(sb, "%*s\n", indent, ""); + return (0); + } + + sbuf_printf(sb, "%*s\n", indent, + "", 1 + indent / 2, cg->cg_level); + sbuf_printf(sb, "%*s ", indent, "", + cg->cg_count, cpusetobj_strprint(cpusetbuf, &cg->cg_mask)); + first = TRUE; + for (i = cg->cg_first; i <= cg->cg_last; i++) { + if (CPU_ISSET(i, &cg->cg_mask)) { + if (!first) + sbuf_cat(sb, ", "); + else + first = FALSE; + sbuf_printf(sb, "%d", i); + } + } + sbuf_cat(sb, "\n"); + + if (cg->cg_flags != 0) { + sbuf_printf(sb, "%*s ", indent, ""); + if ((cg->cg_flags & CG_FLAG_HTT) != 0) + sbuf_cat(sb, "HTT group"); + if ((cg->cg_flags & CG_FLAG_THREAD) != 0) + sbuf_cat(sb, "THREAD group"); + if ((cg->cg_flags & CG_FLAG_SMT) != 0) + sbuf_cat(sb, "SMT group"); + if ((cg->cg_flags & CG_FLAG_NODE) != 0) + sbuf_cat(sb, "NUMA node"); + sbuf_cat(sb, "\n"); + } + + if (cg->cg_children > 0) { + sbuf_printf(sb, "%*s \n", indent, ""); + for (i = 0; i < cg->cg_children; i++) + sysctl_kern_sched_topology_spec_internal(sb, + &cg->cg_child[i], indent + 2); + sbuf_printf(sb, "%*s \n", indent, ""); + } + sbuf_printf(sb, "%*s\n", indent, ""); + return (0); +} + +/* + * Sysctl handler for retrieving topology dump. It's a wrapper for + * the recursive sysctl_kern_smp_topology_spec_internal(). + */ +static int +sysctl_kern_sched_topology_spec(SYSCTL_HANDLER_ARGS) +{ + struct sbuf *topo; + int err; + + topo = sbuf_new_for_sysctl(NULL, NULL, 512, req); + if (topo == NULL) + return (ENOMEM); + + sbuf_cat(topo, "\n"); + err = sysctl_kern_sched_topology_spec_internal(topo, cpu_top, 1); + sbuf_cat(topo, "\n"); + + if (err == 0) + err = sbuf_finish(topo); + sbuf_delete(topo); + return (err); +} + +SYSCTL_PROC(_kern_sched, OID_AUTO, topology_spec, CTLTYPE_STRING | + CTLFLAG_MPSAFE | CTLFLAG_RD, NULL, 0, + sysctl_kern_sched_topology_spec, "A", + "XML dump of detected CPU topology"); diff --git a/sys/kern/sched_ule.c b/sys/kern/sched_ule.c index ccad7947c4f5..c6bfe15e768b 100644 --- a/sys/kern/sched_ule.c +++ b/sys/kern/sched_ule.c @@ -304,7 +304,6 @@ struct tdq { atomic_load_short(&(tdq)->tdq_switchcnt) + 1)) #ifdef SMP -struct cpu_group __read_mostly *cpu_top; /* CPU topology */ #define SCHED_AFFINITY_DEFAULT (max(1, hz / 1000)) /* @@ -398,9 +397,6 @@ static void sched_balance(void); static bool sched_balance_pair(struct tdq *, struct tdq *); static inline struct tdq *sched_setcpu(struct thread *, int, int); static inline void thread_unblock_switch(struct thread *, struct mtx *); -static int sysctl_kern_sched_ule_topology_spec(SYSCTL_HANDLER_ARGS); -static int sysctl_kern_sched_ule_topology_spec_internal(struct sbuf *sb, - struct cpu_group *cg, int indent); #endif /* @@ -1590,7 +1586,6 @@ sched_setup_smp(void) struct tdq *tdq; int i; - cpu_top = smp_topo(); CPU_FOREACH(i) { tdq = DPCPU_ID_PTR(i, tdq); tdq_setup(tdq, i); @@ -3452,89 +3447,6 @@ struct sched_instance sched_ule_instance = { }; DECLARE_SCHEDULER(ule_sched_selector, "ULE", &sched_ule_instance); -#ifdef SMP - -/* - * Build the CPU topology dump string. Is recursively called to collect - * the topology tree. - */ -static int -sysctl_kern_sched_ule_topology_spec_internal(struct sbuf *sb, - struct cpu_group *cg, int indent) -{ - char cpusetbuf[CPUSETBUFSIZ]; - int i, first; - - sbuf_printf(sb, "%*s\n", indent, - "", 1 + indent / 2, cg->cg_level); - sbuf_printf(sb, "%*s ", indent, "", - cg->cg_count, cpusetobj_strprint(cpusetbuf, &cg->cg_mask)); - first = TRUE; - for (i = cg->cg_first; i <= cg->cg_last; i++) { - if (CPU_ISSET(i, &cg->cg_mask)) { - if (!first) - sbuf_cat(sb, ", "); - else - first = FALSE; - sbuf_printf(sb, "%d", i); - } - } - sbuf_cat(sb, "\n"); - - if (cg->cg_flags != 0) { - sbuf_printf(sb, "%*s ", indent, ""); - if ((cg->cg_flags & CG_FLAG_HTT) != 0) - sbuf_cat(sb, "HTT group"); - if ((cg->cg_flags & CG_FLAG_THREAD) != 0) - sbuf_cat(sb, "THREAD group"); - if ((cg->cg_flags & CG_FLAG_SMT) != 0) - sbuf_cat(sb, "SMT group"); - if ((cg->cg_flags & CG_FLAG_NODE) != 0) - sbuf_cat(sb, "NUMA node"); - sbuf_cat(sb, "\n"); - } - - if (cg->cg_children > 0) { - sbuf_printf(sb, "%*s \n", indent, ""); - for (i = 0; i < cg->cg_children; i++) - sysctl_kern_sched_ule_topology_spec_internal(sb, - &cg->cg_child[i], indent+2); - sbuf_printf(sb, "%*s \n", indent, ""); - } - sbuf_printf(sb, "%*s\n", indent, ""); - return (0); -} - -/* - * Sysctl handler for retrieving topology dump. It's a wrapper for - * the recursive sysctl_kern_smp_topology_spec_internal(). - */ -static int -sysctl_kern_sched_ule_topology_spec(SYSCTL_HANDLER_ARGS) -{ - struct sbuf *topo; - int err; - - if (cpu_top == NULL) - return (ENOTTY); - - topo = sbuf_new_for_sysctl(NULL, NULL, 512, req); - if (topo == NULL) - return (ENOMEM); - - sbuf_cat(topo, "\n"); - err = sysctl_kern_sched_ule_topology_spec_internal(topo, cpu_top, 1); - sbuf_cat(topo, "\n"); - - if (err == 0) { - err = sbuf_finish(topo); - } - sbuf_delete(topo); - return (err); -} - -#endif - static int sysctl_kern_quantum(SYSCTL_HANDLER_ARGS) { @@ -3597,8 +3509,4 @@ SYSCTL_INT(_kern_sched_ule, OID_AUTO, trysteal_limit, CTLFLAG_RWTUN, SYSCTL_INT(_kern_sched_ule, OID_AUTO, always_steal, CTLFLAG_RWTUN, &always_steal, 0, "Always run the stealer from the idle thread"); -SYSCTL_PROC(_kern_sched_ule, OID_AUTO, topology_spec, CTLTYPE_STRING | - CTLFLAG_MPSAFE | CTLFLAG_RD, NULL, 0, - sysctl_kern_sched_ule_topology_spec, "A", - "XML dump of detected CPU topology"); #endif diff --git a/sys/kern/subr_smp.c b/sys/kern/subr_smp.c index 353a69435971..2256ba648e4d 100644 --- a/sys/kern/subr_smp.c +++ b/sys/kern/subr_smp.c @@ -50,9 +50,43 @@ #include "opt_sched.h" -#ifdef SMP MALLOC_DEFINE(M_TOPO, "toponodes", "SMP topology data"); +struct cpu_group * +smp_topo_alloc(u_int count) +{ + static struct cpu_group *group = NULL; + static u_int index; + u_int curr; + + if (group == NULL) { + group = mallocarray((mp_maxid + 1) * MAX_CACHE_LEVELS + 1, + sizeof(*group), M_DEVBUF, M_WAITOK | M_ZERO); + } + curr = index; + index += count; + return (&group[curr]); +} + +struct cpu_group * +smp_topo_none(void) +{ + struct cpu_group *top; + + top = smp_topo_alloc(1); + top->cg_parent = NULL; + top->cg_child = NULL; + top->cg_mask = all_cpus; + top->cg_count = mp_ncpus; + top->cg_children = 0; + top->cg_level = CG_SHARE_NONE; + top->cg_flags = 0; + + return (top); +} + +#ifdef SMP + volatile cpuset_t stopped_cpus; volatile cpuset_t started_cpus; volatile cpuset_t suspended_cpus; @@ -731,39 +765,6 @@ smp_topo(void) return (top); } -struct cpu_group * -smp_topo_alloc(u_int count) -{ - static struct cpu_group *group = NULL; - static u_int index; - u_int curr; - - if (group == NULL) { - group = mallocarray((mp_maxid + 1) * MAX_CACHE_LEVELS + 1, - sizeof(*group), M_DEVBUF, M_WAITOK | M_ZERO); - } - curr = index; - index += count; - return (&group[curr]); -} - -struct cpu_group * -smp_topo_none(void) -{ - struct cpu_group *top; - - top = smp_topo_alloc(1); - top->cg_parent = NULL; - top->cg_child = NULL; - top->cg_mask = all_cpus; - top->cg_count = mp_ncpus; - top->cg_children = 0; - top->cg_level = CG_SHARE_NONE; - top->cg_flags = 0; - - return (top); -} - static int smp_topo_addleaf(struct cpu_group *parent, struct cpu_group *child, int share, int count, int flags, int start) @@ -901,6 +902,18 @@ smp_rendezvous(void (*setup_func)(void *), arg); } +struct cpu_group * +smp_topo(void) +{ + static struct cpu_group *top = NULL; + + if (top != NULL) + return (top); + + top = smp_topo_none(); + return (top); +} + /* * Provide dummy SMP support for UP kernels. Modules that need to use SMP * APIs will still work using this dummy support. diff --git a/sys/sys/smp.h b/sys/sys/smp.h index fdb69b13c0d4..493dc91043bd 100644 --- a/sys/sys/smp.h +++ b/sys/sys/smp.h @@ -89,6 +89,8 @@ struct cpu_group { typedef struct cpu_group *cpu_group_t; +extern cpu_group_t cpu_top; + /* * Defines common resources for CPUs in the group. The highest level * resource should be used when multiple are shared. @@ -147,9 +149,6 @@ int topo_analyze(struct topo_node *topo_root, int all, #define TOPO_FOREACH(i, root) \ for (i = root; i != NULL; i = topo_next_node(root, i)) -struct cpu_group *smp_topo(void); -struct cpu_group *smp_topo_alloc(u_int count); -struct cpu_group *smp_topo_none(void); struct cpu_group *smp_topo_1level(int l1share, int l1count, int l1flags); struct cpu_group *smp_topo_2level(int l2share, int l2count, int l1share, int l1count, int l1flags); @@ -166,6 +165,10 @@ extern cpuset_t hlt_cpus_mask; /* XXX 'mask' is detail in old impl */ extern cpuset_t logical_cpus_mask; #endif /* SMP */ +struct cpu_group *smp_topo(void); +struct cpu_group *smp_topo_alloc(u_int count); +struct cpu_group *smp_topo_none(void); + extern u_int mp_maxid; extern int mp_maxcpus; extern int mp_ncores;