On Tue, Mar 29, 2011 at 05:24:33PM +0200, Michael wrote: > Hi, > > I already filed a PR for that on 17.12.20110 -> kernel/6525. There also > were some mails on misc@ about it. But noone really seemed to care. >
Oh, I missed that PR. 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. Please test and report back. -- :wq Claudio 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)