Author: rmacklem
Date: Tue Dec 19 23:00:08 2017
New Revision: 327008
URL: https://svnweb.freebsd.org/changeset/base/327008

Log:
  MFC: r326544
  Avoid the overhead of acquiring a lock in nfsrv_checkgetattr() when
  there are no write delegations issued.
  
  manu@ reported on the freebsd-current@ mailing list that there was
  a significant performance hit in nfsrv_checkgetattr() caused by
  the acquisition/release of a state lock, even when there were no
  write delegations issued.
  This patch add a count of outstanding issued write delegations to the
  NFSv4 server. This count allows nfsrv_checkgetattr() to return without
  acquiring any lock when the count is 0, avoiding the performance hit
  for the case where no write delegations are issued.

Modified:
  stable/10/sys/fs/nfsserver/nfs_nfsdstate.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- stable/10/sys/fs/nfsserver/nfs_nfsdstate.c  Tue Dec 19 22:43:39 2017        
(r327007)
+++ stable/10/sys/fs/nfsserver/nfs_nfsdstate.c  Tue Dec 19 23:00:08 2017        
(r327008)
@@ -98,6 +98,7 @@ static time_t nfsrvboottime;
 static int nfsrv_returnoldstateid = 0, nfsrv_clients = 0;
 static int nfsrv_clienthighwater = NFSRV_CLIENTHIGHWATER;
 static int nfsrv_nogsscallback = 0;
+static volatile int nfsrv_writedelegcnt = 0;
 
 /* local functions */
 static void nfsrv_dumpaclient(struct nfsclient *clp,
@@ -1266,6 +1267,8 @@ nfsrv_freedeleg(struct nfsstate *stp)
        LIST_REMOVE(stp, ls_hash);
        LIST_REMOVE(stp, ls_list);
        LIST_REMOVE(stp, ls_file);
+       if ((stp->ls_flags & NFSLCK_DELEGWRITE) != 0)
+               nfsrv_writedelegcnt--;
        lfp = stp->ls_lfp;
        if (LIST_EMPTY(&lfp->lf_open) &&
            LIST_EMPTY(&lfp->lf_lock) && LIST_EMPTY(&lfp->lf_deleg) &&
@@ -2902,6 +2905,7 @@ tryagain:
                    new_deleg->ls_flags = (NFSLCK_DELEGWRITE |
                        NFSLCK_READACCESS | NFSLCK_WRITEACCESS);
                    *rflagsp |= NFSV4OPEN_WRITEDELEGATE;
+                   nfsrv_writedelegcnt++;
                } else {
                    new_deleg->ls_flags = (NFSLCK_DELEGREAD |
                        NFSLCK_READACCESS);
@@ -3032,6 +3036,7 @@ tryagain:
                        new_deleg->ls_clp = clp;
                        new_deleg->ls_filerev = filerev;
                        new_deleg->ls_compref = nd->nd_compref;
+                       nfsrv_writedelegcnt++;
                        LIST_INSERT_HEAD(&lfp->lf_deleg, new_deleg, ls_file);
                        LIST_INSERT_HEAD(NFSSTATEHASH(clp,
                            new_deleg->ls_stateid), new_deleg, ls_hash);
@@ -3089,6 +3094,7 @@ tryagain:
                            new_deleg->ls_flags = (NFSLCK_DELEGWRITE |
                                NFSLCK_READACCESS | NFSLCK_WRITEACCESS);
                            *rflagsp |= NFSV4OPEN_WRITEDELEGATE;
+                           nfsrv_writedelegcnt++;
                        } else {
                            new_deleg->ls_flags = (NFSLCK_DELEGREAD |
                                NFSLCK_READACCESS);
@@ -3165,6 +3171,7 @@ tryagain:
                                             NFSLCK_READACCESS |
                                             NFSLCK_WRITEACCESS);
                                        *rflagsp |= NFSV4OPEN_WRITEDELEGATE;
+                                       nfsrv_writedelegcnt++;
                                } else {
                                        new_deleg->ls_flags =
                                            (NFSLCK_DELEGREAD |
@@ -5289,6 +5296,8 @@ nfsrv_checkgetattr(struct nfsrv_descript *nd, vnode_t 
 
        NFSCBGETATTR_ATTRBIT(attrbitp, &cbbits);
        if (!NFSNONZERO_ATTRBIT(&cbbits))
+               goto out;
+       if (nfsrv_writedelegcnt == 0)
                goto out;
 
        /*
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to