Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 5 Jul 2020 23:07:54 +0000 (UTC)
From:      Mateusz Guzik <mjg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r362950 - head/sys/kern
Message-ID:  <202007052307.065N7sRn034512@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mjg
Date: Sun Jul  5 23:07:54 2020
New Revision: 362950
URL: https://svnweb.freebsd.org/changeset/base/362950

Log:
  lockf: elide avoidable locking in lf_advlockasync
  
  While here assert on ls_threads state.

Modified:
  head/sys/kern/kern_lockf.c

Modified: head/sys/kern/kern_lockf.c
==============================================================================
--- head/sys/kern/kern_lockf.c	Sun Jul  5 21:55:16 2020	(r362949)
+++ head/sys/kern/kern_lockf.c	Sun Jul  5 23:07:54 2020	(r362950)
@@ -637,6 +637,7 @@ retry_setlock:
 			VI_UNLOCK(vp);
 		} else {
 			state = *statep;
+			MPASS(state->ls_threads >= 0);
 			state->ls_threads++;
 			VI_UNLOCK(vp);
 
@@ -647,6 +648,7 @@ retry_setlock:
 			free(ls, M_LOCKF);
 		}
 	} else {
+		MPASS(state->ls_threads >= 0);
 		state->ls_threads++;
 		VI_UNLOCK(vp);
 	}
@@ -657,8 +659,9 @@ retry_setlock:
 	 * locked. lf_purgelocks() requires that no new threads add
 	 * pending locks when vnode is marked by VIRF_DOOMED flag.
 	 */
-	VI_LOCK(vp);
 	if (VN_IS_DOOMED(vp)) {
+		VI_LOCK(vp);
+		MPASS(state->ls_threads > 0);
 		state->ls_threads--;
 		wakeup(state);
 		VI_UNLOCK(vp);
@@ -666,7 +669,6 @@ retry_setlock:
 		lf_free_lock(lock);
 		return (ENOENT);
 	}
-	VI_UNLOCK(vp);
 
 	switch (ap->a_op) {
 	case F_SETLK:
@@ -728,15 +730,11 @@ retry_setlock:
 	sx_xunlock(&state->ls_lock);
 
 	VI_LOCK(vp);
-
+	MPASS(state->ls_threads > 0);
 	state->ls_threads--;
-	if (LIST_EMPTY(&state->ls_active) && state->ls_threads == 0) {
-		KASSERT(LIST_EMPTY(&state->ls_pending),
-		    ("freeable state with pending locks"));
-	} else {
+	if (state->ls_threads != 0) {
 		wakeup(state);
 	}
-
 	VI_UNLOCK(vp);
 
 	if (error == EDOOFUS) {
@@ -790,6 +788,7 @@ lf_purgelocks(struct vnode *vp, struct lockf **statep)
 		VI_UNLOCK(vp);
 		goto out_free;
 	}
+	MPASS(state->ls_threads >= 0);
 	state->ls_threads++;
 	VI_UNLOCK(vp);
 
@@ -1953,6 +1952,7 @@ lf_iteratelocks_vnode(struct vnode *vp, lf_iterator *f
 		VI_UNLOCK(vp);
 		return (0);
 	}
+	MPASS(ls->ls_threads >= 0);
 	ls->ls_threads++;
 	VI_UNLOCK(vp);
 
@@ -1976,6 +1976,7 @@ lf_iteratelocks_vnode(struct vnode *vp, lf_iterator *f
 	}
 	sx_xunlock(&ls->ls_lock);
 	VI_LOCK(vp);
+	MPASS(ls->ls_threads > 0);
 	ls->ls_threads--;
 	wakeup(ls);
 	VI_UNLOCK(vp);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202007052307.065N7sRn034512>