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);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to