diff options
Diffstat (limited to 'usr/src/boot')
| -rw-r--r-- | usr/src/boot/lib/libstand/nfs.c | 59 | ||||
| -rw-r--r-- | usr/src/boot/sys/boot/i386/pxeldr/pxeboot.8 | 8 | 
2 files changed, 57 insertions, 10 deletions
| diff --git a/usr/src/boot/lib/libstand/nfs.c b/usr/src/boot/lib/libstand/nfs.c index 29f8ecf514..d6b129adf2 100644 --- a/usr/src/boot/lib/libstand/nfs.c +++ b/usr/src/boot/lib/libstand/nfs.c @@ -29,13 +29,13 @@   */  #include <sys/cdefs.h> -__FBSDID("$FreeBSD$");  #include <sys/param.h>  #include <sys/time.h>  #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 +50,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 +84,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 +211,40 @@ struct fs_ops nfs_fsops = {  	nfs_readdir  }; +static int nfs_read_size = NFSREAD_MIN_SIZE; + +/* + * Improve boot performance over NFS + */ +static void +set_nfs_read_size(void) +{ +	char *env, *end; +	char buf[10]; + +	if ((env = getenv("nfs.read_size")) != NULL) { +		errno = 0; +		nfs_read_size = strtol(env, &end, 0); +		if (errno != 0 || *env == '\0' || *end != '\0') { +			printf("%s: bad value: \"%s\", defaulting to %d\n", +			    "nfs.read_size", env, NFSREAD_MIN_SIZE); +			nfs_read_size = NFSREAD_MIN_SIZE; +		} +	} +	if (nfs_read_size < NFSREAD_MIN_SIZE) { +		printf("%s: bad value: \"%d\", defaulting to %d\n", +		    "nfs.read_size", nfs_read_size, NFSREAD_MIN_SIZE); +		nfs_read_size = NFSREAD_MIN_SIZE; +	} +	if (nfs_read_size > NFSREAD_MAX_SIZE) { +		printf("%s: bad value: \"%d\", defaulting to %d\n", +		    "nfs.read_size", nfs_read_size, NFSREAD_MIN_SIZE); +		nfs_read_size = NFSREAD_MAX_SIZE; +	} +	snprintf(buf, sizeof (buf), "%d", nfs_read_size); +	setenv("nfs.read_size", buf, 1); +} +  #ifdef	OLD_NFSV2  /*   * Fetch the root file handle (call mount daemon) @@ -264,6 +299,8 @@ nfs_getrootfh(struct iodesc *d, char *path, u_char *fhp)  	if (repl->errno)  		return (ntohl(repl->errno));  	bcopy(repl->fh, fhp, sizeof(repl->fh)); + +	set_nfs_read_size();  	return (0);  } @@ -401,11 +438,11 @@ nfs_readdata(struct nfs_iodesc *d, off_t off, void *addr, size_t len)  	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), @@ -870,6 +907,8 @@ nfs_getrootfh(struct iodesc *d, char *path, uint32_t *fhlenp, u_char *fhp)  		return (ntohl(repl->errno));  	*fhlenp = ntohl(repl->fhsize);  	bcopy(repl->fh, fhp, *fhlenp); + +	set_nfs_read_size();  	return (0);  } @@ -1025,7 +1064,7 @@ nfs_readdata(struct nfs_iodesc *d, off_t off, void *addr, size_t len)  		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]; @@ -1048,10 +1087,10 @@ nfs_readdata(struct nfs_iodesc *d, off_t off, void *addr, size_t len)  	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)), diff --git a/usr/src/boot/sys/boot/i386/pxeldr/pxeboot.8 b/usr/src/boot/sys/boot/i386/pxeldr/pxeboot.8 index d2ca7038c5..7f57d5a087 100644 --- a/usr/src/boot/sys/boot/i386/pxeldr/pxeboot.8 +++ b/usr/src/boot/sys/boot/i386/pxeldr/pxeboot.8 @@ -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 | 
