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 */
/*