Date: Thu, 10 Oct 1996 13:17:25 +0100 (BST) From: Doug Rabson <dfr@render.com> To: Hidetoshi Shimokawa <simokawa@sat.t.u-tokyo.ac.jp> Cc: henrich@crh.cl.msu.edu, lite2@freebsd.org Subject: Re: Delayed write patch Message-ID: <Pine.BSF.3.95.961010131427.10204p-100000@minnow.render.com> In-Reply-To: <1519.844933124@sat.t.u-tokyo.ac.jp>
next in thread | previous in thread | raw e-mail | index | archive | help
Thanks for the patch. It improves performance for my SGI from ~720k/sec
to ~870k/sec. I modified the patch (and the nfs_dwrite patch) slightly
and added comments to try to explain what is happening. Could you check
the comments to make sure they agree with your understanding of the
problem and I will commit this patch to current probably tomorrow.
Index: nfs_bio.c
===================================================================
RCS file: /home/ncvs/src/sys/nfs/nfs_bio.c,v
retrieving revision 1.25
diff -u -r1.25 nfs_bio.c
--- nfs_bio.c 1996/09/19 18:20:54 1.25
+++ nfs_bio.c 1996/10/10 12:13:00
@@ -46,6 +46,7 @@
#include <sys/vnode.h>
#include <sys/mount.h>
#include <sys/kernel.h>
+#include <sys/sysctl.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
@@ -65,6 +66,9 @@
extern int nfs_numasync;
extern struct nfsstats nfsstats;
+int nfs_dwrite = 1;
+SYSCTL_INT(_vfs_nfs, OID_AUTO, dwrite, CTLFLAG_RW, &nfs_dwrite, 0, "");
+
/*
* Ifdefs for FreeBSD-current's merged VM/buffer cache. It is unfortunate
* that this isn't done inside getblk() and brelse() so these calls
@@ -750,6 +754,14 @@
* synchronously.
*/
if (bp->b_flags & (B_READ | B_WRITEINPROG | B_NOCACHE))
+ return (EIO);
+
+ /*
+ * Allow the administrator to override the choice of using a delayed
+ * write since it is a pessimization for some servers, notably some
+ * Solaris servers.
+ */
+ if (!nfs_dwrite)
return (EIO);
/*
Index: nfs_socket.c
===================================================================
RCS file: /home/ncvs/src/sys/nfs/nfs_socket.c,v
retrieving revision 1.17
diff -u -r1.17 nfs_socket.c
--- nfs_socket.c 1996/07/11 16:32:45 1.17
+++ nfs_socket.c 1996/10/10 10:56:48
@@ -681,15 +681,17 @@
* sbwait() after someone else has received my reply for me.
* Also necessary for connection based protocols to avoid
* race conditions during a reconnect.
+ * If nfs_rcvlock() returns EALREADY, that means that
+ * the reply has already been recieved by another
+ * process and we can return immediately. In this
+ * case, the lock is not taken to avoid races with
+ * other processes.
*/
error = nfs_rcvlock(myrep);
+ if (error == EALREADY)
+ return (0);
if (error)
return (error);
- /* Already received, bye bye */
- if (myrep->r_mrep != NULL) {
- nfs_rcvunlock(&nmp->nm_flag);
- return (0);
- }
/*
* Get the next Rpc reply off the socket
*/
@@ -1494,6 +1496,14 @@
*flagp |= NFSMNT_WANTRCV;
(void) tsleep((caddr_t)flagp, slpflag | (PZERO - 1), "nfsrcvlk",
slptimeo);
+ /*
+ * If our reply was recieved while we were sleeping,
+ * then just return without taking the lock to avoid a
+ * situation where a single iod could 'capture' the
+ * recieve lock.
+ */
+ if (rep->r_mrep != NULL)
+ return (EALREADY);
if (slpflag == PCATCH) {
slpflag = 0;
slptimeo = 2 * hz;
--
Doug Rabson, Microsoft RenderMorphics Ltd. Mail: dfr@render.com
Phone: +44 171 734 3761
FAX: +44 171 734 6426
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.3.95.961010131427.10204p-100000>
