kernel - Adjust NFS server for new allocvnode() code
authorMatthew Dillon <dillon@apollo.backplane.com>
Sat, 8 Dec 2012 05:21:55 +0000 (21:21 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Sat, 8 Dec 2012 05:21:55 +0000 (21:21 -0800)
* Adjust the NFS server to check for LWP_MP_VNLRU garbage collection
  requests and act on them.

  This prevents excessive allocation of vnodes by the nfsd's.

sys/kern/kern_proc.c
sys/sys/proc.h
sys/vfs/nfs/nfs_syscalls.c

index 2817511..d2004e4 100644 (file)
@@ -873,6 +873,25 @@ lwpuserret(struct lwp *lp)
 }
 
 /*
+ * Kernel threads run from user processes can also accumulate deferred
+ * actions which need to be acted upon.  Callers include:
+ *
+ * nfsd                - Can allocate lots of vnodes
+ */
+void
+lwpkthreaddeferred(void)
+{
+       struct lwp *lp = curthread->td_lwp;
+
+       if (lp) {
+               if (lp->lwp_mpflags & LWP_MP_VNLRU) {
+                       atomic_clear_int(&lp->lwp_mpflags, LWP_MP_VNLRU);
+                       allocvnode_gc();
+               }
+       }
+}
+
+/*
  * Scan all processes on the allproc list.  The process is automatically
  * held for the callback.  A return value of -1 terminates the loop.
  *
index 058b278..5269bdc 100644 (file)
@@ -570,6 +570,7 @@ int pholdzomb (struct proc *);
 void   prelezomb (struct proc *);
 void   pstall (struct proc *, const char *, int);
 void   lwpuserret(struct lwp *);
+void   lwpkthreaddeferred(void);
 
 u_int32_t      procrunnable (void);
 
index c3d5c8a..dce5f8c 100644 (file)
@@ -661,6 +661,7 @@ nfssvc_nfsd(struct nfsd_srvargs *nsd, caddr_t argp, struct thread *td)
                            error = (*(nfsrv3_procs[nd->nd_procnum]))(nd,
                                                slp, nfsd->nfsd_td, &mreq);
                            /* NOT YET lwkt_gettoken(&slp->ns_token); */
+                           lwpkthreaddeferred();       /* vnlru issues */
                        }
                        if (mreq == NULL)
                                break;