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;

Reply via email to