Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 18 Jun 2017 12:30:28 +0000
From:      Rick Macklem <rmacklem@uoguelph.ca>
To:        Rick Macklem <rmacklem@FreeBSD.org>, "src-committers@freebsd.org" <src-committers@freebsd.org>, "svn-src-all@freebsd.org" <svn-src-all@freebsd.org>, "svn-src-head@freebsd.org" <svn-src-head@freebsd.org>, "meloun.michal@gmail.com" <meloun.michal@gmail.com>
Subject:   Re: svn commit: r320062 - in head/sys: fs/nfs fs/nfsclient kern sys
Message-ID:  <YTXPR01MB01899231B1ED773928696793DDC70@YTXPR01MB0189.CANPRD01.PROD.OUTLOOK.COM>
In-Reply-To: <e0cd65a3-fe64-df1b-8fd2-561a5afd8cac@gmail.com>
References:  <201706172224.v5HMOJoV090858@repo.freebsd.org>, <e0cd65a3-fe64-df1b-8fd2-561a5afd8cac@gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
I have committed r320070, which takes the definition out of param.h and sho=
uld
fix the build. I will ask on freebsd-current@ how best to fix this.

Thanks for reporting it and sorry about the breakage, rick

________________________________________
From: Michal Meloun <melounmichal@gmail.com>
Sent: Sunday, June 18, 2017 3:16:07 AM
To: Rick Macklem; src-committers@freebsd.org; svn-src-all@freebsd.org; svn-=
src-head@freebsd.org
Subject: Re: svn commit: r320062 - in head/sys: fs/nfs fs/nfsclient kern sy=
s

On 18.06.2017 0:24, Rick Macklem wrote:
> Author: rmacklem
> Date: Sat Jun 17 22:24:19 2017
> New Revision: 320062
> URL: https://svnweb.freebsd.org/changeset/base/320062
>
> Log:
>   Make MAXBCACHEBUF a tunable called vfs.maxbcachebuf.
>
>   By making MAXBCACHEBUF a tunable, it can be increased to allow for
>   larger read/write data sizes for the NFS client.
>   The tunable is limited to MAXPHYS, which is currently 128K.
>   Making MAXPHYS a tunable or increasing its value is being discussed,
>   since it would be nice to support a read/write data size of 1Mbyte
>   for the NFS client when mounting the AmazonEFS file service.
>
>   Reviewed by:        kib
>   MFC after:  2 weeks
>   Relnotes:   yes
>   Differential Revision:      https://reviews.freebsd.org/D10991
>
> Modified:
>   head/sys/fs/nfs/nfs_commonkrpc.c
>   head/sys/fs/nfs/nfsport.h
>   head/sys/fs/nfsclient/nfs_clrpcops.c
>   head/sys/kern/vfs_bio.c
>   head/sys/sys/param.h
>
This one breaks armv6 kernel:

cc -target armv6-gnueabihf-freebsd12.0
--sysroot=3D/usr2/Meloun/obj//arm.armv6/usr2/Meloun/git/tegra/tmp
-B/usr2/Meloun/obj//arm.armv6/usr2/Meloun/git/tegra/tmp/usr/bin -c -x
assembler-with-cpp -DLOCORE -O -pipe  -g -nostdinc  -I.
-I/usr2/Meloun/git/tegra/sys -I/usr2/Meloun/git/tegra/sys/contrib/libfdt
-I/usr2/Meloun/git/tegra/sys/gnu/dts/include -D_KERNEL
-DHAVE_KERNEL_OPTION_HEADERS -include opt_global.h -march=3Darmv7a
-funwind-tables -MD  -MF.depend.elf_note.o -MTelf_note.o -ffreestanding
-fwrapv -gdwarf-2 -Wall -Wredundant-decls -Wnested-externs
-Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Winline
-Wcast-qual -Wundef -Wno-pointer-sign -D__printf__=3D__freebsd_kprintf__
-Wmissing-include-dirs -fdiagnostics-show-option -Wno-unknown-pragmas
-Wno-error-tautological-compare -Wno-error-empty-body
-Wno-error-parentheses-equality -Wno-error-unused-function
-Wno-error-pointer-sign -Wno-error-shift-negative-value
-Wno-error-address-of-packed-member  -mfpu=3Dnone  -std=3Diso9899:1999
-Werror /usr2/Meloun/git/tegra/sys/arm/arm/elf_note.S
/usr2/Meloun/git/tegra/sys/sys/param.h:272:12: error: unexpected token
in argument list
extern int maxbcachebuf;
           ^
/usr2/Meloun/git/tegra/sys/arm/arm/elf_note.S:35:1: warning: DWARF2 only
supports one section per compilation unit
.pushsection .note.tag ; .balign 4 ; .long 2f - 1f ; .long 4f - 3f ;
.long 1 ; 1: .asciz "FreeBSD" ; 2: .balign 4 ; 3: .long 1200033 ; 4:
.balign 4 ; .popsection;
^
*** Error code 1

Michal


> Modified: head/sys/fs/nfs/nfs_commonkrpc.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
> --- head/sys/fs/nfs/nfs_commonkrpc.c  Sat Jun 17 20:33:11 2017        (r3=
20061)
> +++ head/sys/fs/nfs/nfs_commonkrpc.c  Sat Jun 17 22:24:19 2017        (r3=
20062)
> @@ -161,7 +161,7 @@ newnfs_connect(struct nfsmount *nmp, struct nfssockre=
q
>      struct ucred *cred, NFSPROC_T *p, int callback_retry_mult)
>  {
>       int rcvreserve, sndreserve;
> -     int pktscale;
> +     int pktscale, pktscalesav;
>       struct sockaddr *saddr;
>       struct ucred *origcred;
>       CLIENT *client;
> @@ -210,6 +210,7 @@ newnfs_connect(struct nfsmount *nmp, struct nfssockre=
q
>               pktscale =3D 2;
>       if (pktscale > 64)
>               pktscale =3D 64;
> +     pktscalesav =3D pktscale;
>       /*
>        * soreserve() can fail if sb_max is too small, so shrink pktscale
>        * and try again if there is an error.
> @@ -228,8 +229,12 @@ newnfs_connect(struct nfsmount *nmp, struct nfssockr=
eq
>               goto out;
>       }
>       do {
> -         if (error !=3D 0 && pktscale > 2)
> +         if (error !=3D 0 && pktscale > 2) {
> +             if (nmp !=3D NULL && nrp->nr_sotype =3D=3D SOCK_STREAM &&
> +                 pktscale =3D=3D pktscalesav)
> +                 printf("Consider increasing kern.ipc.maxsockbuf\n");
>               pktscale--;
> +         }
>           if (nrp->nr_sotype =3D=3D SOCK_DGRAM) {
>               if (nmp !=3D NULL) {
>                       sndreserve =3D (NFS_MAXDGRAMDATA + NFS_MAXPKTHDR) *
> @@ -243,15 +248,19 @@ newnfs_connect(struct nfsmount *nmp, struct nfssock=
req
>               if (nrp->nr_sotype !=3D SOCK_STREAM)
>                       panic("nfscon sotype");
>               if (nmp !=3D NULL) {
> -                     sndreserve =3D (NFS_MAXBSIZE + NFS_MAXPKTHDR +
> +                     sndreserve =3D (NFS_MAXBSIZE + NFS_MAXXDR +
>                           sizeof (u_int32_t)) * pktscale;
> -                     rcvreserve =3D (NFS_MAXBSIZE + NFS_MAXPKTHDR +
> +                     rcvreserve =3D (NFS_MAXBSIZE + NFS_MAXXDR +
>                           sizeof (u_int32_t)) * pktscale;
>               } else {
>                       sndreserve =3D rcvreserve =3D 1024 * pktscale;
>               }
>           }
>           error =3D soreserve(so, sndreserve, rcvreserve);
> +         if (error !=3D 0 && nmp !=3D NULL && nrp->nr_sotype =3D=3D SOCK=
_STREAM &&
> +             pktscale <=3D 2)
> +             printf("Must increase kern.ipc.maxsockbuf or reduce"
> +                 " rsize, wsize\n");
>       } while (error !=3D 0 && pktscale > 2);
>       soclose(so);
>       if (error) {
>
> Modified: head/sys/fs/nfs/nfsport.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
> --- head/sys/fs/nfs/nfsport.h Sat Jun 17 20:33:11 2017        (r320061)
> +++ head/sys/fs/nfs/nfsport.h Sat Jun 17 22:24:19 2017        (r320062)
> @@ -1016,7 +1016,7 @@ struct nfsreq {
>  };
>
>  #ifndef NFS_MAXBSIZE
> -#define      NFS_MAXBSIZE    MAXBCACHEBUF
> +#define      NFS_MAXBSIZE    (maxbcachebuf)
>  #endif
>
>  /*
>
> Modified: head/sys/fs/nfsclient/nfs_clrpcops.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
> --- head/sys/fs/nfsclient/nfs_clrpcops.c      Sat Jun 17 20:33:11 2017   =
     (r320061)
> +++ head/sys/fs/nfsclient/nfs_clrpcops.c      Sat Jun 17 22:24:19 2017   =
     (r320062)
> @@ -4625,7 +4625,7 @@ nfsrpc_createsession(struct nfsmount *nmp, struct n=
fsc
>      struct nfssockreq *nrp, uint32_t sequenceid, int mds, struct ucred *=
cred,
>      NFSPROC_T *p)
>  {
> -     uint32_t crflags, *tl;
> +     uint32_t crflags, maxval, *tl;
>       struct nfsrv_descript nfsd;
>       struct nfsrv_descript *nd =3D &nfsd;
>       int error, irdcnt;
> @@ -4643,8 +4643,8 @@ nfsrpc_createsession(struct nfsmount *nmp, struct n=
fsc
>       /* Fill in fore channel attributes. */
>       NFSM_BUILD(tl, uint32_t *, 7 * NFSX_UNSIGNED);
>       *tl++ =3D 0;                              /* Header pad size */
> -     *tl++ =3D txdr_unsigned(100000);          /* Max request size */
> -     *tl++ =3D txdr_unsigned(100000);          /* Max response size */
> +     *tl++ =3D txdr_unsigned(nmp->nm_wsize + NFS_MAXXDR);/* Max request =
size */
> +     *tl++ =3D txdr_unsigned(nmp->nm_rsize + NFS_MAXXDR);/* Max reply si=
ze */
>       *tl++ =3D txdr_unsigned(4096);            /* Max response size cach=
ed */
>       *tl++ =3D txdr_unsigned(20);              /* Max operations */
>       *tl++ =3D txdr_unsigned(64);              /* Max slots */
> @@ -4691,7 +4691,26 @@ nfsrpc_createsession(struct nfsmount *nmp, struct =
nfsc
>
>               /* Get the fore channel slot count. */
>               NFSM_DISSECT(tl, uint32_t *, 7 * NFSX_UNSIGNED);
> -             tl +=3D 3;                /* Skip the other counts. */
> +             tl++;                   /* Skip the header pad size. */
> +
> +             /* Make sure nm_wsize is small enough. */
> +             maxval =3D fxdr_unsigned(uint32_t, *tl++);
> +             while (maxval < nmp->nm_wsize + NFS_MAXXDR) {
> +                     if (nmp->nm_wsize > 8096)
> +                             nmp->nm_wsize /=3D 2;
> +                     else
> +                             break;
> +             }
> +
> +             /* Make sure nm_rsize is small enough. */
> +             maxval =3D fxdr_unsigned(uint32_t, *tl++);
> +             while (maxval < nmp->nm_rsize + NFS_MAXXDR) {
> +                     if (nmp->nm_rsize > 8096)
> +                             nmp->nm_rsize /=3D 2;
> +                     else
> +                             break;
> +             }
> +
>               sep->nfsess_maxcache =3D fxdr_unsigned(int, *tl++);
>               tl++;
>               sep->nfsess_foreslots =3D fxdr_unsigned(uint16_t, *tl++);
>
> Modified: head/sys/kern/vfs_bio.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
> --- head/sys/kern/vfs_bio.c   Sat Jun 17 20:33:11 2017        (r320061)
> +++ head/sys/kern/vfs_bio.c   Sat Jun 17 22:24:19 2017        (r320062)
> @@ -131,6 +131,7 @@ static void bufkva_reclaim(vmem_t *, int);
>  static void bufkva_free(struct buf *);
>  static int buf_import(void *, void **, int, int);
>  static void buf_release(void *, void **, int);
> +static void maxbcachebuf_adjust(void);
>
>  #if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \
>      defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7)
> @@ -245,6 +246,9 @@ SYSCTL_LONG(_vfs, OID_AUTO, barrierwrites, CTLFLAG_RW=
,
>  SYSCTL_INT(_vfs, OID_AUTO, unmapped_buf_allowed, CTLFLAG_RD,
>      &unmapped_buf_allowed, 0,
>      "Permit the use of the unmapped i/o");
> +int maxbcachebuf =3D MAXBCACHEBUF;
> +SYSCTL_INT(_vfs, OID_AUTO, maxbcachebuf, CTLFLAG_RDTUN, &maxbcachebuf, 0=
,
> +    "Maximum size of a buffer cache block");
>
>  /*
>   * This lock synchronizes access to bd_request.
> @@ -847,6 +851,29 @@ bd_wakeup(void)
>  }
>
>  /*
> + * Adjust the maxbcachbuf tunable.
> + */
> +static void
> +maxbcachebuf_adjust(void)
> +{
> +     int i;
> +
> +     /*
> +      * maxbcachebuf must be a power of 2 >=3D MAXBSIZE.
> +      */
> +     i =3D 2;
> +     while (i * 2 <=3D maxbcachebuf)
> +             i *=3D 2;
> +     maxbcachebuf =3D i;
> +     if (maxbcachebuf < MAXBSIZE)
> +             maxbcachebuf =3D MAXBSIZE;
> +     if (maxbcachebuf > MAXPHYS)
> +             maxbcachebuf =3D MAXPHYS;
> +     if (bootverbose !=3D 0 && maxbcachebuf !=3D MAXBCACHEBUF)
> +             printf("maxbcachebuf=3D%d\n", maxbcachebuf);
> +}
> +
> +/*
>   * bd_speedup - speedup the buffer cache flushing code
>   */
>  void
> @@ -893,6 +920,7 @@ kern_vfs_bio_buffer_alloc(caddr_t v, long physmem_est=
)
>        */
>       physmem_est =3D physmem_est * (PAGE_SIZE / 1024);
>
> +     maxbcachebuf_adjust();
>       /*
>        * The nominal buffer size (and minimum KVA allocation) is BKVASIZE=
.
>        * For the first 64MB of ram nominally allocate sufficient buffers =
to
> @@ -1003,7 +1031,9 @@ bufinit(void)
>       struct buf *bp;
>       int i;
>
> -     CTASSERT(MAXBCACHEBUF >=3D MAXBSIZE);
> +     KASSERT(maxbcachebuf >=3D MAXBSIZE,
> +         ("maxbcachebuf (%d) must be >=3D MAXBSIZE (%d)\n", maxbcachebuf=
,
> +         MAXBSIZE));
>       mtx_init(&bqlocks[QUEUE_DIRTY], "bufq dirty lock", NULL, MTX_DEF);
>       mtx_init(&bqlocks[QUEUE_EMPTY], "bufq empty lock", NULL, MTX_DEF);
>       for (i =3D QUEUE_CLEAN; i < QUEUE_CLEAN + CLEAN_QUEUES; i++)
> @@ -1050,7 +1080,7 @@ bufinit(void)
>        * PAGE_SIZE.
>        */
>       maxbufspace =3D (long)nbuf * BKVASIZE;
> -     hibufspace =3D lmax(3 * maxbufspace / 4, maxbufspace - MAXBCACHEBUF=
 * 10);
> +     hibufspace =3D lmax(3 * maxbufspace / 4, maxbufspace - maxbcachebuf=
 * 10);
>       lobufspace =3D (hibufspace / 20) * 19; /* 95% */
>       bufspacethresh =3D lobufspace + (hibufspace - lobufspace) / 2;
>
> @@ -1062,9 +1092,9 @@ bufinit(void)
>        * The lower 1 MiB limit is the historical upper limit for
>        * hirunningspace.
>        */
> -     hirunningspace =3D lmax(lmin(roundup(hibufspace / 64, MAXBCACHEBUF)=
,
> +     hirunningspace =3D lmax(lmin(roundup(hibufspace / 64, maxbcachebuf)=
,
>           16 * 1024 * 1024), 1024 * 1024);
> -     lorunningspace =3D roundup((hirunningspace * 2) / 3, MAXBCACHEBUF);
> +     lorunningspace =3D roundup((hirunningspace * 2) / 3, maxbcachebuf);
>
>       /*
>        * Limit the amount of malloc memory since it is wired permanently =
into
> @@ -3484,9 +3514,9 @@ getblk(struct vnode *vp, daddr_t blkno, int size, i=
nt
>       KASSERT((flags & (GB_UNMAPPED | GB_KVAALLOC)) !=3D GB_KVAALLOC,
>           ("GB_KVAALLOC only makes sense with GB_UNMAPPED"));
>       ASSERT_VOP_LOCKED(vp, "getblk");
> -     if (size > MAXBCACHEBUF)
> -             panic("getblk: size(%d) > MAXBCACHEBUF(%d)\n", size,
> -                 MAXBCACHEBUF);
> +     if (size > maxbcachebuf)
> +             panic("getblk: size(%d) > maxbcachebuf(%d)\n", size,
> +                 maxbcachebuf);
>       if (!unmapped_buf_allowed)
>               flags &=3D ~(GB_UNMAPPED | GB_KVAALLOC);
>
>
> Modified: head/sys/sys/param.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
> --- head/sys/sys/param.h      Sat Jun 17 20:33:11 2017        (r320061)
> +++ head/sys/sys/param.h      Sat Jun 17 22:24:19 2017        (r320062)
> @@ -244,9 +244,7 @@
>   *           Filesystems can of course request smaller chunks.  Actual
>   *           backing memory uses a chunk size of a page (PAGE_SIZE).
>   *           The default value here can be overridden on a per-architect=
ure
> - *           basis by defining it in <machine/param.h>.  This should
> - *           probably be done to increase its value, when MAXBCACHEBUF i=
s
> - *           defined as a larger value in <machine/param.h>.
> + *           basis by defining it in <machine/param.h>.
>   *
>   *           If you make BKVASIZE too small you risk seriously fragmenti=
ng
>   *           the buffer KVM map which may slow things down a bit.  If yo=
u
> @@ -265,6 +263,14 @@
>  #define BKVASIZE     16384   /* must be power of 2 */
>  #endif
>  #define BKVAMASK     (BKVASIZE-1)
> +
> +/*
> + * This variable is tuned via vfs.maxbcachebuf and is set to the value o=
f
> + * MAXBCACHEBUF by default.
> + */
> +#ifdef _KERNEL
> +extern int   maxbcachebuf;
> +#endif
>
>  /*
>   * MAXPATHLEN defines the longest permissible path length after expandin=
g
>



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