Author: mjg
Date: Sun Apr 22 09:30:07 2018
New Revision: 332870
URL: https://svnweb.freebsd.org/changeset/base/332870

Log:
  lockf: slightly depessimize
  
  1. check if P_ADVLOCK is already set and if so, don't lock to set it
  (stolen from DragonFly)
  2. when trying for fast path unlock, check that we are doing unlock
  first instead of taking the interlock for no reason (e.g. if we want
  to *lock*). whilere make it more likely that falling fast path will
  not take the interlock either by checking for state
  
  Note the code is severely pessimized both single- and multithreaded.

Modified:
  head/sys/kern/kern_descrip.c
  head/sys/kern/kern_lockf.c

Modified: head/sys/kern/kern_descrip.c
==============================================================================
--- head/sys/kern/kern_descrip.c        Sun Apr 22 06:11:46 2018        
(r332869)
+++ head/sys/kern/kern_descrip.c        Sun Apr 22 09:30:07 2018        
(r332870)
@@ -648,9 +648,11 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_
                                error = EBADF;
                                break;
                        }
-                       PROC_LOCK(p->p_leader);
-                       p->p_leader->p_flag |= P_ADVLOCK;
-                       PROC_UNLOCK(p->p_leader);
+                       if ((p->p_leader->p_flag & P_ADVLOCK) == 0) {
+                               PROC_LOCK(p->p_leader);
+                               p->p_leader->p_flag |= P_ADVLOCK;
+                               PROC_UNLOCK(p->p_leader);
+                       }
                        error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_SETLK,
                            flp, flg);
                        break;
@@ -659,9 +661,11 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_
                                error = EBADF;
                                break;
                        }
-                       PROC_LOCK(p->p_leader);
-                       p->p_leader->p_flag |= P_ADVLOCK;
-                       PROC_UNLOCK(p->p_leader);
+                       if ((p->p_leader->p_flag & P_ADVLOCK) == 0) {
+                               PROC_LOCK(p->p_leader);
+                               p->p_leader->p_flag |= P_ADVLOCK;
+                               PROC_UNLOCK(p->p_leader);
+                       }
                        error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_SETLK,
                            flp, flg);
                        break;

Modified: head/sys/kern/kern_lockf.c
==============================================================================
--- head/sys/kern/kern_lockf.c  Sun Apr 22 06:11:46 2018        (r332869)
+++ head/sys/kern/kern_lockf.c  Sun Apr 22 09:30:07 2018        (r332870)
@@ -479,15 +479,15 @@ retry_setlock:
        /*
         * Avoid the common case of unlocking when inode has no locks.
         */
-       VI_LOCK(vp);
-       if ((*statep) == NULL) {
-               if (ap->a_op != F_SETLK) {
+       if (ap->a_op != F_SETLK && (*statep) == NULL) {
+               VI_LOCK(vp);
+               if ((*statep) == NULL) {
                        fl->l_type = F_UNLCK;
                        VI_UNLOCK(vp);
                        return (0);
                }
+               VI_UNLOCK(vp);
        }
-       VI_UNLOCK(vp);
 
        /*
         * Map our arguments to an existing lock owner or create one
_______________________________________________
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