Module Name:    src
Committed By:   christos
Date:           Mon Mar  9 01:41:41 UTC 2015

Modified Files:
        src/sys/dev: lockstat.c lockstat.h

Log Message:
Introduce a new flag LB_DTRACE for dtrace lockstat events.
Split lockstat_enabled into two parts, one controlled by dtrace called
"lockstat_dtrace_enabled" and one by the lockstat device called
"lockstat_dev_enabled". Create a macro that needs to be called when either
of them changes LOCKSTAT_ENABLED_UPDATE().


To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/sys/dev/lockstat.c
cvs rdiff -u -r1.12 -r1.13 src/sys/dev/lockstat.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/lockstat.c
diff -u src/sys/dev/lockstat.c:1.20 src/sys/dev/lockstat.c:1.21
--- src/sys/dev/lockstat.c:1.20	Sun Mar  8 18:45:16 2015
+++ src/sys/dev/lockstat.c	Sun Mar  8 21:41:41 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lockstat.c,v 1.20 2015/03/08 22:45:16 christos Exp $	*/
+/*	$NetBSD: lockstat.c,v 1.21 2015/03/09 01:41:41 christos Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007 The NetBSD Foundation, Inc.
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lockstat.c,v 1.20 2015/03/08 22:45:16 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lockstat.c,v 1.21 2015/03/09 01:41:41 christos Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -97,6 +97,7 @@ dev_type_read(lockstat_read);
 dev_type_ioctl(lockstat_ioctl);
 
 volatile u_int	lockstat_enabled;
+volatile u_int	lockstat_dev_enabled;
 uintptr_t	lockstat_csstart;
 uintptr_t	lockstat_csend;
 uintptr_t	lockstat_csmask;
@@ -111,6 +112,7 @@ int		lockstat_busy;
 struct timespec	lockstat_stime;
 
 #ifdef KDTRACE_HOOKS
+volatile u_int lockstat_dtrace_enabled;
 CTASSERT(LB_NEVENT <= 3);
 CTASSERT(LB_NLOCK <= (7 << LB_LOCK_SHIFT));
 void
@@ -164,7 +166,7 @@ lockstat_init_tables(lsenable_t *le)
 	lscpu_t *lc;
 	lsbuf_t *lb;
 
-	KASSERT(!lockstat_enabled);
+	KASSERT(!lockstat_dev_enabled);
 
 	for (CPU_INFO_FOREACH(cii, ci)) {
 		if (ci->ci_lockstat != NULL) {
@@ -209,7 +211,7 @@ void
 lockstat_start(lsenable_t *le)
 {
 
-	KASSERT(!lockstat_enabled);
+	KASSERT(!lockstat_dev_enabled);
 
 	lockstat_init_tables(le);
 
@@ -230,8 +232,8 @@ lockstat_start(lsenable_t *le)
 	lockstat_lockend = le->le_lockend;
 	membar_sync();
 	getnanotime(&lockstat_stime);
-	lockstat_enabled = le->le_mask;
-	membar_producer();
+	lockstat_dev_enabled = le->le_mask;
+	LOCKSTAT_ENABLED_UPDATE();
 }
 
 /*
@@ -247,14 +249,14 @@ lockstat_stop(lsdisable_t *ld)
 	int error;
 	lwp_t *l;
 
-	KASSERT(lockstat_enabled);
+	KASSERT(lockstat_dev_enabled);
 
 	/*
 	 * Set enabled false, force a write barrier, and wait for other CPUs
 	 * to exit lockstat_event().
 	 */
-	lockstat_enabled = 0;
-	membar_producer();
+	lockstat_dev_enabled = 0;
+	LOCKSTAT_ENABLED_UPDATE();
 	getnanotime(&ts);
 	tsleep(&lockstat_stop, PPAUSE, "lockstat", mstohz(10));
 
@@ -313,7 +315,7 @@ lockstat_alloc(lsenable_t *le)
 	lsbuf_t *lb;
 	size_t sz;
 
-	KASSERT(!lockstat_enabled);
+	KASSERT(!lockstat_dev_enabled);
 	lockstat_free();
 
 	sz = sizeof(*lb) * le->le_nbufs;
@@ -322,7 +324,7 @@ lockstat_alloc(lsenable_t *le)
 	if (lb == NULL)
 		return (ENOMEM);
 
-	KASSERT(!lockstat_enabled);
+	KASSERT(!lockstat_dev_enabled);
 	KASSERT(lockstat_baseb == NULL);
 	lockstat_sizeb = sz;
 	lockstat_baseb = lb;
@@ -337,7 +339,7 @@ void
 lockstat_free(void)
 {
 
-	KASSERT(!lockstat_enabled);
+	KASSERT(!lockstat_dev_enabled);
 
 	if (lockstat_baseb != NULL) {
 		kmem_free(lockstat_baseb, lockstat_sizeb);
@@ -366,7 +368,7 @@ lockstat_event(uintptr_t lock, uintptr_t
 		    cycles);
 #endif
 
-	if ((flags & lockstat_enabled) != flags || count == 0)
+	if ((flags & lockstat_dev_enabled) != flags || count == 0)
 		return;
 	if (lock < lockstat_lockstart || lock > lockstat_lockend)
 		return;
@@ -474,7 +476,7 @@ lockstat_ioctl(dev_t dev, u_long cmd, vo
 			error = ENODEV;
 			break;
 		}
-		if (lockstat_enabled) {
+		if (lockstat_dev_enabled) {
 			error = EBUSY;
 			break;
 		}
@@ -510,7 +512,7 @@ lockstat_ioctl(dev_t dev, u_long cmd, vo
 		break;
 
 	case IOC_LOCKSTAT_DISABLE:
-		if (!lockstat_enabled)
+		if (!lockstat_dev_enabled)
 			error = EINVAL;
 		else
 			error = lockstat_stop((lsdisable_t *)data);
@@ -531,7 +533,7 @@ int
 lockstat_read(dev_t dev, struct uio *uio, int flag)
 {
 
-	if (curlwp != lockstat_lwp || lockstat_enabled)
+	if (curlwp != lockstat_lwp || lockstat_dev_enabled)
 		return EBUSY;
 	return uiomove(lockstat_baseb, lockstat_sizeb, uio);
 }

Index: src/sys/dev/lockstat.h
diff -u src/sys/dev/lockstat.h:1.12 src/sys/dev/lockstat.h:1.13
--- src/sys/dev/lockstat.h:1.12	Sun Mar  8 20:40:35 2015
+++ src/sys/dev/lockstat.h	Sun Mar  8 21:41:41 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lockstat.h,v 1.12 2015/03/09 00:40:35 christos Exp $	*/
+/*	$NetBSD: lockstat.h,v 1.13 2015/03/09 01:41:41 christos Exp $	*/
 
 /*-
  * Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -119,6 +119,8 @@ typedef struct lsdisable {
 #define	LB_LOCK_MASK		0x0000ff00
 #define	LB_LOCK_SHIFT		8
 
+#define	LB_DTRACE		0x00010000
+
 typedef struct lsbuf {
 	union {
 		LIST_ENTRY(lsbuf) list;
@@ -180,6 +182,7 @@ do {									\
 void	lockstat_event(uintptr_t, uintptr_t, u_int, u_int, uint64_t);
 
 extern volatile u_int	lockstat_enabled;
+extern volatile u_int	lockstat_dev_enabled;
 
 #else
 
@@ -197,6 +200,8 @@ extern volatile u_int	lockstat_enabled;
 #endif
 
 #ifdef KDTRACE_HOOKS
+extern volatile u_int lockstat_dtrace_enabled;
+#define KDTRACE_LOCKSTAT_ENABLED lockstat_dtrace_enabled
 #define LS_COMPRESS(f) \
     ((((f) & 0x3) | (((f) & 0x700) >> 6)) & (LS_NPROBES - 1))
 #define	LS_NPROBES	0x20	/* 5 bits */
@@ -207,6 +212,13 @@ extern void	(*lockstat_probe_func)(uint3
 
 void		lockstat_probe_stub(uint32_t, uintptr_t, uintptr_t,
     uintptr_t, uintptr_t, uintptr_t);
+#else
+#define KDTRACE_LOCKSTAT_ENABLED 0
 #endif
 
+#define LOCKSTAT_ENABLED_UPDATE() do { \
+	lockstat_enabled = lockstat_dev_enabled | KDTRACE_LOCKSTAT_ENABLED; \
+	membar_producer(); \
+    } while (/*CONSTCOND*/0)
+
 #endif	/* _SYS_LOCKSTAT_H_ */

Reply via email to