Date: Fri, 17 Aug 2012 23:05:44 +0000 From: gmiller@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r240481 - in soc2012/gmiller/locking-head: . lib/libwitness Message-ID: <20120817230544.EFC65106564A@hub.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: gmiller Date: Fri Aug 17 23:05:44 2012 New Revision: 240481 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=240481 Log: r240502@FreeBSD-dev: root | 2012-08-15 14:29:18 -0500 Reorganize some witness code, cleaning up and correcting the code that prevents witness from including its own lock usage in the graphs. Added: soc2012/gmiller/locking-head/lib/libwitness/api.c - copied, changed from r240291, soc2012/gmiller/locking-head/lib/libwitness/wrappers.c Deleted: soc2012/gmiller/locking-head/lib/libwitness/wrappers.c Modified: soc2012/gmiller/locking-head/ (props changed) soc2012/gmiller/locking-head/lib/libwitness/Makefile soc2012/gmiller/locking-head/lib/libwitness/lists.c soc2012/gmiller/locking-head/lib/libwitness/lockinfo.c soc2012/gmiller/locking-head/lib/libwitness/logs.c soc2012/gmiller/locking-head/lib/libwitness/witness.h Modified: soc2012/gmiller/locking-head/lib/libwitness/Makefile ============================================================================== --- soc2012/gmiller/locking-head/lib/libwitness/Makefile Fri Aug 17 20:15:01 2012 (r240480) +++ soc2012/gmiller/locking-head/lib/libwitness/Makefile Fri Aug 17 23:05:44 2012 (r240481) @@ -4,7 +4,7 @@ LIB= witness SHLIB_MAJOR= 1 -SRCS= wrappers.c graph.c lists.c logs.c lockinfo.c xml.c unwind.c +SRCS= api.c graph.c lists.c logs.c lockinfo.c xml.c unwind.c DPADD= ${LIBTHR} LDADD= -lthr Copied and modified: soc2012/gmiller/locking-head/lib/libwitness/api.c (from r240291, soc2012/gmiller/locking-head/lib/libwitness/wrappers.c) ============================================================================== --- soc2012/gmiller/locking-head/lib/libwitness/wrappers.c Sun Aug 12 07:09:25 2012 (r240291, copy source) +++ soc2012/gmiller/locking-head/lib/libwitness/api.c Fri Aug 17 23:05:44 2012 (r240481) @@ -50,21 +50,44 @@ pthread_mutex_t witness_mtx = PTHREAD_MUTEX_INITIALIZER; +static int witness_depth = 0; + +void +enter_witness(void) +{ + _pthread_mutex_lock(&witness_mtx); + + witness_depth++; +} + +void +leave_witness(void) +{ + witness_depth--; + + _pthread_mutex_unlock(&witness_mtx); +} + +int +in_witness(void) { + return (witness_depth); +} + int pthread_mutex_lock(pthread_mutex_t *mutex) { int ret; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); check_default_name(mutex, "mutex"); ret = _pthread_mutex_lock(mutex); - if (mutex != &witness_mtx && ret == 0) { + if (ret == 0) { add_lock(mutex); } - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -74,16 +97,16 @@ { int ret; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); check_default_name(mutex, "mutex"); ret = _pthread_mutex_trylock(mutex); - if (mutex != &witness_mtx && ret == 0) { + if (ret == 0) { add_lock(mutex); } - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -93,16 +116,16 @@ { int ret; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); check_default_name(mutex, "mutex"); ret = _pthread_mutex_timedlock(mutex, ts); - if (mutex != &witness_mtx && ret == 0) { + if (ret == 0) { add_lock(mutex); } - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -112,14 +135,14 @@ { int ret; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); ret = _pthread_mutex_unlock(mutex); - if (mutex != &witness_mtx && ret == 0) { + if (ret == 0) { remove_lock(mutex); } - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -129,12 +152,12 @@ { int ret; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); destroy_lock(mutex); ret = _pthread_mutex_destroy(mutex); - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -144,7 +167,7 @@ { int ret; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); check_default_name(rwlock, "rwlock"); @@ -153,7 +176,7 @@ add_lock(rwlock); } - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -163,7 +186,7 @@ { int ret; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); check_default_name(rwlock, "rwlock"); @@ -172,7 +195,7 @@ add_lock(rwlock); } - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -182,7 +205,7 @@ { int ret; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); check_default_name(rwlock, "rwlock"); @@ -191,7 +214,7 @@ add_lock(rwlock); } - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -201,7 +224,7 @@ { int ret; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); check_default_name(rwlock, "rwlock"); @@ -210,7 +233,7 @@ add_lock(rwlock); } - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -220,7 +243,7 @@ { int ret; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); check_default_name(rwlock, "rwlock"); @@ -229,7 +252,7 @@ add_lock(rwlock); } - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -239,7 +262,7 @@ { int ret; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); check_default_name(rwlock, "rwlock"); @@ -248,7 +271,7 @@ add_lock(rwlock); } - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -258,14 +281,14 @@ { int ret; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); ret = _pthread_rwlock_unlock(rwlock); if (ret == 0) { remove_lock(rwlock); } - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -275,12 +298,12 @@ { int ret; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); destroy_lock(rwlock); ret = _pthread_rwlock_destroy(rwlock); - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -290,7 +313,7 @@ { int ret; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); check_default_name(spin, "spinlock"); @@ -299,7 +322,7 @@ add_lock(spin); } - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -309,7 +332,7 @@ { int ret; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); check_default_name(spin, "spinlock"); @@ -318,7 +341,7 @@ add_lock(spin); } - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -328,14 +351,14 @@ { int ret; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); ret = _pthread_spin_unlock(spin); if (ret == 0) { remove_lock(spin); } - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -345,12 +368,12 @@ { int ret; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); destroy_lock(spin); ret = _pthread_spin_destroy(spin); - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -360,14 +383,14 @@ { int ret = 0; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); if (insert_lock(get_lock_info(lookup_lock(first)), get_lock_info(lookup_lock(second))) < 0) { ret = EINVAL; } - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -383,7 +406,7 @@ struct blessing *second_bless = NULL; int ret = 0; - _pthread_mutex_lock(&witness_mtx); + enter_witness(); first_inst = lookup_lock(first_addr); second_inst = lookup_lock(second_addr); @@ -410,7 +433,7 @@ bless_next); } - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -418,29 +441,53 @@ void pthread_lockorder_reset_np(void) { - _pthread_mutex_lock(&witness_mtx); + enter_witness(); reset_lists(); reset_lock_instance(); reset_lock_info(); - _pthread_mutex_unlock(&witness_mtx); + leave_witness(); } int pthread_mutex_setname_np(pthread_mutex_t *mutex, const char *name) { - return (set_lock_name(mutex, name)); + int ret; + + enter_witness(); + + ret = set_lock_name(mutex, name); + + leave_witness(); + + return (ret); } int pthread_rwlock_setname_np(pthread_rwlock_t *rwlock, const char *name) { - return (set_lock_name(rwlock, name)); + int ret; + + enter_witness(); + + ret = set_lock_name(rwlock, name); + + leave_witness(); + + return (ret); } int pthread_spin_setname_np(pthread_spinlock_t *spin, const char *name) { - return (set_lock_name(spin, name)); + int ret; + + enter_witness(); + + ret = set_lock_name(spin, name); + + leave_witness(); + + return (ret); } Modified: soc2012/gmiller/locking-head/lib/libwitness/lists.c ============================================================================== --- soc2012/gmiller/locking-head/lib/libwitness/lists.c Fri Aug 17 20:15:01 2012 (r240480) +++ soc2012/gmiller/locking-head/lib/libwitness/lists.c Fri Aug 17 23:05:44 2012 (r240481) @@ -68,19 +68,16 @@ struct lock_entry *next; struct lock_instance *inst; struct lock_info *info; - static int in_add_lock = 0; if (exit_set == 0) { atexit(write_xml); exit_set = 1; } - if (in_add_lock || lock == NULL) { + if (in_witness() > 1 || lock == NULL) { return; } - in_add_lock = 1; - inst = lookup_lock(lock); info = get_lock_info(inst); @@ -88,7 +85,6 @@ entry = malloc(sizeof(*entry)); if (entry == NULL) { - in_add_lock = 0; return; } @@ -116,8 +112,6 @@ log_reversal(entry->lock, &entry->trace, next->lock, &next->trace); } - - in_add_lock = 0; } void Modified: soc2012/gmiller/locking-head/lib/libwitness/lockinfo.c ============================================================================== --- soc2012/gmiller/locking-head/lib/libwitness/lockinfo.c Fri Aug 17 20:15:01 2012 (r240480) +++ soc2012/gmiller/locking-head/lib/libwitness/lockinfo.c Fri Aug 17 23:05:44 2012 (r240481) @@ -241,11 +241,7 @@ { int ret = 0; - /* - The lock isn't needed to prevent races, but it is needed to ensure - that any locks grabbed by malloc() don't get logged. - */ - pthread_mutex_lock(&witness_mtx); + enter_witness(); node->_pvt = malloc(sizeof(struct _pthread_lockorder_private)); if (node->_pvt == NULL) { @@ -255,7 +251,7 @@ node->name = NULL; } - pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -267,6 +263,8 @@ return (0); } + enter_witness(); + if (node->_pvt->last_record == NULL) { node->_pvt->last_record = SLIST_FIRST(&lock_info_head); } else { @@ -275,15 +273,11 @@ } if (node->_pvt->last_record == NULL) { + leave_witness(); + return (0); } - /* - The lock isn't needed to prevent races, but it is needed to ensure - that any locks grabbed for memory allocation don't get logged. - */ - pthread_mutex_lock(&witness_mtx); - if (node->name != NULL) { free(node->name); } @@ -302,7 +296,7 @@ node->sibling = NULL; } - pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (1); } Modified: soc2012/gmiller/locking-head/lib/libwitness/logs.c ============================================================================== --- soc2012/gmiller/locking-head/lib/libwitness/logs.c Fri Aug 17 20:15:01 2012 (r240480) +++ soc2012/gmiller/locking-head/lib/libwitness/logs.c Fri Aug 17 23:05:44 2012 (r240481) @@ -68,11 +68,7 @@ lor->name_second = NULL; lor->second_trace = NULL; - /* - The lock isn't needed to prevent races, but it is needed to ensure - that any locks grabbed by malloc() don't get logged. - */ - pthread_mutex_lock(&witness_mtx); + enter_witness(); lor->_pvt = malloc(sizeof(struct _pthread_lor_private)); if (lor->_pvt == NULL) { @@ -81,7 +77,7 @@ lor->_pvt->last_record = NULL; } - pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (ret); } @@ -91,7 +87,7 @@ { int res = 0; - pthread_mutex_lock(&witness_mtx); + enter_witness(); if (lor->_pvt == NULL || lor->_pvt->last_record == NULL) { lor->_pvt->last_record = STAILQ_FIRST(&lor_head); @@ -113,7 +109,7 @@ res = 1; } - pthread_mutex_unlock(&witness_mtx); + leave_witness(); return (res); } @@ -149,7 +145,7 @@ struct lor_entry *lor; struct lor_entry *lor_temp; - pthread_mutex_lock(&witness_mtx); + enter_witness(); STAILQ_FOREACH_SAFE(lor, &lor_head, lor_next, lor_temp) { STAILQ_REMOVE(&lor_head, lor, lor_entry, lor_next); @@ -165,5 +161,5 @@ free(lor); } - pthread_mutex_unlock(&witness_mtx); + leave_witness(); } Modified: soc2012/gmiller/locking-head/lib/libwitness/witness.h ============================================================================== --- soc2012/gmiller/locking-head/lib/libwitness/witness.h Fri Aug 17 20:15:01 2012 (r240480) +++ soc2012/gmiller/locking-head/lib/libwitness/witness.h Fri Aug 17 23:05:44 2012 (r240481) @@ -62,8 +62,6 @@ SLIST_HEAD(backtrace, stack_frame); -extern pthread_mutex_t witness_mtx; - void add_lock(void *lock); void remove_lock(void *lock); void free_frame(struct backtrace *trace); @@ -92,3 +90,7 @@ void record_backtrace(struct backtrace *trace); char *trace_str(struct backtrace *trace); + +void enter_witness(void); +void leave_witness(void); +int in_witness(void);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120817230544.EFC65106564A>