From 4fe523741e75afac00535af59a05778306148f2c Mon Sep 17 00:00:00 2001 From: Maksym Sobolyev Date: Wed, 8 Mar 2017 08:06:38 -0800 Subject: [PATCH] Implement new locking method based around FreeBSD futex-like _umtx_op(2) locking primitives, which allows for process-shared kernel-assisted mutexes. --- Makefile.conf.template | 1 + Makefile.defs | 5 +++++ lock_alloc.h | 2 +- lock_ops.h | 51 +++++++++++++++++++++++++++++++++++++++++- version.h | 9 +++++++- 5 files changed, 65 insertions(+), 3 deletions(-) diff --git a/Makefile.conf.template b/Makefile.conf.template index 749faa229f4..6cc49393f16 100644 --- a/Makefile.conf.template +++ b/Makefile.conf.template @@ -84,6 +84,7 @@ DEFS+= -DDBG_MALLOC #Enables debugging for memory allocators #DEFS+= -DUSE_FUTEX #Uses linux futexs with fast architecture specific locking #DEFS+= -DUSE_SYSV_SEM #Uses SYSV sems for locking ( slower & limited number of locks #DEFS+= -DUSE_PTHREAD_MUTEX #Uses pthread mutexes for locking +#DEFS+= -DUSE_UMUTEX_MUTEX #Uses FreeBSD-specific low-level mutexes for locking #DEFS+= -DUSE_POSIX_SEM #Uses POSIX sems for locking #DEFS+= -DBUSY_WAIT #Uses busy waiting on the lock #DEFS+= -DDBG_LOCK #Attach debug info to all lock structures diff --git a/Makefile.defs b/Makefile.defs index 26106f5172f..a0f604dff13 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -752,6 +752,7 @@ ifeq ($(ARCH), alpha) endif # decide on the locking type +ifeq (,$(findstring USE_UMUTEX_MUTEX, $(DEFS))) ifeq (,$(findstring USE_PTHREAD_MUTEX, $(DEFS))) ifeq (,$(findstring USE_POSIX_SEM, $(DEFS))) ifeq (,$(findstring USE_SYSV_SEM, $(DEFS))) @@ -771,6 +772,10 @@ else ## USE_PTHREAD_MUTEX was manually forced from .conf found_lock_method=yes endif +else + ## USE_UMUTEX_MUTEX was manually forced from .conf + found_lock_method=yes +endif CFLAGS=$(shell echo "$${CFLAGS}") LDFLAGS+= diff --git a/lock_alloc.h b/lock_alloc.h index 7a1d9bb54dc..eaa23864137 100644 --- a/lock_alloc.h +++ b/lock_alloc.h @@ -54,7 +54,7 @@ #include "mem/mem.h" #include "mem/shm_mem.h" -#if defined(FAST_LOCK) || defined(USE_PTHREAD_MUTEX) || defined(USE_POSIX_SEM) +#if defined(FAST_LOCK) || defined(USE_PTHREAD_MUTEX) || defined(USE_POSIX_SEM) || defined(USE_UMUTEX_MUTEX) /* simple locks*/ #define lock_alloc() shm_malloc(sizeof(gen_lock_t)) #define lock_dealloc(lock) shm_free((void*)lock) diff --git a/lock_ops.h b/lock_ops.h index 38de905bb4c..8c7f0740fce 100644 --- a/lock_ops.h +++ b/lock_ops.h @@ -127,6 +127,55 @@ inline static gen_lock_t* lock_init(gen_lock_t* lock) #define lock_get(lock) pthread_mutex_lock(lock) #define lock_release(lock) pthread_mutex_unlock(lock) +#elif defined USE_UMUTEX_MUTEX +# if !defined(USE_UMUTEX_MUTEX_DECL) +# define USE_UMUTEX_MUTEX_DECL 1 +#include + +#include +#include + +#define u_long unsigned long +#include + +typedef struct umutex gen_lock_t; + +#define lock_destroy(lock) /* do nothing */ + +inline static int +_umtx_op_err(void *obj, int op, u_long val, void *uaddr, void *uaddr2) +{ + + if (_umtx_op(obj, op, val, uaddr, uaddr2) == -1) + return (errno); + return (0); +} + +inline static gen_lock_t * +lock_init(gen_lock_t *lock) +{ + + memset(lock, '\0', sizeof(gen_lock_t)); + lock->m_flags = USYNC_PROCESS_SHARED; + + return (lock); +} + +inline static int +lock_get(gen_lock_t *lock) +{ + + return (_umtx_op_err(lock, UMTX_OP_MUTEX_LOCK, 0, 0, 0)); +} + +inline static int +lock_release(gen_lock_t *lock) +{ + + return (_umtx_op_err(lock, UMTX_OP_MUTEX_UNLOCK, 0, 0, 0)); +} + +# endif /* USE_UMUTEX_MUTEX_DECL */ #elif defined USE_POSIX_SEM #include @@ -248,7 +297,7 @@ inline static void lock_release(gen_lock_t* lock) /* lock sets */ -#if defined(FAST_LOCK) || defined(USE_PTHREAD_MUTEX) || defined(USE_POSIX_SEM) +#if defined(FAST_LOCK) || defined(USE_PTHREAD_MUTEX) || defined(USE_POSIX_SEM) || defined(USE_UMUTEX_MUTEX) #define GEN_LOCK_T_PREFERED struct gen_lock_set_t_ { diff --git a/version.h b/version.h index 00d29f09fce..d7c1c9ca9c1 100644 --- a/version.h +++ b/version.h @@ -153,6 +153,12 @@ #define USE_PTHREAD_MUTEX_STR "" #endif +#ifdef USE_UMUTEX_MUTEX +#define USE_UMUTEX_MUTEX_STR ", USE_UMUTEX_MUTEX" +#else +#define USE_UMUTEX_MUTEX_STR "" +#endif + #ifdef USE_POSIX_SEM #define USE_POSIX_SEM_STR ", USE_POSIX_SEM" #else @@ -183,7 +189,8 @@ SHM_MMAP_STR PKG_MALLOC_STR VQ_MALLOC_STR QM_MALLOC_STR F_MALLOC_STR \ HP_MALLOC_STR USE_SHM_MEM_STR DBG_MALLOC_STR \ DEBUG_DMALLOC_STR QM_JOIN_FREE_STR FAST_LOCK_STR NOSMP_STR \ - USE_PTHREAD_MUTEX_STR USE_POSIX_SEM_STR USE_SYSV_SEM_STR DBG_LOCK_STR + USE_PTHREAD_MUTEX_STR USE_UMUTEX_MUTEX_STR USE_POSIX_SEM_STR \ + USE_SYSV_SEM_STR DBG_LOCK_STR #endif