Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 13 Oct 2016 08:09:40 +0000 (UTC)
From:      Sepherosa Ziehau <sephe@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r307203 - in stable/10: lib/libstand sys/boot/i386/pxeldr
Message-ID:  <201610130809.u9D89eO8031336@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: sephe
Date: Thu Oct 13 08:09:40 2016
New Revision: 307203
URL: https://svnweb.freebsd.org/changeset/base/307203

Log:
  MFC 305588
  
      pxeboot: Add nfs.read_size tunable.
  
      Increase this tunable improves kernel loading speed.
  
      Submitted by:   Jun Su <junsu microsoft com>
      Reviewed by:    rpokala, wblock (previous version)
      Obtained from:  DragonFlyBSD
      Sponsored by:   Microsoft
      Differential Revision:  https://reviews.freebsd.org/D7756

Modified:
  stable/10/lib/libstand/nfs.c
  stable/10/sys/boot/i386/pxeldr/pxeboot.8
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/lib/libstand/nfs.c
==============================================================================
--- stable/10/lib/libstand/nfs.c	Thu Oct 13 08:06:49 2016	(r307202)
+++ stable/10/lib/libstand/nfs.c	Thu Oct 13 08:09:40 2016	(r307203)
@@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/socket.h>
 #include <sys/stat.h>
 #include <string.h>
+#include <stddef.h>
 
 #include <netinet/in.h>
 #include <netinet/in_systm.h>
@@ -50,7 +51,8 @@ __FBSDID("$FreeBSD$");
 
 #define NFS_DEBUGxx
 
-#define NFSREAD_SIZE 1024
+#define NFSREAD_MIN_SIZE 1024
+#define NFSREAD_MAX_SIZE 4096
 
 /* Define our own NFS attributes without NQNFS stuff. */
 #ifdef OLD_NFSV2
@@ -83,7 +85,7 @@ struct nfs_read_repl {
 	n_long	errno;
 	struct	nfsv2_fattrs fa;
 	n_long	count;
-	u_char	data[NFSREAD_SIZE];
+	u_char	data[NFSREAD_MAX_SIZE];
 };
 
 #ifndef NFS_NOSYMLINK
@@ -210,6 +212,8 @@ struct fs_ops nfs_fsops = {
 	nfs_readdir
 };
 
+static int nfs_read_size = NFSREAD_MIN_SIZE;
+
 #ifdef	OLD_NFSV2
 /*
  * Fetch the root file handle (call mount daemon)
@@ -264,6 +268,17 @@ nfs_getrootfh(struct iodesc *d, char *pa
 	if (repl->errno)
 		return (ntohl(repl->errno));
 	bcopy(repl->fh, fhp, sizeof(repl->fh));
+
+	/*
+	 * Improve boot performance over NFS
+	 */
+	if (getenv("nfs.read_size") != NULL)
+		nfs_read_size = strtol(getenv("nfs.read_size"), NULL, 0);
+	if (nfs_read_size < NFSREAD_MIN_SIZE)
+		nfs_read_size = NFSREAD_MIN_SIZE;
+	if (nfs_read_size > NFSREAD_MAX_SIZE)
+		nfs_read_size = NFSREAD_MAX_SIZE;
+
 	return (0);
 }
 
@@ -401,11 +416,11 @@ nfs_readdata(struct nfs_iodesc *d, off_t
 
 	bcopy(d->fh, args->fh, NFS_FHSIZE);
 	args->off = htonl((n_long)off);
-	if (len > NFSREAD_SIZE)
-		len = NFSREAD_SIZE;
+	if (len > nfs_read_size)
+		len = nfs_read_size;
 	args->len = htonl((n_long)len);
 	args->xxx = htonl((n_long)0);
-	hlen = sizeof(*repl) - NFSREAD_SIZE;
+	hlen = offsetof(struct nfs_read_rpl, data[0]);
 
 	cc = rpc_call(d->iodesc, NFS_PROG, NFS_VER2, NFSPROC_READ,
 	    args, sizeof(*args),
@@ -1022,7 +1037,7 @@ nfs_readdata(struct nfs_iodesc *d, off_t
 		uint32_t count;
 		uint32_t eof;
 		uint32_t len;
-		u_char data[NFSREAD_SIZE];
+		u_char data[NFSREAD_MAX_SIZE];
 	} *repl;
 	struct {
 		uint32_t h[RPC_HEADER_WORDS];
@@ -1045,10 +1060,10 @@ nfs_readdata(struct nfs_iodesc *d, off_t
 	pos = roundup(d->fhsize, sizeof(uint32_t)) / sizeof(uint32_t);
 	args->fhoffcnt[pos++] = 0;
 	args->fhoffcnt[pos++] = htonl((uint32_t)off);
-	if (len > NFSREAD_SIZE)
-		len = NFSREAD_SIZE;
+	if (len > nfs_read_size)
+		len = nfs_read_size;
 	args->fhoffcnt[pos] = htonl((uint32_t)len);
-	hlen = sizeof(*repl) - NFSREAD_SIZE;
+	hlen = offsetof(struct repl, data[0]);
 
 	cc = rpc_call(d->iodesc, NFS_PROG, NFS_VER3, NFSPROCV3_READ,
 	    args, 4 * sizeof(uint32_t) + roundup(d->fhsize, sizeof(uint32_t)),

Modified: stable/10/sys/boot/i386/pxeldr/pxeboot.8
==============================================================================
--- stable/10/sys/boot/i386/pxeldr/pxeboot.8	Thu Oct 13 08:06:49 2016	(r307202)
+++ stable/10/sys/boot/i386/pxeldr/pxeboot.8	Thu Oct 13 08:09:40 2016	(r307203)
@@ -85,6 +85,14 @@ expects to fetch
 .Pa /boot/loader.rc
 from the specified server before loading any other files.
 .Pp
+.Nm
+defaults to a conservative 1024 byte NFS data packet size.
+This may be changed by setting the
+.Va nfs.read_size
+variable in
+.Pa /boot/loader.conf .
+Valid values range from 1024 to 4096 bytes.
+.Pp
 In all other respects,
 .Nm
 acts just like



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201610130809.u9D89eO8031336>