Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 20 May 2009 21:06:05 +0100 (BST)
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Andre Oppermann <andre@freebsd.org>
Cc:        rmacklem@uoguelph.ca, freebsd-current@freebsd.org
Subject:   Re: Socket related code duplication in NFS
Message-ID:  <alpine.BSF.2.00.0905202102100.25537@fledge.watson.org>
In-Reply-To: <4A1460A3.2010202@freebsd.org>
References:  <4A1460A3.2010202@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 20 May 2009, Andre Oppermann wrote:

> While working on an optimized soreceive_stream() function [1] and checking 
> the code how it is used I've come across quite a bit of code duplication in 
> the various NFS directories.
>
> Socket (read) operations are handled multiple times in a very similar manner 
> in these places:

My recommendation would be to do this analysis against the new NFS client and 
server found in sys/{kgssapi,nlm,fs/{nfs,nfsclient,nfsserver}}, which is the 
NFSv234 implementation.  Note in particular that in the new world order 
there's a centralize RPC implementation.

The code you're looking at is a blend of the old NFSv23 client/server 
(nfsclient/nfsserver) and the old NFSv4 client (rpc/nfs4client), all if which 
are on a gradual de-orbit burn.

Robert N M Watson
Computer Laboratory
University of Cambridge

>
> sys/rpc
> sys/nfsclient
> sys/nfsserver
>
> Also how the soreceive call is used is interesting.  It certainly can be made
> more efficient overall.
>
> My questions/observations/suggestions are as follows:
>
> a) Can the socket handling code be unified in one place for all NFS?
>
> b) The socket upcall mechanism is done per packet and can get expensive
>    for fast networks.  It also has some additional unlock/lock overhead
>    plus that is delays protocol processing (even more so with netisr
>    direct dispatch where the code is run from an ithread).
>
> c) Can NFS be made to use a select() mechanism where it gets notified
>    when new data arrives?  Just like in userspace.
>
> d) If not, it may be beneficial to have a taskqueue handle the upcall and
>    have the soappend call return immediately to complete processing of
>    the the protocol.
>
> e) The socket buffer is most efficient when it can aggregate a number of
>    packets together before they are processed.  Can the NFS code set a low
>    water mark on the socket to get called only after a few packets have
>    arrived instead of each one? (In the select and taskqueue model.)
>
> f) I've been thinking of an modular socket filter approach (much like the
>    accept filter) scanning for upper layer specific markers or boundaries
>    and then signalling data availability.
>
> -- 
> Andre
>
> [1] Perforce: 
> //depot/user/andre/soreceive_stream/kern/uipc_socket.c::soreceive_stream()
>



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