Module Name: src
Committed By: rmind
Date: Tue Sep 24 23:45:16 UTC 2013
Modified Files:
src/lib/librumpuser: rumpuser_pth.c
Log Message:
rumpuser_rwlock: replace internal pthread_spin_lock (for protecting reader
count) with atomic operations. As pthread_spin_lock is not adaptive lock, it
can have hugely negative impact if contended here, especially with priority
inversions. Now contended rwlock(9) no longer falls flat in RUMP kernels.
To generate a diff of this commit:
cvs rdiff -u -r1.31 -r1.32 src/lib/librumpuser/rumpuser_pth.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/librumpuser/rumpuser_pth.c
diff -u src/lib/librumpuser/rumpuser_pth.c:1.31 src/lib/librumpuser/rumpuser_pth.c:1.32
--- src/lib/librumpuser/rumpuser_pth.c:1.31 Mon Sep 23 10:35:20 2013
+++ src/lib/librumpuser/rumpuser_pth.c Tue Sep 24 23:45:16 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: rumpuser_pth.c,v 1.31 2013/09/23 10:35:20 pooka Exp $ */
+/* $NetBSD: rumpuser_pth.c,v 1.32 2013/09/24 23:45:16 rmind Exp $ */
/*
* Copyright (c) 2007-2010 Antti Kantee. All Rights Reserved.
@@ -28,10 +28,13 @@
#include "rumpuser_port.h"
#if !defined(lint)
-__RCSID("$NetBSD: rumpuser_pth.c,v 1.31 2013/09/23 10:35:20 pooka Exp $");
+__RCSID("$NetBSD: rumpuser_pth.c,v 1.32 2013/09/24 23:45:16 rmind Exp $");
#endif /* !lint */
#include <sys/queue.h>
+#if defined(__NetBSD__)
+#include <sys/atomic.h>
+#endif
#include <assert.h>
#include <errno.h>
@@ -242,7 +245,7 @@ rumpuser_mutex_owner(struct rumpuser_mtx
struct rumpuser_rw {
pthread_rwlock_t pthrw;
pthread_spinlock_t spin;
- int readers;
+ unsigned int readers;
struct lwp *writer;
int downgrade; /* someone is downgrading (hopefully lock holder ;) */
};
@@ -251,14 +254,15 @@ static int
rw_amwriter(struct rumpuser_rw *rw)
{
- return rw->writer == rumpuser_curlwp() && rw->readers == -1;
+ return rw->writer == rumpuser_curlwp() && rw->readers == (unsigned)-1;
}
static int
rw_nreaders(struct rumpuser_rw *rw)
{
+ unsigned nreaders = rw->readers;
- return rw->readers > 0 ? rw->readers : 0;
+ return nreaders != (unsigned)-1 ? nreaders : 0;
}
static int
@@ -283,7 +287,7 @@ rw_setwriter(struct rumpuser_rw *rw, int
}
assert(rw->readers == 0);
rw->writer = rumpuser_curlwp();
- rw->readers = -1;
+ rw->readers = (unsigned)-1;
return 0;
}
@@ -300,20 +304,27 @@ static void
rw_readup(struct rumpuser_rw *rw)
{
+#if defined(__NetBSD__)
+ atomic_inc_uint(&rw->readers);
+#else
pthread_spin_lock(&rw->spin);
- assert(rw->readers >= 0);
++rw->readers;
pthread_spin_unlock(&rw->spin);
+#endif
}
static void
rw_readdown(struct rumpuser_rw *rw)
{
+#if defined(__NetBSD__)
+ atomic_dec_uint(&rw->readers);
+#else
pthread_spin_lock(&rw->spin);
assert(rw->readers > 0);
--rw->readers;
pthread_spin_unlock(&rw->spin);
+#endif
}
void