Module Name:    src
Committed By:   maxv
Date:           Thu Oct  3 05:06:29 UTC 2019

Modified Files:
        src/sys/arch/amd64/amd64: locore.S
        src/sys/arch/i386/i386: locore.S
        src/sys/arch/x86/include: cpu.h
        src/sys/arch/x86/x86: fpu.c identcpu.c x86_machdep.c

Log Message:
Remove the LazyFPU code, as posted 5 months ago on port-amd64@.


To generate a diff of this commit:
cvs rdiff -u -r1.186 -r1.187 src/sys/arch/amd64/amd64/locore.S
cvs rdiff -u -r1.168 -r1.169 src/sys/arch/i386/i386/locore.S
cvs rdiff -u -r1.108 -r1.109 src/sys/arch/x86/include/cpu.h
cvs rdiff -u -r1.55 -r1.56 src/sys/arch/x86/x86/fpu.c
cvs rdiff -u -r1.95 -r1.96 src/sys/arch/x86/x86/identcpu.c
cvs rdiff -u -r1.127 -r1.128 src/sys/arch/x86/x86/x86_machdep.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/amd64/amd64/locore.S
diff -u src/sys/arch/amd64/amd64/locore.S:1.186 src/sys/arch/amd64/amd64/locore.S:1.187
--- src/sys/arch/amd64/amd64/locore.S:1.186	Wed Aug 21 16:35:10 2019
+++ src/sys/arch/amd64/amd64/locore.S	Thu Oct  3 05:06:29 2019
@@ -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 @@ ENTRY(cpu_switchto)
 	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)

Index: src/sys/arch/i386/i386/locore.S
diff -u src/sys/arch/i386/i386/locore.S:1.168 src/sys/arch/i386/i386/locore.S:1.169
--- src/sys/arch/i386/i386/locore.S:1.168	Sun May 19 08:17:02 2019
+++ src/sys/arch/i386/i386/locore.S	Thu Oct  3 05:06:29 2019
@@ -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 @@ skip_save:
 	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. */

Index: src/sys/arch/x86/include/cpu.h
diff -u src/sys/arch/x86/include/cpu.h:1.108 src/sys/arch/x86/include/cpu.h:1.109
--- src/sys/arch/x86/include/cpu.h:1.108	Wed Aug  7 06:23:48 2019
+++ src/sys/arch/x86/include/cpu.h	Thu Oct  3 05:06:29 2019
@@ -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 uint64_t x86_xsave_features;
 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)()

Index: src/sys/arch/x86/x86/fpu.c
diff -u src/sys/arch/x86/x86/fpu.c:1.55 src/sys/arch/x86/x86/fpu.c:1.56
--- src/sys/arch/x86/x86/fpu.c:1.55	Fri Jul  5 17:08:56 2019
+++ src/sys/arch/x86/x86/fpu.c	Thu Oct  3 05:06:29 2019
@@ -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 @@ __KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.55
 #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 @@ fputrap(struct trapframe *frame)
 }
 
 /*
- * 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 @@ fpudna(struct trapframe *frame)
 		    (void *)X86_TF_RIP(frame), frame);
 	}
 
-	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());
+	s = splhigh();
+	fpu_lwp_install(ci->ci_curlwp);
 	splx(s);
 }
 
@@ -625,14 +571,9 @@ fpu_clear(struct lwp *l, unsigned int x8
 	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 @@ fpu_clear(struct lwp *l, unsigned int x8
 
 	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 @@ process_write_xstate(struct lwp *l, cons
 
 	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;
-
-	node = *rnode;
-	node.sysctl_data = &val;
-
-	error = sysctl_lookup(SYSCTLFN_CALL(&node));
-	if (error != 0 || newp == NULL)
-		return error;
-
-	if (val == x86_fpu_eager)
-		return 0;
-	return eager_change(val);
-}
-
-void sysctl_eagerfpu_init(struct sysctllog **);
-
-void
-sysctl_eagerfpu_init(struct sysctllog **clog)
-{
-	sysctl_createv(clog, 0, NULL, NULL,
-		       CTLFLAG_READWRITE,
-		       CTLTYPE_BOOL, "fpu_eager",
-		       SYSCTL_DESCR("Whether the kernel uses Eager FPU Switch"),
-		       sysctl_machdep_fpu_eager, 0,
-		       &x86_fpu_eager, 0,
-		       CTL_MACHDEP, CTL_CREATE, CTL_EOL);
-}

Index: src/sys/arch/x86/x86/identcpu.c
diff -u src/sys/arch/x86/x86/identcpu.c:1.95 src/sys/arch/x86/x86/identcpu.c:1.96
--- src/sys/arch/x86/x86/identcpu.c:1.95	Thu Sep 12 06:39:47 2019
+++ src/sys/arch/x86/x86/identcpu.c	Thu Oct  3 05:06:29 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: identcpu.c,v 1.95 2019/09/12 06:39:47 maxv Exp $	*/
+/*	$NetBSD: identcpu.c,v 1.96 2019/10/03 05:06:29 maxv Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: identcpu.c,v 1.95 2019/09/12 06:39:47 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: identcpu.c,v 1.96 2019/10/03 05:06:29 maxv Exp $");
 
 #include "opt_xen.h"
 
@@ -758,7 +758,6 @@ cpu_probe_fpu(struct cpu_info *ci)
 	u_int descs[4];
 	int i;
 
-	x86_fpu_eager = true;
 	x86_fpu_save = FPU_SAVE_FSAVE;
 
 #ifdef i386

Index: src/sys/arch/x86/x86/x86_machdep.c
diff -u src/sys/arch/x86/x86/x86_machdep.c:1.127 src/sys/arch/x86/x86/x86_machdep.c:1.128
--- src/sys/arch/x86/x86/x86_machdep.c:1.127	Wed May 29 16:54:41 2019
+++ src/sys/arch/x86/x86/x86_machdep.c	Thu Oct  3 05:06:29 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: x86_machdep.c,v 1.127 2019/05/29 16:54:41 maxv Exp $	*/
+/*	$NetBSD: x86_machdep.c,v 1.128 2019/10/03 05:06:29 maxv Exp $	*/
 
 /*-
  * Copyright (c) 2002, 2006, 2007 YAMAMOTO Takashi,
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: x86_machdep.c,v 1.127 2019/05/29 16:54:41 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: x86_machdep.c,v 1.128 2019/10/03 05:06:29 maxv Exp $");
 
 #include "opt_modular.h"
 #include "opt_physmem.h"
@@ -1312,9 +1312,6 @@ SYSCTL_SETUP(sysctl_machdep_setup, "sysc
 	sysctl_speculation_init(clog);
 #endif
 
-	void sysctl_eagerfpu_init(struct sysctllog **);
-	sysctl_eagerfpu_init(clog);
-
 	/* None of these can ever change once the system has booted */
 	const_sysctl(clog, "fpu_present", CTLTYPE_INT, i386_fpu_present,
 	    CPU_FPU_PRESENT);

Reply via email to