Module Name: src Committed By: ozaki-r Date: Fri Mar 16 04:43:38 UTC 2018
Modified Files: src/sys/kern: subr_lockdebug.c Log Message: Add a new command, show lockstat, which shows statistics of locks Currently the command shows the number of allocated locks. The command is useful only if LOCKDEBUG is enabled. To generate a diff of this commit: cvs rdiff -u -r1.60 -r1.61 src/sys/kern/subr_lockdebug.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/subr_lockdebug.c diff -u src/sys/kern/subr_lockdebug.c:1.60 src/sys/kern/subr_lockdebug.c:1.61 --- src/sys/kern/subr_lockdebug.c:1.60 Tue Feb 20 03:34:52 2018 +++ src/sys/kern/subr_lockdebug.c Fri Mar 16 04:43:37 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_lockdebug.c,v 1.60 2018/02/20 03:34:52 ozaki-r Exp $ */ +/* $NetBSD: subr_lockdebug.c,v 1.61 2018/03/16 04:43:37 ozaki-r Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_lockdebug.c,v 1.60 2018/02/20 03:34:52 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_lockdebug.c,v 1.61 2018/03/16 04:43:37 ozaki-r Exp $"); #ifdef _KERNEL_OPT #include "opt_ddb.h" @@ -838,6 +838,56 @@ lockdebug_lock_print(void *addr, void (* (*pr)("Sorry, kernel not built with the LOCKDEBUG option.\n"); #endif /* LOCKDEBUG */ } + +void +lockdebug_show_lockstat(void (*pr)(const char *, ...)) +{ +#ifdef LOCKDEBUG + lockdebug_t *ld; + void *_ld; + uint32_t n_null = 0; + uint32_t n_spin_mutex = 0; + uint32_t n_adaptive_mutex = 0; + uint32_t n_rwlock = 0; + uint32_t n_cv = 0; + uint32_t n_others = 0; + + RB_TREE_FOREACH(_ld, &ld_rb_tree) { + ld = _ld; + if (ld->ld_lock == NULL) { + n_null++; + continue; + } + if (ld->ld_lockops->lo_type == LOCKOPS_CV) { + n_cv++; + continue; + } + if (ld->ld_lockops->lo_name[0] == 'M') { + if (ld->ld_lockops->lo_type == LOCKOPS_SLEEP) + n_adaptive_mutex++; + else + n_spin_mutex++; + continue; + } + if (ld->ld_lockops->lo_name[0] == 'R') { + n_rwlock++; + continue; + } + n_others++; + } + (*pr)( + "condvar: %u\n" + "spin mutex: %u\n" + "adaptive mutex: %u\n" + "rwlock: %u\n" + "null locks: %u\n" + "others: %u\n", + n_cv, n_spin_mutex, n_adaptive_mutex, n_rwlock, + n_null, n_others); +#else + (*pr)("Sorry, kernel not built with the LOCKDEBUG option.\n"); +#endif /* LOCKDEBUG */ +} #endif /* DDB */ /*