> Date: Tue, 29 Mar 2011 22:42:47 +0200 > From: Claudio Jeker <cje...@diehard.n-r-g.com> > > Here is a possible fix. The problem was that because of the way NFS uses > the socket API it did not turn of the sendbuffer scaling which reset the > size of the socket back to 17376 bytes which is a no go when a buffer of > more then 17k is generated by NFS. It is better to initialize the sb_wat > in soreserve() which is called by NFS and all attach functions.
This no longer does the sbcheckreserve() dance though. Is that alright? > Index: netinet/tcp_usrreq.c > =================================================================== > RCS file: /cvs/src/sys/netinet/tcp_usrreq.c,v > retrieving revision 1.105 > diff -u -p -r1.105 tcp_usrreq.c > --- netinet/tcp_usrreq.c 10 Oct 2010 22:02:50 -0000 1.105 > +++ netinet/tcp_usrreq.c 29 Mar 2011 20:26:55 -0000 > @@ -653,15 +653,7 @@ tcp_attach(so) > int error; > > if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) { > - /* if low on memory only allow smaller then default buffers */ > - if (so->so_snd.sb_wat == 0 || > - sbcheckreserve(so->so_snd.sb_wat, tcp_sendspace)) > - so->so_snd.sb_wat = tcp_sendspace; > - if (so->so_rcv.sb_wat == 0 || > - sbcheckreserve(so->so_rcv.sb_wat, tcp_recvspace)) > - so->so_rcv.sb_wat = tcp_recvspace; > - > - error = soreserve(so, so->so_snd.sb_wat, so->so_rcv.sb_wat); > + error = soreserve(so, tcp_sendspace, tcp_recvspace); > if (error) > return (error); > } > Index: kern/uipc_socket2.c > =================================================================== > RCS file: /cvs/src/sys/kern/uipc_socket2.c,v > retrieving revision 1.51 > diff -u -p -r1.51 uipc_socket2.c > --- kern/uipc_socket2.c 24 Sep 2010 02:59:45 -0000 1.51 > +++ kern/uipc_socket2.c 29 Mar 2011 20:18:46 -0000 > @@ -353,6 +353,8 @@ soreserve(struct socket *so, u_long sndc > goto bad; > if (sbreserve(&so->so_rcv, rcvcc)) > goto bad2; > + so->so_snd.sb_wat = sndcc; > + so->so_rcv.sb_wat = rcvcc; > if (so->so_rcv.sb_lowat == 0) > so->so_rcv.sb_lowat = 1; > if (so->so_snd.sb_lowat == 0)