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;