Module Name:    src
Committed By:   ad
Date:           Fri Nov 22 23:36:25 UTC 2019

Modified Files:
        src/sys/arch/amd64/amd64: locore.S
        src/sys/arch/x86/x86: cpu.c

Log Message:
- On-demand zeroing pages with MOVNTI is crazy.  It empties L1/L2/L3.
- Disable zeroing in the idle loop.  That needs a cache-friendly strategy.

Result: 3 to 4% reduction in kernel build time on my test system.
Inspired by a discussion with Mateusz Guzik and David Maxwell.


To generate a diff of this commit:
cvs rdiff -u -r1.191 -r1.192 src/sys/arch/amd64/amd64/locore.S
cvs rdiff -u -r1.174 -r1.175 src/sys/arch/x86/x86/cpu.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.191 src/sys/arch/amd64/amd64/locore.S:1.192
--- src/sys/arch/amd64/amd64/locore.S:1.191	Thu Nov 21 19:27:54 2019
+++ src/sys/arch/amd64/amd64/locore.S	Fri Nov 22 23:36:25 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.S,v 1.191 2019/11/21 19:27:54 ad Exp $	*/
+/*	$NetBSD: locore.S,v 1.192 2019/11/22 23:36:25 ad Exp $	*/
 
 /*
  * Copyright-o-rama!
@@ -1519,24 +1519,16 @@ END(sse2_idlezero_page)
 /*
  * void pagezero(vaddr_t va)
  *
- * Zero a page without polluting the cache.
+ * Zero a page.
  */
 ENTRY(pagezero)
-	movq	$-PAGE_SIZE,%rdx
-	subq	%rdx,%rdi
+	pushq	%rbp
+	movq	%rsp,%rbp
+	movq	$(PAGE_SIZE / 8),%rcx
 	xorq	%rax,%rax
-1:
-	movnti	%rax,(%rdi,%rdx)
-	movnti	%rax,8(%rdi,%rdx)
-	movnti	%rax,16(%rdi,%rdx)
-	movnti	%rax,24(%rdi,%rdx)
-	movnti	%rax,32(%rdi,%rdx)
-	movnti	%rax,40(%rdi,%rdx)
-	movnti	%rax,48(%rdi,%rdx)
-	movnti	%rax,56(%rdi,%rdx)
-	addq	$64,%rdx
-	jne	1b
-	sfence
+	rep
+	stosq
+	leave
 	ret
 END(pagezero)
 

Index: src/sys/arch/x86/x86/cpu.c
diff -u src/sys/arch/x86/x86/cpu.c:1.174 src/sys/arch/x86/x86/cpu.c:1.175
--- src/sys/arch/x86/x86/cpu.c:1.174	Tue Nov  5 20:19:17 2019
+++ src/sys/arch/x86/x86/cpu.c	Fri Nov 22 23:36:25 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.174 2019/11/05 20:19:17 maxv Exp $	*/
+/*	$NetBSD: cpu.c,v 1.175 2019/11/22 23:36:25 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.174 2019/11/05 20:19:17 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.175 2019/11/22 23:36:25 ad Exp $");
 
 #include "opt_ddb.h"
 #include "opt_mpbios.h"		/* for MPDEBUG */
@@ -723,7 +723,7 @@ cpu_boot_secondary_processors(void)
 	tsc_tc_init();
 
 	/* Enable zeroing of pages in the idle loop if we have SSE2. */
-	vm_page_zero_enable = ((cpu_feature[0] & CPUID_SSE2) != 0);
+	vm_page_zero_enable = false; /* ((cpu_feature[0] & CPUID_SSE2) != 0); */
 }
 #endif
 

Reply via email to