Module Name: src
Committed By: rmind
Date: Thu Sep 26 00:41:51 UTC 2013
Modified Files:
src/lib/librumpuser: rumpuser_pth.c
Log Message:
Give RUMP mutex and rwlock their own cache-line. Also give a separate
cache-line for the rwlock's reader counter.
To generate a diff of this commit:
cvs rdiff -u -r1.32 -r1.33 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.32 src/lib/librumpuser/rumpuser_pth.c:1.33
--- src/lib/librumpuser/rumpuser_pth.c:1.32 Tue Sep 24 23:45:16 2013
+++ src/lib/librumpuser/rumpuser_pth.c Thu Sep 26 00:41:51 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: rumpuser_pth.c,v 1.32 2013/09/24 23:45:16 rmind Exp $ */
+/* $NetBSD: rumpuser_pth.c,v 1.33 2013/09/26 00:41:51 rmind Exp $ */
/*
* Copyright (c) 2007-2010 Antti Kantee. All Rights Reserved.
@@ -28,11 +28,12 @@
#include "rumpuser_port.h"
#if !defined(lint)
-__RCSID("$NetBSD: rumpuser_pth.c,v 1.32 2013/09/24 23:45:16 rmind Exp $");
+__RCSID("$NetBSD: rumpuser_pth.c,v 1.33 2013/09/26 00:41:51 rmind Exp $");
#endif /* !lint */
#include <sys/queue.h>
#if defined(__NetBSD__)
+#include <sys/param.h>
#include <sys/atomic.h>
#endif
@@ -50,6 +51,19 @@ __RCSID("$NetBSD: rumpuser_pth.c,v 1.32
#include "rumpuser_int.h"
+#if defined(__NetBSD__)
+static void *
+aligned_alloc(size_t size)
+{
+ void *ptr;
+
+ size = roundup2(size, COHERENCY_UNIT);
+ return posix_memalign(&ptr, COHERENCY_UNIT, size) ? NULL : ptr;
+}
+#else
+#define aligned_alloc(sz) malloc(sz)
+#endif
+
int
rumpuser_thread_create(void *(*f)(void *), void *arg, const char *thrname,
int joinable, int priority, int cpuidx, void **ptcookie)
@@ -134,7 +148,7 @@ rumpuser_mutex_init(struct rumpuser_mtx
{
pthread_mutexattr_t att;
- NOFAIL(*mtx = malloc(sizeof(struct rumpuser_mtx)));
+ NOFAIL(*mtx = aligned_alloc(sizeof(struct rumpuser_mtx)));
pthread_mutexattr_init(&att);
pthread_mutexattr_settype(&att, PTHREAD_MUTEX_ERRORCHECK);
@@ -244,6 +258,7 @@ rumpuser_mutex_owner(struct rumpuser_mtx
struct rumpuser_rw {
pthread_rwlock_t pthrw;
+ char pad[64 - sizeof(pthread_rwlock_t)];
pthread_spinlock_t spin;
unsigned int readers;
struct lwp *writer;
@@ -300,7 +315,7 @@ rw_clearwriter(struct rumpuser_rw *rw)
rw->writer = NULL;
}
-static void
+static inline void
rw_readup(struct rumpuser_rw *rw)
{
@@ -313,7 +328,7 @@ rw_readup(struct rumpuser_rw *rw)
#endif
}
-static void
+static inline void
rw_readdown(struct rumpuser_rw *rw)
{
@@ -331,7 +346,7 @@ void
rumpuser_rw_init(struct rumpuser_rw **rw)
{
- NOFAIL(*rw = malloc(sizeof(struct rumpuser_rw)));
+ NOFAIL(*rw = aligned_alloc(sizeof(struct rumpuser_rw)));
NOFAIL_ERRNO(pthread_rwlock_init(&((*rw)->pthrw), NULL));
NOFAIL_ERRNO(pthread_spin_init(&((*rw)->spin),PTHREAD_PROCESS_PRIVATE));
(*rw)->readers = 0;