From be7d7d95850c30a154aaa56e95d6a7f36793409d Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Wed, 7 Aug 2019 17:11:51 +0200 Subject: [SERVER] Better lock debugging: Always check lock order Lock order is predefined in locks.h. Immediately bail out if a lock with lower priority is obtained while the same thread already holds one with higher priority. --- src/server/locks.h | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) (limited to 'src/server/locks.h') diff --git a/src/server/locks.h b/src/server/locks.h index 7f72722..e5c9801 100644 --- a/src/server/locks.h +++ b/src/server/locks.h @@ -5,19 +5,38 @@ #include #include #include +#include + +// Lock priority + +#define LOCK_RELOAD 90 +#define LOCK_LOAD_CONFIG 100 +#define LOCK_REMOTE_CLONE 110 +#define LOCK_CLIENT_LIST 120 +#define LOCK_CLIENT 130 +#define LOCK_INTEGRITY_QUEUE 140 +#define LOCK_IMAGE_LIST 150 +#define LOCK_IMAGE 160 +#define LOCK_UPLINK_QUEUE 170 +#define LOCK_ALT_SERVER_LIST 180 +#define LOCK_CLIENT_SEND 190 +#define LOCK_UPLINK_RTT 200 +#define LOCK_UPLINK_SEND 210 +#define LOCK_RPC_ACL 220 + +// #ifdef _DEBUG -#define mutex_init( lock ) debug_mutex_init( #lock, __FILE__, __LINE__, lock) -#define mutex_lock( lock ) debug_mutex_lock( #lock, __FILE__, __LINE__, lock) -#define mutex_trylock( lock ) debug_mutex_trylock( #lock, __FILE__, __LINE__, lock) +#define mutex_init( lock, prio ) debug_mutex_init( #lock, __FILE__, __LINE__, lock, prio) +#define mutex_lock( lock ) debug_mutex_lock( #lock, __FILE__, __LINE__, lock, false) +#define mutex_trylock( lock ) debug_mutex_lock( #lock, __FILE__, __LINE__, lock, true) #define mutex_unlock( lock ) debug_mutex_unlock( #lock, __FILE__, __LINE__, lock) #define mutex_cond_wait( cond, lock ) debug_mutex_cond_wait( #lock, __FILE__, __LINE__, cond, lock) #define mutex_destroy( lock ) debug_mutex_destroy( #lock, __FILE__, __LINE__, lock) -int debug_mutex_init(const char *name, const char *file, int line, pthread_mutex_t *lock); -int debug_mutex_lock(const char *name, const char *file, int line, pthread_mutex_t *lock); -int debug_mutex_trylock(const char *name, const char *file, int line, pthread_mutex_t *lock); +int debug_mutex_init(const char *name, const char *file, int line, pthread_mutex_t *lock, int priority); +int debug_mutex_lock(const char *name, const char *file, int line, pthread_mutex_t *lock, bool try); int debug_mutex_unlock(const char *name, const char *file, int line, pthread_mutex_t *lock); int debug_mutex_cond_wait(const char *name, const char *file, int line, pthread_cond_t *restrict cond, pthread_mutex_t *restrict lock); int debug_mutex_destroy(const char *name, const char *file, int line, pthread_mutex_t *lock); @@ -27,7 +46,7 @@ void debug_dump_lock_stats(); #else -#define mutex_init( lock ) pthread_mutex_init(lock, NULL) +#define mutex_init( lock, prio ) pthread_mutex_init(lock, NULL) #define mutex_lock( lock ) pthread_mutex_lock(lock) #define mutex_trylock( lock ) pthread_mutex_trylock(lock) #define mutex_unlock( lock ) pthread_mutex_unlock(lock) @@ -82,7 +101,4 @@ static inline int debug_thread_join(pthread_t thread, void **value_ptr) #endif -void debug_locks_start_watchdog(); -void debug_locks_stop_watchdog(); - #endif /* LOCKS_H_ */ -- cgit v1.2.3-55-g7522 From 411051a14781b004705e45e6fb2842e0b635812e Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Mon, 23 Mar 2020 11:32:29 +0100 Subject: [SERVER] Make lock/thread debugging dedicated cmake option --- CMakeLists.txt | 26 +++++++++++++++++--------- src/server/locks.c | 2 +- src/server/locks.h | 2 +- 3 files changed, 19 insertions(+), 11 deletions(-) (limited to 'src/server/locks.h') diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b061bb..952ff00 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,8 @@ OPTION(BUILD_FUSE_CLIENT "Build dnbd3 fuse client" ON) OPTION(BUILD_SERVER "Build dnbd3 server" ON) OPTION(BUILD_STRESSTEST "Build dnbd3 stress testing tool" OFF) SET(EXTRA_C_FLAGS "" CACHE STRING "Additional options to pass to compiler") +OPTION(DEBUG_LOCKS "Add lock debugging code to dnbd3-server" OFF) +OPTION(DEBUG_THREADS "Add thread debugging code to dnbd3-server" OFF) OPTION(SERVER_FOR_AFL "Build dnbd3-server for usage with afl-fuzz" OFF) @@ -47,16 +49,16 @@ macro (TRY_ADD_FLAG _FLAG) endmacro() # Common for gcc and clang -SET(CMAKE_EXE_LINKER_FLAGS "-Wl,-z,relro,-z,now,-z,defs -pie") -SET(CMAKE_C_FLAGS "-fPIE -std=c11 -Wno-multichar -fno-strict-aliasing -D_GNU_SOURCE -D_FORTIFY_SOURCE=2 ${EXTRA_C_FLAGS}") -SET(CMAKE_C_FLAGS_RELEASE " -O3 -Wno-unused-result -DNDEBUG") +#SET(CMAKE_EXE_LINKER_FLAGS "-Wl,-z,relro,-z,now,-z,defs -pie") +SET(CMAKE_C_FLAGS_RELEASE "-DNDEBUG") +SET(CMAKE_C_FLAGS "-std=c11 -Wno-multichar -fno-strict-aliasing -D_GNU_SOURCE -D_FORTIFY_SOURCE=2 ${EXTRA_C_FLAGS}") # Hardening. Try as much as is possible. -TRY_ADD_FLAG("-mmitigate-rop") -TRY_ADD_FLAG("-fstack-protector-strong") -TRY_ADD_FLAG("-fstack-clash-protection") -TRY_ADD_FLAG("-Wformat") -TRY_ADD_FLAG("-Wformat-security") -TRY_ADD_FLAG("-Werror=format-security") +#TRY_ADD_FLAG("-mmitigate-rop") +#TRY_ADD_FLAG("-fstack-protector-strong") +#TRY_ADD_FLAG("-fstack-clash-protection") +#TRY_ADD_FLAG("-Wformat") +#TRY_ADD_FLAG("-Wformat-security") +#TRY_ADD_FLAG("-Werror=format-security") if(CMAKE_C_COMPILER MATCHES "clang") message( "Using clang flags." ) SET(CMAKE_C_FLAGS_DEBUG " -O1 -fno-omit-frame-pointer -g -Wall -Wextra -Wpedantic -Wno-unused-result -D_DEBUG") @@ -72,6 +74,12 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=64) ADD_DEFINITIONS(-DWITH_IPV6) ADD_DEFINITIONS(-DBUILD_TYPE=${CMAKE_BUILD_TYPE}) +if (DEBUG_LOCKS) + ADD_DEFINITIONS(-DDEBUG_LOCKS) +ENDIF() +if (DEBUG_THREADS) + ADD_DEFINITIONS(-DDEBUG_THREADS) +ENDIF() FIND_PACKAGE(Threads) diff --git a/src/server/locks.c b/src/server/locks.c index b39576b..4d9cde6 100644 --- a/src/server/locks.c +++ b/src/server/locks.c @@ -9,7 +9,7 @@ #include "helper.h" #include "../shared/timing.h" -#ifdef _DEBUG +#ifdef DEBUG_LOCKS #define MAXLOCKS (SERVER_MAX_CLIENTS * 2 + SERVER_MAX_ALTS + 200 + SERVER_MAX_IMAGES) #define MAXTHREADS (SERVER_MAX_CLIENTS + 100) #define MAXLPT 20 diff --git a/src/server/locks.h b/src/server/locks.h index e5c9801..6111d71 100644 --- a/src/server/locks.h +++ b/src/server/locks.h @@ -26,7 +26,7 @@ // -#ifdef _DEBUG +#ifdef DEBUG_LOCKS #define mutex_init( lock, prio ) debug_mutex_init( #lock, __FILE__, __LINE__, lock, prio) #define mutex_lock( lock ) debug_mutex_lock( #lock, __FILE__, __LINE__, lock, false) -- cgit v1.2.3-55-g7522