summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_sched.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/kern_sched.c')
-rw-r--r--sys/kern/kern_sched.c54
1 files changed, 52 insertions, 2 deletions
diff --git a/sys/kern/kern_sched.c b/sys/kern/kern_sched.c
index cf45011b853..f566795dc60 100644
--- a/sys/kern/kern_sched.c
+++ b/sys/kern/kern_sched.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_sched.c,v 1.47 2017/12/14 23:21:04 dlg Exp $ */
+/* $OpenBSD: kern_sched.c,v 1.48 2018/06/19 19:29:52 kettenis Exp $ */
/*
* Copyright (c) 2007, 2008 Artur Grabowski <art@openbsd.org>
*
@@ -56,6 +56,8 @@ uint64_t sched_wasidle; /* Times we came out of idle */
struct taskq *sbartq;
#endif
+int sched_smt;
+
/*
* A few notes about cpu_switchto that is implemented in MD code.
*
@@ -97,6 +99,11 @@ sched_init_cpu(struct cpu_info *ci)
* structures.
*/
cpuset_init_cpu(ci);
+
+#ifdef __HAVE_CPU_TOPOLOGY
+ if (!sched_smt && ci->ci_smt_id > 0)
+ return;
+#endif
cpuset_add(&sched_all_cpus, ci);
}
@@ -615,9 +622,13 @@ sched_start_secondary_cpus(void)
if (CPU_IS_PRIMARY(ci))
continue;
- cpuset_add(&sched_all_cpus, ci);
atomic_clearbits_int(&spc->spc_schedflags,
SPCF_SHOULDHALT | SPCF_HALTED);
+#ifdef __HAVE_CPU_TOPOLOGY
+ if (!sched_smt && ci->ci_smt_id > 0)
+ continue;
+#endif
+ cpuset_add(&sched_all_cpus, ci);
}
}
@@ -793,3 +804,42 @@ cpuset_complement(struct cpuset *to, struct cpuset *a, struct cpuset *b)
for (i = 0; i < CPUSET_ASIZE(ncpus); i++)
to->cs_set[i] = b->cs_set[i] & ~a->cs_set[i];
}
+
+#ifdef __HAVE_CPU_TOPOLOGY
+
+#include <sys/sysctl.h>
+
+int
+sysctl_hwsmt(void *oldp, size_t *oldlenp, void *newp, size_t newlen)
+{
+ CPU_INFO_ITERATOR cii;
+ struct cpu_info *ci;
+ int err, newsmt;
+
+ newsmt = sched_smt;
+ err = sysctl_int(oldp, oldlenp, newp, newlen, &newsmt);
+ if (err)
+ return err;
+ if (newsmt > 1)
+ newsmt = 1;
+ if (newsmt < 0)
+ newsmt = 0;
+ if (newsmt == sched_smt)
+ return 0;
+
+ sched_smt = newsmt;
+ CPU_INFO_FOREACH(cii, ci) {
+ if (CPU_IS_PRIMARY(ci))
+ continue;
+ if (ci->ci_smt_id == 0)
+ continue;
+ if (sched_smt)
+ cpuset_add(&sched_all_cpus, ci);
+ else
+ cpuset_del(&sched_all_cpus, ci);
+ }
+
+ return 0;
+}
+
+#endif