[pnfs] [PATCH 12/17] Reroute a callback to be processed by the callback service.
Iyer, Rahul
Rahul.Iyer at netapp.com
Mon May 21 13:54:58 EDT 2007
> -----Original Message-----
> From: Benny Halevy [mailto:bhalevy at panasas.com]
> Sent: Monday, May 21, 2007 6:27 AM
> To: Iyer, Rahul
> Cc: pnfs at linux-nfs.org
> Subject: Re: [PATCH 12/17] Reroute a callback to be processed
> by the callback service.
>
> Iyer, Rahul wrote:
>
> > From 205cbe5b3b6371126973ba1a682b0b922c1d9195 Mon Sep 17
> 00:00:00 2001
> > Message-Id:
> <205cbe5b3b6371126973ba1a682b0b922c1d9195.1179276403.git.iyer@
> netapp.com>
> > In-Reply-To:
> <19b0fc3bc27cc1b1527dd685f71b79cd249a3779.1179276402.git.iyer@
> netapp.com>
> > References:
> <19b0fc3bc27cc1b1527dd685f71b79cd249a3779.1179276402.git.iyer@
> netapp.com>
> > From: Rahul Iyer <iyer at netapp.com>
> > Date: Tue, 15 May 2007 16:57:28 -0700
> > Subject: [PATCH 12/17] Reroute a callback to be processed
> by the callback service.
> >
> > This routine is the heart of the mux/demux of the
> callbacks. When a RPC request
> > arrives on the channel and is determined to be a callback,
> the following thinfs
> > happen:
> >
> > 1. A request (rpc_rqst struct) is allocated for the rpc
> request and the request
> > is read in.
> >
> > 2. The request is queued onto the callback request list of
> the corresponding
> > svc_serv for processing by the callback service
> >
> > Signed-off-by: Rahul Iyer <iyer at netapp.com>
> > ---
> > net/sunrpc/xprtsock.c | 30 ++++++++++++++++++++++++------
> > 1 files changed, 24 insertions(+), 6 deletions(-)
> >
> > diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
> > index 50e000e..0c0d7e0 100644
> > --- a/net/sunrpc/xprtsock.c
> > +++ b/net/sunrpc/xprtsock.c
> > @@ -29,6 +29,7 @@
> > #include <linux/tcp.h>
> > #include <linux/sunrpc/clnt.h>
> > #include <linux/sunrpc/sched.h>
> > +#include <linux/sunrpc/bc_xprt.h>
> > #include <linux/file.h>
> >
> > #include <net/sock.h>
> > @@ -689,11 +690,20 @@ static inline void
> xs_tcp_read_request(struct rpc_xprt *xprt, skb_reader_t *desc
> > spin_lock(&xprt->transport_lock);
> > calldir = ntohl(xprt->tcp_calldir);
> > if (calldir == RPC_CALL) {
> > - dprintk("Callback received on backchannel!\n");
> > - spin_unlock(&xprt->transport_lock);
> >
> > - /* Ignore callbacks for now */
> > - return;
> > + req = xprt_alloc_bc_request(xprt);
> > +
> > + if (!req) {
> > + printk(KERN_NOTICE "Couldn't get
> rpc_rqst for the allback! Dropping callback...\n");
> > + xprt->tcp_flags &= ~XPRT_COPY_DATA;
> > + spin_unlock(&xprt->transport_lock);
> > +
> > + /*
> > + * Ignore the callback because we
> couldn't allocate a
> > + * request
> > + */
> > + return;
> > + }
>
> The spec says you should close the connection in this case
> assuming returning an appropriate error here is too
> complicated for now.
> In any case the client MUST NOT silently drop a request
> (and a printk counts as silence from the server POV ;-)
>
> Benny
>
Ok. A possible solution is to set the size of the mempool to
ca_maxrequests. Any allocation that fails means that the ca_maxrequests
has been exceeded (though exceeding the limit doesn't mean allocation
failure, because it is a mempool). In this scenario, we can alert the
xprt that this happened and return an error. I can look at this.
Regards
Rahul
More information about the pNFS
mailing list