Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch Remove the LazyFPU code, as posted 5 months ago on ...
details: https://anonhg.NetBSD.org/src/rev/c0ab03403d46
branches: trunk
changeset: 454940:c0ab03403d46
user: maxv <maxv%NetBSD.org@localhost>
date: Thu Oct 03 05:06:29 2019 +0000
description:
Remove the LazyFPU code, as posted 5 months ago on port-amd64@.
diffstat:
sys/arch/amd64/amd64/locore.S | 7 +-
sys/arch/i386/i386/locore.S | 9 +-
sys/arch/x86/include/cpu.h | 3 +-
sys/arch/x86/x86/fpu.c | 190 ++--------------------------------------
sys/arch/x86/x86/identcpu.c | 5 +-
sys/arch/x86/x86/x86_machdep.c | 7 +-
6 files changed, 21 insertions(+), 200 deletions(-)
diffs (truncated from 379 to 300 lines):
diff -r 5cdd2b8c15fb -r c0ab03403d46 sys/arch/amd64/amd64/locore.S
--- a/sys/arch/amd64/amd64/locore.S Thu Oct 03 03:10:02 2019 +0000
+++ b/sys/arch/amd64/amd64/locore.S Thu Oct 03 05:06:29 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.S,v 1.186 2019/08/21 16:35:10 maxv Exp $ */
+/* $NetBSD: locore.S,v 1.187 2019/10/03 05:06:29 maxv Exp $ */
/*
* Copyright-o-rama!
@@ -1147,13 +1147,10 @@
movq %r12,%rsi
callq _C_LABEL(x86_dbregs_switch)
- movb _C_LABEL(x86_fpu_eager),%dl
- testb %dl,%dl
- jz .Lno_eagerfpu
+ /* Switch the FPU. */
movq %r13,%rdi
movq %r12,%rsi
callq _C_LABEL(fpu_eagerswitch)
-.Lno_eagerfpu:
/* Don't bother with the rest if switching to a system process. */
testl $LW_SYSTEM,L_FLAG(%r12)
diff -r 5cdd2b8c15fb -r c0ab03403d46 sys/arch/i386/i386/locore.S
--- a/sys/arch/i386/i386/locore.S Thu Oct 03 03:10:02 2019 +0000
+++ b/sys/arch/i386/i386/locore.S Thu Oct 03 05:06:29 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.S,v 1.168 2019/05/19 08:17:02 maxv Exp $ */
+/* $NetBSD: locore.S,v 1.169 2019/10/03 05:06:29 maxv Exp $ */
/*
* Copyright-o-rama!
@@ -128,7 +128,7 @@
*/
#include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.168 2019/05/19 08:17:02 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.169 2019/10/03 05:06:29 maxv Exp $");
#include "opt_copy_symtab.h"
#include "opt_ddb.h"
@@ -1137,15 +1137,12 @@
call _C_LABEL(x86_dbregs_switch)
addl $8,%esp
+ /* Switch the FPU. */
pushl %edx
- movb _C_LABEL(x86_fpu_eager),%dl
- testb %dl,%dl
- jz .Lno_eagerfpu
pushl %edi
pushl %esi
call _C_LABEL(fpu_eagerswitch)
addl $8,%esp
-.Lno_eagerfpu:
popl %edx
/* Don't bother with the rest if switching to a system process. */
diff -r 5cdd2b8c15fb -r c0ab03403d46 sys/arch/x86/include/cpu.h
--- a/sys/arch/x86/include/cpu.h Thu Oct 03 03:10:02 2019 +0000
+++ b/sys/arch/x86/include/cpu.h Thu Oct 03 05:06:29 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.108 2019/08/07 06:23:48 maxv Exp $ */
+/* $NetBSD: cpu.h,v 1.109 2019/10/03 05:06:29 maxv Exp $ */
/*
* Copyright (c) 1990 The Regents of the University of California.
@@ -462,7 +462,6 @@
extern size_t x86_xsave_offsets[];
extern size_t x86_xsave_sizes[];
extern uint32_t x86_fpu_mxcsr_mask;
-extern bool x86_fpu_eager;
extern void (*x86_cpu_idle)(void);
#define cpu_idle() (*x86_cpu_idle)()
diff -r 5cdd2b8c15fb -r c0ab03403d46 sys/arch/x86/x86/fpu.c
--- a/sys/arch/x86/x86/fpu.c Thu Oct 03 03:10:02 2019 +0000
+++ b/sys/arch/x86/x86/fpu.c Thu Oct 03 05:06:29 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: fpu.c,v 1.55 2019/07/05 17:08:56 maxv Exp $ */
+/* $NetBSD: fpu.c,v 1.56 2019/10/03 05:06:29 maxv Exp $ */
/*
* Copyright (c) 2008 The NetBSD Foundation, Inc. All
@@ -96,7 +96,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.55 2019/07/05 17:08:56 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.56 2019/10/03 05:06:29 maxv Exp $");
#include "opt_multiprocessor.h"
@@ -127,7 +127,6 @@
#endif
uint32_t x86_fpu_mxcsr_mask __read_mostly = 0;
-bool x86_fpu_eager __read_mostly = false;
static inline union savefpu *
lwp_fpuarea(struct lwp *l)
@@ -440,20 +439,13 @@
}
/*
- * Implement device not available (DNA) exception.
- *
- * If we were the last lwp to use the FPU, we can simply return.
- * Otherwise, we save the previous state, if necessary, and restore
- * our last saved state.
- *
- * Called directly from the trap 0x13 entry with interrupts still disabled.
+ * Implement device not available (DNA) exception. Called with interrupts still
+ * disabled.
*/
void
fpudna(struct trapframe *frame)
{
struct cpu_info *ci = curcpu();
- struct lwp *l, *fl;
- struct pcb *pcb;
int s;
if (!USERMODE(frame->tf_cs)) {
@@ -461,55 +453,9 @@
(void *)X86_TF_RIP(frame), frame);
}
+ /* Install the LWP's FPU state. */
s = splhigh();
-
- /* Save state on current CPU. */
- l = ci->ci_curlwp;
- pcb = lwp_getpcb(l);
- fl = ci->ci_fpcurlwp;
- if (fl != NULL) {
- if (__predict_false(x86_fpu_eager)) {
- panic("%s: FPU busy with EagerFPU enabled",
- __func__);
- }
-
- /*
- * It seems we can get here on Xen even if we didn't
- * switch lwp. In this case do nothing
- */
- if (fl == l) {
- KASSERT(pcb->pcb_fpcpu == ci);
- clts();
- splx(s);
- return;
- }
- fpusave_cpu(true);
- }
-
- /* Save our state if on a remote CPU. */
- if (pcb->pcb_fpcpu != NULL) {
- if (__predict_false(x86_fpu_eager)) {
- panic("%s: LWP busy with EagerFPU enabled",
- __func__);
- }
-
- /* Explicitly disable preemption before dropping spl. */
- kpreempt_disable();
- splx(s);
-
- /* Actually enable interrupts */
- x86_enable_intr();
-
- fpusave_lwp(l, true);
- KASSERT(pcb->pcb_fpcpu == NULL);
- s = splhigh();
- kpreempt_enable();
- }
-
- /* Install the LWP's FPU state. */
- fpu_lwp_install(l);
-
- KASSERT(ci == curcpu());
+ fpu_lwp_install(ci->ci_curlwp);
splx(s);
}
@@ -625,14 +571,9 @@
pcb = lwp_getpcb(l);
s = splhigh();
- if (x86_fpu_eager) {
- KASSERT(pcb->pcb_fpcpu == NULL ||
- pcb->pcb_fpcpu == curcpu());
- fpusave_cpu(false);
- } else {
- splx(s);
- fpusave_lwp(l, false);
- }
+
+ KASSERT(pcb->pcb_fpcpu == NULL || pcb->pcb_fpcpu == curcpu());
+ fpusave_cpu(false);
KASSERT(pcb->pcb_fpcpu == NULL);
switch (x86_fpu_save) {
@@ -667,10 +608,8 @@
pcb->pcb_fpu_dflt_cw = x87_cw;
- if (x86_fpu_eager) {
- fpu_lwp_install(l);
- splx(s);
- }
+ fpu_lwp_install(l);
+ splx(s);
}
void
@@ -1073,110 +1012,3 @@
return 0;
}
-
-/* -------------------------------------------------------------------------- */
-
-static volatile unsigned long eagerfpu_cpu_barrier1 __cacheline_aligned;
-static volatile unsigned long eagerfpu_cpu_barrier2 __cacheline_aligned;
-
-static void
-eager_change_cpu(void *arg1, void *arg2)
-{
- struct cpu_info *ci = curcpu();
- bool enabled = (bool)arg1;
- int s;
-
- s = splhigh();
-
- /* Rendez-vous 1. */
- atomic_dec_ulong(&eagerfpu_cpu_barrier1);
- while (atomic_cas_ulong(&eagerfpu_cpu_barrier1, 0, 0) != 0) {
- x86_pause();
- }
-
- fpusave_cpu(true);
- if (ci == &cpu_info_primary) {
- x86_fpu_eager = enabled;
- }
-
- /* Rendez-vous 2. */
- atomic_dec_ulong(&eagerfpu_cpu_barrier2);
- while (atomic_cas_ulong(&eagerfpu_cpu_barrier2, 0, 0) != 0) {
- x86_pause();
- }
-
- splx(s);
-}
-
-static int
-eager_change(bool enabled)
-{
- struct cpu_info *ci = NULL;
- CPU_INFO_ITERATOR cii;
- uint64_t xc;
-
- mutex_enter(&cpu_lock);
-
- /*
- * We expect all the CPUs to be online.
- */
- for (CPU_INFO_FOREACH(cii, ci)) {
- struct schedstate_percpu *spc = &ci->ci_schedstate;
- if (spc->spc_flags & SPCF_OFFLINE) {
- printf("[!] cpu%d offline, EagerFPU not changed\n",
- cpu_index(ci));
- mutex_exit(&cpu_lock);
- return EOPNOTSUPP;
- }
- }
-
- /* Initialize the barriers */
- eagerfpu_cpu_barrier1 = ncpu;
- eagerfpu_cpu_barrier2 = ncpu;
-
- printf("[+] %s EagerFPU...",
- enabled ? "Enabling" : "Disabling");
- xc = xc_broadcast(0, eager_change_cpu,
- (void *)enabled, NULL);
- xc_wait(xc);
- printf(" done!\n");
-
- mutex_exit(&cpu_lock);
-
- return 0;
-}
-
-static int
-sysctl_machdep_fpu_eager(SYSCTLFN_ARGS)
-{
- struct sysctlnode node;
- int error;
- bool val;
-
- val = *(bool *)rnode->sysctl_data;
-
Home |
Main Index |
Thread Index |
Old Index