Module Name:    src
Committed By:   ad
Date:           Sat Nov 30 14:21:16 UTC 2019

Modified Files:
        src/sys/kern: kern_rwlock.c

Log Message:
Back out previous.  It works on amd64 under stress test but not
evbarm-aarch64 for some reason.  Will revisit.


To generate a diff of this commit:
cvs rdiff -u -r1.57 -r1.58 src/sys/kern/kern_rwlock.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/kern/kern_rwlock.c
diff -u src/sys/kern/kern_rwlock.c:1.57 src/sys/kern/kern_rwlock.c:1.58
--- src/sys/kern/kern_rwlock.c:1.57	Fri Nov 29 20:50:54 2019
+++ src/sys/kern/kern_rwlock.c	Sat Nov 30 14:21:16 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_rwlock.c,v 1.57 2019/11/29 20:50:54 ad Exp $	*/
+/*	$NetBSD: kern_rwlock.c,v 1.58 2019/11/30 14:21:16 ad Exp $	*/
 
 /*-
  * Copyright (c) 2002, 2006, 2007, 2008, 2009, 2019 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_rwlock.c,v 1.57 2019/11/29 20:50:54 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_rwlock.c,v 1.58 2019/11/30 14:21:16 ad Exp $");
 
 #define	__RWLOCK_PRIVATE
 
@@ -417,11 +417,10 @@ rw_vector_enter(krwlock_t *rw, const krw
 		 * No need for a memory barrier because of context switch.
 		 * If not handed the lock, then spin again.
 		 */
-		if (op == RW_READER)
+		if (op == RW_READER || (rw->rw_owner & RW_THREAD) == curthread)
 			break;
+
 		owner = rw->rw_owner;
-		if ((owner & RW_THREAD) == curthread)
-			break;
 	}
 	KPREEMPT_ENABLE(curlwp);
 
@@ -477,13 +476,14 @@ rw_vector_exit(krwlock_t *rw)
 	 * lock would become unowned.
 	 */
 	RW_MEMBAR_EXIT();
-	for (;; owner = next) {
+	for (;;) {
 		newown = (owner - decr);
 		if ((newown & (RW_THREAD | RW_HAS_WAITERS)) == RW_HAS_WAITERS)
 			break;
 		next = rw_cas(rw, owner, newown);
 		if (__predict_true(next == owner))
 			return;
+		owner = next;
 	}
 
 	/*
@@ -568,15 +568,15 @@ rw_vector_tryenter(krwlock_t *rw, const 
 		need_wait = RW_WRITE_LOCKED | RW_THREAD;
 	}
 
-	for (owner = 0;; owner = next) {
+	for (owner = rw->rw_owner;; owner = next) {
+		if (__predict_false((owner & need_wait) != 0))
+			return 0;
 		next = rw_cas(rw, owner, owner + incr);
 		if (__predict_true(next == owner)) {
 			/* Got it! */
 			RW_MEMBAR_ENTER();
 			break;
 		}
-		if (__predict_false((owner & need_wait) != 0))
-			return 0;
 	}
 
 	RW_WANTLOCK(rw, op);

Reply via email to