Module Name:    src
Committed By:   hannken
Date:           Tue May  3 08:34:00 UTC 2022

Modified Files:
        src/sys/kern: vnode_if.sh vnode_if.src
        src/sys/rump: Makefile.rump README.compileopts

Log Message:
Make option VNODE_LOCKDEBUG more functional.

- Add "LOCKED=EXCL" option for vnode operations needing exclusive locked nodes.

- As it is impossible to check for shared locks held by current thread avoid
  false assertions by testing for exclusive lock only in the "LOCKED=NO" case.

- New option "RUMP_VNODE_LOCKDEBUG" enables VNODE_LOCKDEBUG for the rump kernel.


To generate a diff of this commit:
cvs rdiff -u -r1.73 -r1.74 src/sys/kern/vnode_if.sh
cvs rdiff -u -r1.83 -r1.84 src/sys/kern/vnode_if.src
cvs rdiff -u -r1.133 -r1.134 src/sys/rump/Makefile.rump
cvs rdiff -u -r1.14 -r1.15 src/sys/rump/README.compileopts

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/vnode_if.sh
diff -u src/sys/kern/vnode_if.sh:1.73 src/sys/kern/vnode_if.sh:1.74
--- src/sys/kern/vnode_if.sh:1.73	Sat Mar 19 13:53:32 2022
+++ src/sys/kern/vnode_if.sh	Tue May  3 08:33:59 2022
@@ -29,7 +29,7 @@ copyright="\
  * SUCH DAMAGE.
  */
 "
-SCRIPT_ID='$NetBSD: vnode_if.sh,v 1.73 2022/03/19 13:53:32 hannken Exp $'
+SCRIPT_ID='$NetBSD: vnode_if.sh,v 1.74 2022/05/03 08:33:59 hannken Exp $'
 
 # Script to produce VFS front-end sugar.
 #
@@ -53,7 +53,7 @@ out_h=../sys/vnode_if.h
 out_rumph=../rump/include/rump/rumpvnode_if.h
 
 # generate VNODE_LOCKDEBUG checks (not fully functional)
-lockdebug=0
+lockdebug=1
 
 # Awk program (must support nawk extensions)
 # Use "awk" at Berkeley, "nawk" or "gawk" elsewhere.
@@ -150,14 +150,17 @@ awk_parser='
 	i=2;
 
 	if (is_context == 0) {
-		if ($2 == "LOCKED=YES") {
-			lockstate[argc] = 1;
+		if ($2 == "LOCKED=EXCL") {
+			lockstate[argc] = "elocked";
+			i++;
+		} else if ($2 == "LOCKED=YES") {
+			lockstate[argc] = "locked";
 			i++;
 		} else if ($2 == "LOCKED=NO") {
-			lockstate[argc] = 0;
+			lockstate[argc] = "unlocked";
 			i++;
 		} else
-			lockstate[argc] = -1;
+			lockstate[argc] = "";
 
 		if ($2 == "WILLRELE" ||
 		    $3 == "WILLRELE") {
@@ -175,7 +178,8 @@ awk_parser='
 			i++;
 		}
 		if (argc == 0 && fstrans == "") {
-			if (lockstate[0] == 1)
+			if (lockstate[0] == "locked" ||
+			     lockstate[0] == "elocked")
 				fstrans = "NO";
 			else
 				fstrans = "YES";
@@ -249,12 +253,6 @@ echo -n "$copyright"
 echo ''
 echo "#ifndef _${SYS}VNODE_IF_H_"
 echo "#define _${SYS}VNODE_IF_H_"
-if [ ${lockdebug} -ne 0 ] ; then
-	echo ''
-	echo '#ifdef _KERNEL_OPT'
-	echo '#include "opt_vnode_lockdebug.h"'
-	echo '#endif /* _KERNEL_OPT */'
-fi
 [ -z "${rump}" ] && echo "
 extern const struct vnodeop_desc ${rump}vop_default_desc;"
 echo
@@ -343,7 +341,12 @@ echo "
 #include <sys/cdefs.h>
 __KERNEL_RCSID(0, \"\$NetBSD\$\");"
 
-[ ${lockdebug} -ne 0 ] && echo && echo '#include "opt_vnode_lockdebug.h"'
+if [ -z "${rump}" -a ${lockdebug} -ne 0 ] ; then
+	echo ''
+	echo '#ifdef _KERNEL_OPT'
+	echo '#include "opt_vnode_lockdebug.h"'
+	echo '#endif /* _KERNEL_OPT */'
+fi
 
 echo '
 #include <sys/param.h>
@@ -604,6 +607,33 @@ vop_post(vnode_t *vp, struct mount *mp, 
 	}
 }
 
+static inline void
+assert_vop_unlocked(vnode_t *vp, const char *str)
+{
+
+	if (VOP_ISLOCKED(vp) == LK_EXCLUSIVE)
+		panic(\"%s: %p %d/%d is locked but should not be\",
+		    str, vp, vp->v_tag, vp->v_type);
+}
+
+static inline void
+assert_vop_locked(vnode_t *vp, const char *str)
+{
+
+	if (VOP_ISLOCKED(vp) == LK_NONE)
+		panic(\"%s: %p %d/%d is not locked but should be\",
+		    str, vp, vp->v_tag, vp->v_type);
+}
+
+static inline void
+assert_vop_elocked(vnode_t *vp, const char *str)
+{
+
+	if (VOP_ISLOCKED(vp) != LK_EXCLUSIVE)
+		panic(\"%s: %p %d/%d is not exclusive locked but should be\",
+		    str, vp, vp->v_tag, vp->v_type);
+}
+
 const struct vnodeop_desc vop_default_desc = {"
 echo '	0,
 	"default",
@@ -691,25 +721,16 @@ function bodynorm() {
 	printf("{\n\tint error;\n\tbool mpsafe;\n\tstruct %s_args a;\n",
 		args_name);
 	printf("\tstruct mount *mp;\n");
-	if (lockdebug) {
-		printf("#ifdef VNODE_LOCKDEBUG\n");
-		for (i=0; i<argc; i++) {
-			if (lockstate[i] != -1)
-				printf("\tint islocked_%s;\n", argname[i]);
-		}
-		printf("#endif\n");
-	}
 	printf("\ta.a_desc = VDESC(%s);\n", name);
 	for (i=0; i<argc; i++) {
 		printf("\ta.a_%s = %s;\n", argname[i], argname[i]);
-		if (lockdebug && lockstate[i] != -1) {
-			printf("#ifdef VNODE_LOCKDEBUG\n");
-			printf("\tislocked_%s = (VOP_ISLOCKED(%s) == LK_EXCLUSIVE);\n",
-			    argname[i], argname[i]);
-			printf("\tif (islocked_%s != %d)\n", argname[i],
-			    lockstate[i]);
-			printf("\t\tpanic(\"%s: %s: locked %%d, expected %%d\", islocked_%s, %d);\n", name, argname[i], argname[i], lockstate[i]);
-			printf("#endif\n");
+	}
+	if (lockdebug) {
+		for (i=0; i<argc; i++) {
+			if (lockstate[i] == "")
+				continue;
+			printf("\tassert_vop_%s(%s, \"%s: %s\");\n",
+			    lockstate[i], argname[i], name, argname[i]);
 		}
 	}
 	# This is done before generic vop_pre() because we want

Index: src/sys/kern/vnode_if.src
diff -u src/sys/kern/vnode_if.src:1.83 src/sys/kern/vnode_if.src:1.84
--- src/sys/kern/vnode_if.src:1.83	Wed Oct 20 03:08:18 2021
+++ src/sys/kern/vnode_if.src	Tue May  3 08:33:59 2022
@@ -1,4 +1,4 @@
-#	$NetBSD: vnode_if.src,v 1.83 2021/10/20 03:08:18 thorpej Exp $
+#	$NetBSD: vnode_if.src,v 1.84 2022/05/03 08:33:59 hannken Exp $
 #
 # Copyright (c) 1992, 1993
 #	The Regents of the University of California.  All rights reserved.
@@ -96,7 +96,7 @@ vop_lookup {
 vop_create {
 	VERSION 3
 	POST=vop_create_post
-	IN LOCKED=YES struct vnode *dvp;
+	IN LOCKED=EXCL struct vnode *dvp;
 	OUT WILLMAKE struct vnode **vpp;
 	IN struct componentname *cnp;
 	IN struct vattr *vap;
@@ -111,7 +111,7 @@ vop_create {
 vop_mknod {
 	VERSION 3
 	POST=vop_mknod_post
-	IN LOCKED=YES struct vnode *dvp;
+	IN LOCKED=EXCL struct vnode *dvp;
 	OUT WILLMAKE struct vnode **vpp;
 	IN struct componentname *cnp;
 	IN struct vattr *vap;
@@ -170,7 +170,7 @@ vop_getattr {
 vop_setattr {
 	PRE=vop_setattr_pre
 	POST=vop_setattr_post
-	IN LOCKED=YES struct vnode *vp;
+	IN LOCKED=EXCL struct vnode *vp;
 	IN struct vattr *vap;
 	IN kauth_cred_t cred;
 };
@@ -306,7 +306,7 @@ vop_remove {
 	VERSION 3
 	PRE=vop_remove_pre
 	POST=vop_remove_post
-	IN LOCKED=YES struct vnode *dvp;
+	IN LOCKED=EXCL struct vnode *dvp;
 	IN LOCKED=YES WILLPUT struct vnode *vp;
 	IN struct componentname *cnp;
 	CONTEXT nlink_t vp_new_nlink;
@@ -321,7 +321,7 @@ vop_remove {
 vop_link {
 	VERSION 2
 	POST=vop_link_post
-	IN LOCKED=YES struct vnode *dvp;
+	IN LOCKED=EXCL struct vnode *dvp;
 	IN LOCKED=NO struct vnode *vp;
 	IN struct componentname *cnp;
 };
@@ -336,8 +336,8 @@ vop_link {
 #! rename tcnp	RENAME, LOCKPARENT | LOCKLEAF | NOCACHE
 #
 vop_rename {
-	IN LOCKED=NO WILLRELE struct vnode *fdvp;
-	IN LOCKED=NO WILLRELE struct vnode *fvp;
+	IN WILLRELE struct vnode *fdvp;
+	IN WILLRELE struct vnode *fvp;
 	IN struct componentname *fcnp;
 	IN LOCKED=YES WILLPUT struct vnode *tdvp;
 	IN WILLPUT struct vnode *tvp;
@@ -353,7 +353,7 @@ vop_rename {
 vop_mkdir {
 	VERSION 3
 	POST=vop_mkdir_post
-	IN LOCKED=YES struct vnode *dvp;
+	IN LOCKED=EXCL struct vnode *dvp;
 	OUT WILLMAKE struct vnode **vpp;
 	IN struct componentname *cnp;
 	IN struct vattr *vap;
@@ -369,8 +369,8 @@ vop_rmdir {
 	VERSION 2
 	PRE=vop_rmdir_pre
 	POST=vop_rmdir_post
-	IN LOCKED=YES struct vnode *dvp;
-	IN LOCKED=YES WILLPUT struct vnode *vp;
+	IN LOCKED=EXCL struct vnode *dvp;
+	IN LOCKED=EXCL WILLPUT struct vnode *vp;
 	IN struct componentname *cnp;
 };
 
@@ -383,7 +383,7 @@ vop_rmdir {
 vop_symlink {
 	VERSION 3
 	POST=vop_symlink_post
-	IN LOCKED=YES struct vnode *dvp;
+	IN LOCKED=EXCL struct vnode *dvp;
 	OUT WILLMAKE struct vnode **vpp;
 	IN struct componentname *cnp;
 	IN struct vattr *vap;
@@ -426,7 +426,7 @@ vop_abortop {
 #
 vop_inactive {
 	VERSION 2
-	IN LOCKED=YES struct vnode *vp;
+	IN LOCKED=EXCL struct vnode *vp;
 	INOUT bool *recycle;
 };
 
@@ -436,7 +436,7 @@ vop_inactive {
 vop_reclaim {
 	VERSION 2
 	FSTRANS=NO
-	IN LOCKED=YES struct vnode *vp;
+	IN LOCKED=EXCL struct vnode *vp;
 };
 
 #
@@ -444,7 +444,7 @@ vop_reclaim {
 #
 vop_lock {
 	FSTRANS=LOCK
-	IN LOCKED=NO struct vnode *vp;
+	IN struct vnode *vp;
 	IN int flags;
 };
 
@@ -521,7 +521,7 @@ vop_advlock {
 #! whiteout cnp	CREATE, LOCKPARENT
 # 
 vop_whiteout {
-	IN LOCKED=YES struct vnode *dvp;
+	IN LOCKED=EXCL struct vnode *dvp;
 	IN struct componentname *cnp;
 	IN int flags;
 };
@@ -567,7 +567,7 @@ vop_getacl {
 #
 vop_setacl {
 	POST=vop_setacl_post
-	IN struct vnode *vp;
+	IN LOCKED=EXCL struct vnode *vp;
 	IN acl_type_t type;
 	IN struct acl *aclp;
 	IN kauth_cred_t cred;
@@ -628,7 +628,7 @@ vop_openextattr {
 #% deleteextattr vp L L L
 #
 vop_deleteextattr {
-	IN LOCKED=YES struct vnode *vp;
+	IN LOCKED=EXCL struct vnode *vp;
 	IN int attrnamespace;
 	IN const char *name;
 	IN kauth_cred_t cred;
@@ -638,7 +638,7 @@ vop_deleteextattr {
 #% setextattr	vp L L L
 #
 vop_setextattr {
-	IN LOCKED=YES struct vnode *vp;
+	IN LOCKED=EXCL struct vnode *vp;
 	IN int attrnamespace;
 	IN const char *name;
 	INOUT struct uio *uio;

Index: src/sys/rump/Makefile.rump
diff -u src/sys/rump/Makefile.rump:1.133 src/sys/rump/Makefile.rump:1.134
--- src/sys/rump/Makefile.rump:1.133	Wed Jul  7 11:51:45 2021
+++ src/sys/rump/Makefile.rump	Tue May  3 08:34:00 2022
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.rump,v 1.133 2021/07/07 11:51:45 martin Exp $
+#	$NetBSD: Makefile.rump,v 1.134 2022/05/03 08:34:00 hannken Exp $
 #
 
 .if !defined(_RUMP_MK)
@@ -123,6 +123,10 @@ CPPFLAGS+=	-DDEBUG
 CPPFLAGS+=	-DLOCKDEBUG
 .endif
 
+.ifdef RUMP_VNODE_LOCKDEBUG
+CPPFLAGS+=	-DVNODE_LOCKDEBUG
+.endif
+
 RUMP_KTRACE?=yes
 .if ${RUMP_KTRACE} == "yes"
 CPPFLAGS+=	-DKTRACE

Index: src/sys/rump/README.compileopts
diff -u src/sys/rump/README.compileopts:1.14 src/sys/rump/README.compileopts:1.15
--- src/sys/rump/README.compileopts:1.14	Mon Jan 25 00:24:23 2016
+++ src/sys/rump/README.compileopts	Tue May  3 08:34:00 2022
@@ -1,4 +1,4 @@
-	$NetBSD: README.compileopts,v 1.14 2016/01/25 00:24:23 pooka Exp $
+	$NetBSD: README.compileopts,v 1.15 2022/05/03 08:34:00 hannken Exp $
 
 This file describes compile-time options for rump kernels.  Additionally,
 NetBSD build options will have an effect.  See src/share/mk/bsd.README
@@ -30,6 +30,13 @@ defval:	<undefined>
 effect:	Iff defined, build with -DLOCKDEBUG.
 
 
+    RUMP_VNODE_LOCKDEBUG
+
+values:	<defined> / <undefined>
+defval:	<undefined>
+effect:	Iff defined, build with -DVNODE_LOCKDEBUG.
+
+
     RUMP_KTRACE
 
 values:	yes|no

Reply via email to