[PATCH] PATCH 13/16: NFSD: TCP: Reserve space on sndbuf so we never block when writing
authorNeil Brown <neilb@cse.unsw.edu.au>
Tue, 26 Feb 2002 06:23:49 +0000 (22:23 -0800)
committerLinus Torvalds <torvalds@penguin.transmeta.com>
Tue, 26 Feb 2002 06:23:49 +0000 (22:23 -0800)
commita87d73921a20f3e5df824eb27edff866e8a5169c
tree013167dcdb3fe82c1651bb18d673abf2e6dd9359
parentcbf593fcd65839fb89ff55a6696896b7841d77cb
[PATCH] PATCH 13/16: NFSD: TCP: Reserve space on sndbuf so we never block when writing

Make sure there is alway adequate sndbuf space for replies.

We keep track of how much space might be needed for replies
and never dequeue a request unless there is adequate space
for a maximal reply.  We assume each request will generate a maximal
sized reply until the request is partly decoded.
Each RPC program/procedure can specify the maximum size
of a reply to the precedure (though they don't yet).

The wspace callback is used to enqueue sockets that may be waiting
for sndbuf space to become available.

As there should always be enough buffer space to the full
reply, the only reason that sock_sendmsg could block is due
to a kmalloc delay.  As this is likely to be fairly quick (and if
it isn't the server is clagged anyway) we remove the MSG_DONTWAIT
flag, but set a 30 second timeout on waiting.  If the wait
ever times out, we close the connection.  If it doesn't we can
be sure that we did a complete write.

When a request completes, we make sure that the space
used for the reply does not exceed the space reserved.  This
is an internal consistancy check.

This patchs sets the sndbuf and rcvbuf sizes for all sockets
used for rpc service.  This size if dependant on the servers bufsize (S) and
partially on the number of threads (N).

For UDP
    sndbuf == 5*S
    rcvbuf == (N+2)*S
for TCP
    sndbuf == N*S
    rcvbuf == 3*S

see code for rationale (in comments).
include/linux/sunrpc/svc.h
include/linux/sunrpc/svcsock.h
net/sunrpc/svc.c
net/sunrpc/svcsock.c