Module Name:    src
Committed By:   ad
Date:           Sun Dec  8 20:00:56 UTC 2019

Modified Files:
        src/sys/arch/amd64/amd64: lock_stubs.S
        src/sys/arch/i386/i386: lock_stubs.S

Log Message:
After lots of testing I'm not convinced of the benefit to the tweak
I made to rw_enter(), so undo it to return to baseline.


To generate a diff of this commit:
cvs rdiff -u -r1.34 -r1.35 src/sys/arch/amd64/amd64/lock_stubs.S
cvs rdiff -u -r1.31 -r1.32 src/sys/arch/i386/i386/lock_stubs.S

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/lock_stubs.S
diff -u src/sys/arch/amd64/amd64/lock_stubs.S:1.34 src/sys/arch/amd64/amd64/lock_stubs.S:1.35
--- src/sys/arch/amd64/amd64/lock_stubs.S:1.34	Sat Nov 23 16:36:38 2019
+++ src/sys/arch/amd64/amd64/lock_stubs.S	Sun Dec  8 20:00:56 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: lock_stubs.S,v 1.34 2019/11/23 16:36:38 ad Exp $	*/
+/*	$NetBSD: lock_stubs.S,v 1.35 2019/12/08 20:00:56 ad Exp $	*/
 
 /*
  * Copyright (c) 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -191,15 +191,13 @@ END(mutex_spin_exit)
  * Acquire one hold on a RW lock.
  */
 ENTRY(rw_enter)
-	xorl	%eax, %eax
-	testl	%esi, %esi	/* RW_READER = 0 */
+	cmpl	$RW_READER, %esi
 	jne	2f
 
 	/*
-	 * Reader, and no existing readers on the lock: this is a most
-	 * common case.  Instead of reading from the lock word, use cmpxchg
-	 * and get the cache line into the EXCLUSIVE state to begin with.
+	 * Reader: this is the most common case.
 	 */
+	movq	(%rdi), %rax
 0:
 	testb	$(RW_WRITE_LOCKED|RW_WRITE_WANTED), %al
 	jnz	3f
@@ -215,6 +213,7 @@ ENTRY(rw_enter)
 	 * Writer: if the compare-and-set fails, don't bother retrying.
 	 */
 2:	movq	CPUVAR(CURLWP), %rcx
+	xorq	%rax, %rax
 	orq	$RW_WRITE_LOCKED, %rcx
 	LOCK
 	cmpxchgq %rcx, (%rdi)
@@ -269,15 +268,13 @@ END(rw_exit)
  * Try to acquire one hold on a RW lock.
  */
 ENTRY(rw_tryenter)
-	xorl	%eax, %eax
-	testl	%esi, %esi	/* RW_READER = 0 */
+	cmpl	$RW_READER, %esi
 	jne	2f
 
 	/*
-	 * Reader, and no existing readers on the lock: this is a most
-	 * common case.  Instead of reading from the lock word, use cmpxchg
-	 * and get the cache line into the EXCLUSIVE state to begin with.
+	 * Reader: this is the most common case.
 	 */
+	movq	(%rdi), %rax
 0:
 	testb	$(RW_WRITE_LOCKED|RW_WRITE_WANTED), %al
 	jnz	4f
@@ -294,6 +291,7 @@ ENTRY(rw_tryenter)
 	 * Writer: if the compare-and-set fails, don't bother retrying.
 	 */
 2:	movq	CPUVAR(CURLWP), %rcx
+	xorq	%rax, %rax
 	orq	$RW_WRITE_LOCKED, %rcx
 	LOCK
 	cmpxchgq %rcx, (%rdi)

Index: src/sys/arch/i386/i386/lock_stubs.S
diff -u src/sys/arch/i386/i386/lock_stubs.S:1.31 src/sys/arch/i386/i386/lock_stubs.S:1.32
--- src/sys/arch/i386/i386/lock_stubs.S:1.31	Sat Nov 23 16:36:38 2019
+++ src/sys/arch/i386/i386/lock_stubs.S	Sun Dec  8 20:00:56 2019
@@ -1,7 +1,7 @@
-/*	$NetBSD: lock_stubs.S,v 1.31 2019/11/23 16:36:38 ad Exp $	*/
+/*	$NetBSD: lock_stubs.S,v 1.32 2019/12/08 20:00:56 ad Exp $	*/
 
 /*-
- * Copyright (c) 2006, 2007, 2008, 2009, 2019 The NetBSD Foundation, Inc.
+ * Copyright (c) 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -35,7 +35,7 @@
  */
 
 #include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: lock_stubs.S,v 1.31 2019/11/23 16:36:38 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lock_stubs.S,v 1.32 2019/12/08 20:00:56 ad Exp $");
 
 #include "opt_lockdebug.h"
 
@@ -104,15 +104,13 @@ END(mutex_exit)
  */
 ENTRY(rw_enter)
 	movl	4(%esp), %edx
-	xorl	%eax, %eax
 	cmpl	$RW_READER, 8(%esp)
 	jne	2f
 
 	/*
-	 * Reader, and no existing readers on the lock: this is a most
-	 * common case.  Instead of reading from the lock word, use cmpxchg
-	 * and get the cache line into the EXCLUSIVE state to begin with.
+	 * Reader
 	 */
+	movl	(%edx), %eax
 0:
 	testb	$(RW_WRITE_LOCKED|RW_WRITE_WANTED), %al
 	jnz	3f
@@ -127,7 +125,7 @@ ENTRY(rw_enter)
 	/*
 	 * Writer
 	 */
-2:
+2:	xorl	%eax, %eax
 	movl	%fs:CPU_INFO_CURLWP(%eax), %ecx
 	orl	$RW_WRITE_LOCKED, %ecx
 	LOCK(3)
@@ -188,15 +186,13 @@ END(rw_exit)
  */
 ENTRY(rw_tryenter)
 	movl	4(%esp), %edx
-	xorl	%eax, %eax
 	cmpl	$RW_READER, 8(%esp)
 	jne	2f
 
 	/*
-	 * Reader, and no existing readers on the lock: this is a most
-	 * common case.  Instead of reading from the lock word, use cmpxchg
-	 * and get the cache line into the EXCLUSIVE state to begin with.
+	 * Reader
 	 */
+	movl	(%edx), %eax
 0:
 	testb	$(RW_WRITE_LOCKED|RW_WRITE_WANTED), %al
 	jnz	4f
@@ -213,6 +209,7 @@ ENTRY(rw_tryenter)
 	 * Writer
 	 */
 2:
+	xorl	%eax, %eax
 	movl	%fs:CPU_INFO_CURLWP(%eax), %ecx
 	orl	$RW_WRITE_LOCKED, %ecx
 	LOCK(13)

Reply via email to