Clip the settings for the NFS rsize, wsize mount options

to a power of 2. For non-power of 2 settings, intermittent
page faults have been reported. Although the bug that causes
these page faults/crashes has not been identified, it does
not appear to occur when rsize, wsize is a power of 2.

Reported by:	tcberner@gmail.com
MFC after:	2 weeks
This commit is contained in:
Rick Macklem 2014-10-22 22:27:51 +00:00
parent fcf121d481
commit 6a30c96cdc
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=273486

View File

@ -621,17 +621,27 @@ nfs_decode_args(struct mount *mp, struct nfsmount *nmp, struct nfs_args *argp,
if ((argp->flags & NFSMNT_WSIZE) && argp->wsize > 0) {
nmp->nm_wsize = argp->wsize;
/* Round down to multiple of blocksize */
nmp->nm_wsize &= ~(NFS_FABLKSIZE - 1);
if (nmp->nm_wsize <= 0)
/*
* Clip at the power of 2 below the size. There is an
* issue (not isolated) that causes intermittent page
* faults if this is not done.
*/
if (nmp->nm_wsize > NFS_FABLKSIZE)
nmp->nm_wsize = 1 << (fls(nmp->nm_wsize) - 1);
else
nmp->nm_wsize = NFS_FABLKSIZE;
}
if ((argp->flags & NFSMNT_RSIZE) && argp->rsize > 0) {
nmp->nm_rsize = argp->rsize;
/* Round down to multiple of blocksize */
nmp->nm_rsize &= ~(NFS_FABLKSIZE - 1);
if (nmp->nm_rsize <= 0)
/*
* Clip at the power of 2 below the size. There is an
* issue (not isolated) that causes intermittent page
* faults if this is not done.
*/
if (nmp->nm_rsize > NFS_FABLKSIZE)
nmp->nm_rsize = 1 << (fls(nmp->nm_rsize) - 1);
else
nmp->nm_rsize = NFS_FABLKSIZE;
}