summaryrefslogtreecommitdiff
path: root/sys/nfsserver
diff options
context:
space:
mode:
authorDoug Rabson <dfr@FreeBSD.org>1996-11-06 10:53:16 +0000
committerDoug Rabson <dfr@FreeBSD.org>1996-11-06 10:53:16 +0000
commitf438ae02f5bfa5a0614fcee77ea16bedf78f508f (patch)
treeb99fa8ba7a7ef13dafb400913ede1cef59f59743 /sys/nfsserver
parentd3cf2d5d31ce6c15b140d5d9a8daa5ffe89f208a (diff)
Notes
Diffstat (limited to 'sys/nfsserver')
-rw-r--r--sys/nfsserver/nfs.h4
-rw-r--r--sys/nfsserver/nfs_srvsubs.c8
-rw-r--r--sys/nfsserver/nfs_syscalls.c80
-rw-r--r--sys/nfsserver/nfsrvstats.h4
4 files changed, 48 insertions, 48 deletions
diff --git a/sys/nfsserver/nfs.h b/sys/nfsserver/nfs.h
index 3d9d801740d6..bc2edeb12ac5 100644
--- a/sys/nfsserver/nfs.h
+++ b/sys/nfsserver/nfs.h
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs.h 8.1 (Berkeley) 6/10/93
- * $Id: nfs.h,v 1.17 1996/01/30 22:59:39 mpp Exp $
+ * $Id: nfs.h,v 1.18 1996/08/21 21:55:44 dyson Exp $
*/
#ifndef _NFS_NFS_H_
@@ -335,7 +335,7 @@ extern TAILQ_HEAD(nfs_reqq, nfsreq) nfs_reqq;
#define NWDELAYHASH(sock, f) \
(&(sock)->ns_wdelayhashtbl[(*((u_long *)(f))) % NFS_WDELAYHASHSIZ])
#ifndef NFS_MUIDHASHSIZ
-#define NFS_MUIDHASHSIZ 67 /* Tune the size of nfsmount with this */
+#define NFS_MUIDHASHSIZ 63 /* Tune the size of nfsmount with this */
#endif
#define NMUIDHASH(nmp, uid) \
(&(nmp)->nm_uidhashtbl[(uid) % NFS_MUIDHASHSIZ])
diff --git a/sys/nfsserver/nfs_srvsubs.c b/sys/nfsserver/nfs_srvsubs.c
index 7d97f0954c16..2566fe6472eb 100644
--- a/sys/nfsserver/nfs_srvsubs.c
+++ b/sys/nfsserver/nfs_srvsubs.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs_subs.c 8.3 (Berkeley) 1/4/94
- * $Id: nfs_subs.c,v 1.32 1996/08/21 21:55:51 dyson Exp $
+ * $Id: nfs_subs.c,v 1.33 1996/09/19 18:20:59 nate Exp $
*/
/*
@@ -538,7 +538,6 @@ static short *nfsrv_v3errmap[] = {
#endif /* NFS_NOSERVER */
-extern struct proc *nfs_iodwant[NFS_MAXASYNCDAEMON];
extern struct nfsrtt nfsrtt;
extern time_t nqnfsstarttime;
extern int nqsrv_clockskew;
@@ -1136,9 +1135,10 @@ nfs_init()
if (nfs_ticks < 1)
nfs_ticks = 1;
/* Ensure async daemons disabled */
- for (i = 0; i < NFS_MAXASYNCDAEMON; i++)
+ for (i = 0; i < NFS_MAXASYNCDAEMON; i++) {
nfs_iodwant[i] = (struct proc *)0;
- TAILQ_INIT(&nfs_bufq);
+ nfs_iodmount[i] = (struct nfsmount *)0;
+ }
nfs_nhinit(); /* Init the nfsnode table */
#ifndef NFS_NOSERVER
nfsrv_init(0); /* Init server data structures */
diff --git a/sys/nfsserver/nfs_syscalls.c b/sys/nfsserver/nfs_syscalls.c
index d94b7e61ccff..e2f34353e241 100644
--- a/sys/nfsserver/nfs_syscalls.c
+++ b/sys/nfsserver/nfs_syscalls.c
@@ -34,13 +34,14 @@
* SUCH DAMAGE.
*
* @(#)nfs_syscalls.c 8.3 (Berkeley) 1/4/94
- * $Id: nfs_syscalls.c,v 1.13 1996/01/13 23:27:58 phk Exp $
+ * $Id: nfs_syscalls.c,v 1.14 1996/04/30 23:26:52 bde Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
#include <sys/kernel.h>
+#include <sys/sysctl.h>
#include <sys/file.h>
#include <sys/filedesc.h>
#include <sys/stat.h>
@@ -79,7 +80,6 @@ extern int (*nfsrv3_procs[NFS_NPROCS]) __P((struct nfsrv_descript *nd,
struct nfssvc_sock *slp,
struct proc *procp,
struct mbuf **mreqp));
-extern struct proc *nfs_iodwant[NFS_MAXASYNCDAEMON];
extern int nfs_numasync;
extern time_t nqnfsstarttime;
extern int nqsrv_writeslack;
@@ -715,6 +715,9 @@ done:
}
#endif /* NFS_NOSERVER */
+int nfs_defect = 0;
+SYSCTL_INT(_vfs_nfs, OID_AUTO, defect, CTLFLAG_RW, &nfs_defect, 0, "");
+
/*
* Asynchronous I/O daemons for client nfs.
* They do read-ahead and write-behind operations on the block I/O cache.
@@ -727,6 +730,7 @@ nfssvc_iod(p)
register struct buf *bp, *nbp;
register int i, myiod;
struct vnode *vp;
+ struct nfsmount *nmp;
int error = 0, s;
/*
@@ -746,53 +750,49 @@ nfssvc_iod(p)
* Just loop around doin our stuff until SIGKILL
*/
for (;;) {
- while (nfs_bufq.tqh_first == NULL && error == 0) {
+ while (((nmp = nfs_iodmount[myiod]) == NULL
+ || nmp->nm_bufq.tqh_first == NULL)
+ && error == 0) {
+ if (nmp)
+ nmp->nm_bufqiods--;
nfs_iodwant[myiod] = p;
+ nfs_iodmount[myiod] = NULL;
error = tsleep((caddr_t)&nfs_iodwant[myiod],
PWAIT | PCATCH, "nfsidl", 0);
}
- while ((bp = nfs_bufq.tqh_first) != NULL) {
- /* Take one off the front of the list */
- TAILQ_REMOVE(&nfs_bufq, bp, b_freelist);
- if (bp->b_flags & B_READ)
- (void) nfs_doio(bp, bp->b_rcred, (struct proc *)0);
- else do {
- /*
- * Look for a delayed write for the same vnode, so I can do
- * it now. We must grab it before calling nfs_doio() to
- * avoid any risk of the vnode getting vclean()'d while
- * we are doing the write rpc.
- */
- vp = bp->b_vp;
- s = splbio();
- for (nbp = vp->v_dirtyblkhd.lh_first; nbp;
- nbp = nbp->b_vnbufs.le_next) {
- if ((nbp->b_flags &
- (B_BUSY|B_DELWRI|B_NEEDCOMMIT|B_NOCACHE))!=B_DELWRI)
- continue;
- bremfree(nbp);
- vfs_busy_pages(nbp, 1);
- nbp->b_flags |= (B_BUSY|B_ASYNC);
- break;
- }
- splx(s);
- /*
- * For the delayed write, do the first part of nfs_bwrite()
- * up to, but not including nfs_strategy().
- */
- if (nbp) {
- nbp->b_flags &= ~(B_READ|B_DONE|B_ERROR|B_DELWRI);
- reassignbuf(nbp, nbp->b_vp);
- nbp->b_vp->v_numoutput++;
- }
- (void) nfs_doio(bp, bp->b_wcred, (struct proc *)0);
- } while (bp = nbp);
- }
if (error) {
nfs_asyncdaemon[myiod] = 0;
+ if (nmp) nmp->nm_bufqiods--;
+ nfs_iodmount[myiod] = NULL;
nfs_numasync--;
return (error);
}
+ while ((bp = nmp->nm_bufq.tqh_first) != NULL) {
+ /* Take one off the front of the list */
+ TAILQ_REMOVE(&nmp->nm_bufq, bp, b_freelist);
+ nmp->nm_bufqlen--;
+ if (nmp->nm_bufqwant && nmp->nm_bufqlen < 2 * nfs_numasync) {
+ nmp->nm_bufqwant = FALSE;
+ wakeup(&nmp->nm_bufq);
+ }
+ if (bp->b_flags & B_READ)
+ (void) nfs_doio(bp, bp->b_rcred, (struct proc *)0);
+ else
+ (void) nfs_doio(bp, bp->b_wcred, (struct proc *)0);
+
+ /*
+ * If there are more than one iod on this mount, then defect
+ * so that the iods can be shared out fairly between the mounts
+ */
+ if (nfs_defect && nmp->nm_bufqiods > 1) {
+ NFS_DPF(ASYNCIO,
+ ("nfssvc_iod: iod %d defecting from mount %p\n",
+ myiod, nmp));
+ nfs_iodmount[myiod] = NULL;
+ nmp->nm_bufqiods--;
+ break;
+ }
+ }
}
}
diff --git a/sys/nfsserver/nfsrvstats.h b/sys/nfsserver/nfsrvstats.h
index 3d9d801740d6..bc2edeb12ac5 100644
--- a/sys/nfsserver/nfsrvstats.h
+++ b/sys/nfsserver/nfsrvstats.h
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs.h 8.1 (Berkeley) 6/10/93
- * $Id: nfs.h,v 1.17 1996/01/30 22:59:39 mpp Exp $
+ * $Id: nfs.h,v 1.18 1996/08/21 21:55:44 dyson Exp $
*/
#ifndef _NFS_NFS_H_
@@ -335,7 +335,7 @@ extern TAILQ_HEAD(nfs_reqq, nfsreq) nfs_reqq;
#define NWDELAYHASH(sock, f) \
(&(sock)->ns_wdelayhashtbl[(*((u_long *)(f))) % NFS_WDELAYHASHSIZ])
#ifndef NFS_MUIDHASHSIZ
-#define NFS_MUIDHASHSIZ 67 /* Tune the size of nfsmount with this */
+#define NFS_MUIDHASHSIZ 63 /* Tune the size of nfsmount with this */
#endif
#define NMUIDHASH(nmp, uid) \
(&(nmp)->nm_uidhashtbl[(uid) % NFS_MUIDHASHSIZ])