From: Tom Tucker <tom@opengridcomputing.com>
To: Chuck Lever <chuck.lever@oracle.com>,
"J. Bruce Fields" <bfields@fieldses.org>,
NeilBrown <neilb@suse.de>
Cc: <linux-nfs@vger.kernel.org>, Greg Banks <gnb@sgi.com>
Subject: Re: [RFC,PATCH 34/38] svc: Add /proc/sys/sunrpc/transport files
Date: Mon, 03 Dec 2007 18:45:07 -0600 [thread overview]
Message-ID: <C379FF33.20E40%tom@opengridcomputing.com> (raw)
In-Reply-To: <3F7E5DF2-0F8E-4C84-9F3B-0AD0985321B2@oracle.com>
On 12/3/07 2:36 PM, "Chuck Lever" <chuck.lever@oracle.com> wrote:
> On Dec 3, 2007, at 2:10 PM, Tom Tucker wrote:
>> On Mon, 2007-12-03 at 13:30 -0500, Chuck Lever wrote:
>>> On Dec 3, 2007, at 11:58 AM, J. Bruce Fields wrote:
>>>> On Mon, Dec 03, 2007 at 11:44:15AM -0500, Chuck Lever wrote:
>>
>> Could you be more specific on what these problems are?
[...snip...]
>
> The problems we discussed on Friday about svc_tcp_has_wspace(),
> introduced in 9/38.
>
> The mess is hidden by implicit type casts in the write space check,
> replaced by 9/38, in svc_sock_enqueue(). The return type of
> svc_sock_wspace() is unsigned long, which means the other side of the
> comparison in svc_sock_enqueue() (the sum that becomes "required" in
> your patch) is implicitly promoted to unsigned long before the
> comparison is done.
>
> Your patch misses the implicit cast at least by making "required" an
> int in the new callback functions. "required" should be an unsigned
> long in both the UDP and TCP callback to preserve the semantics of
> the existing logic.
>
> It's also the case that sk_stream_wspace() can return a negative
> value if sk_wmem_queued somehow becomes larger than sk_sndbuf.
> However, in the existing svc_sock_enqueue() logic, a negative result
> from sk_stream_wspace() is converted to an unsigned long, making it a
> large positive number. The server then thinks it may continue
> writing to a socket whose buffer is already full.
>
> I'm also worried about whether sk_reserved, which is an int and is
> incremented and decremented without a check to see if it has gone
> negative, can go negative during normal operation -- and if it does,
> what does that do to the value of "required" and the result of the
> write space check, in either the UDP or TCP case?
>
> In addition, the server's TCP write space check is missing a
> comparison that every other TCP write space callback in the kernel
> has (comparing sk_stream_wspace and sk_stream_min_wspace). If we
> don't include it here, then we need some testing to validate that it
> isn't needed, and a comment to explain why this write space callback
> is different from the others.
>
> I was hoping for some comment from Neil or Bruce.
Ok, cool. I just didn't get the map from "refactoring" to this. These
changes are straightforward. I have already modified the patch to resolve
the type promotion issue and added a check for negative. I planned on
reposting the whole series with the updates after we get the build issues
hammered out.
Thanks,
Tom
>
> From Friday's post:
>> If sk_reserved goes negative, it will be converted to unsigned, and
>> become a very large positive number. The result of the sum will be
>> recast back to an int when it's assigned to "required," and we
>> probably get a reasonable result. I doubt an explicit cast will
>> change things at all.
>>
>> Instead, perhaps we should add an explicit check to ensure
>> sk_reserved is a reasonable positive value before doing any other
>> checks. (Likewise in the UDP case as well).
>>
>> I wonder if this is really the correct write space check to use for
>> TCP, though. I remember fixing a similar issue in the RPC client a
>> long time ago -- both UDP and TCP used the same wspace check. It
>> resulted in the sk_write_space callback hammering on the RPC
>> client, and forward progress on TCP socket writes would slow to a
>> crawl.
>>
>> You probably want something like this instead:
>>
>> set_bit(SOCK_NOSPACE, &svsk->sk_sock->flags);
>>
>> required = atomic_read(&svsk->sk_reserved) + serv->sv_max_mesg;
>> wspace = sk_stream_wspace(svsk->sk_sk);
>>
>> if (wspace < sk_stream_min_wspace(svsk->sk_sk))
>> return 0;
>> if (required * 2 > wspace)
>> return 0;
>>
>> clear_bit(SOCK_NOSPACE, &svsk->sk_sock->flags);
>> return 1;
>>
>> The first test mimics sk_stream_write_space() and xs_tcp_write_space
>> (). I'm still unsure what to do about the possibility of one of
>> these signed integers going negative on us.
>
>
> --
> Chuck Lever
> chuck[dot]lever[at]oracle[dot]com
next prev parent reply other threads:[~2007-12-04 1:16 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-29 22:39 [RFC,PATCH 00/38] SVC Transport Switch Tom Tucker
[not found] ` <20071129223917.14563.77633.stgit-gUwIgmpLGaKNDNWfRnPdfg@public.gmane.org>
2007-11-29 22:39 ` [RFC,PATCH 01/38] svc: Add an svc transport class Tom Tucker
2007-11-29 22:39 ` [RFC,PATCH 02/38] svc: Make svc_sock the tcp/udp transport Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 03/38] svc: Change the svc_sock in the rqstp structure to a transport Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 04/38] svc: Add a max payload value to the transport Tom Tucker
[not found] ` <20071129224002.14563.96227.stgit-gUwIgmpLGaKNDNWfRnPdfg@public.gmane.org>
2007-11-30 20:22 ` Chuck Lever
2007-11-30 20:51 ` Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 05/38] svc: Move sk_sendto and sk_recvfrom to svc_xprt_class Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 06/38] svc: Add transport specific xpo_release function Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 07/38] svc: Add per-transport delete functions Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 08/38] svc: Add xpo_prep_reply_hdr Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 09/38] svc: Add a transport function that checks for write space Tom Tucker
[not found] ` <20071129224012.14563.23130.stgit-gUwIgmpLGaKNDNWfRnPdfg@public.gmane.org>
2007-11-30 20:46 ` Chuck Lever
2007-11-30 21:39 ` Tom Tucker
[not found] ` <1196458764.5432.52.camel-SMNkleLxa3ZimH42XvhXlA@public.gmane.org>
2007-11-30 22:43 ` Chuck Lever
2007-12-10 20:43 ` Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 10/38] svc: Move close processing to a single place Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 11/38] svc: Add xpo_accept transport function Tom Tucker
[not found] ` <20071129224016.14563.67547.stgit-gUwIgmpLGaKNDNWfRnPdfg@public.gmane.org>
2007-11-30 21:01 ` Chuck Lever
2007-11-30 21:47 ` Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 12/38] svc: Add a generic transport svc_create_xprt function Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 13/38] svc: Change services to use new svc_create_xprt service Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 14/38] svc: Change sk_inuse to a kref Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 15/38] svc: Move sk_flags to the svc_xprt structure Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 16/38] svc: Move sk_server and sk_pool to svc_xprt Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 17/38] svc: Make close transport independent Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 18/38] svc: Move sk_reserved to svc_xprt Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 19/38] svc: Make the enqueue service transport neutral and export it Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 20/38] svc: Make svc_send transport neutral Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 21/38] svc: Change svc_sock_received to svc_xprt_received and export it Tom Tucker
[not found] ` <20071129224037.14563.69171.stgit-gUwIgmpLGaKNDNWfRnPdfg@public.gmane.org>
2007-11-30 21:33 ` Chuck Lever
2007-11-30 23:17 ` Tom Tucker
[not found] ` <1196464634.5432.68.camel-SMNkleLxa3ZimH42XvhXlA@public.gmane.org>
2007-11-30 23:23 ` Chuck Lever
2007-11-29 22:40 ` [RFC,PATCH 22/38] svc: Remove sk_lastrecv Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 24/38] svc: Make deferral processing xprt independent Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 25/38] svc: Move the sockaddr information to svc_xprt Tom Tucker
[not found] ` <20071129224046.14563.59353.stgit-gUwIgmpLGaKNDNWfRnPdfg@public.gmane.org>
2007-11-30 23:20 ` Chuck Lever
2007-11-29 22:40 ` [RFC,PATCH 26/38] svc: Make svc_sock_release svc_xprt_release Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 27/38] svc: Make svc_recv transport neutral Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 28/38] svc: Make svc_age_temp_sockets svc_age_temp_transports Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 29/38] svc: Move common create logic to common code Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 30/38] svc: Removing remaining references to rq_sock in rqstp Tom Tucker
2007-11-29 22:40 ` [RFC,PATCH 31/38] svc: Make svc_check_conn_limits xprt independent Tom Tucker
2007-11-29 22:41 ` [RFC,PATCH 32/38] svc: Move the xprt independent code to the svc_xprt.c file Tom Tucker
2007-11-29 22:41 ` [RFC,PATCH 33/38] svc: Add transport hdr size for defer/revisit Tom Tucker
[not found] ` <20071129224103.14563.72780.stgit-gUwIgmpLGaKNDNWfRnPdfg@public.gmane.org>
2007-11-30 23:51 ` Chuck Lever
2007-11-29 22:41 ` [RFC,PATCH 34/38] svc: Add /proc/sys/sunrpc/transport files Tom Tucker
[not found] ` <20071129224105.14563.48684.stgit-gUwIgmpLGaKNDNWfRnPdfg@public.gmane.org>
2007-12-03 16:44 ` Chuck Lever
2007-12-03 16:58 ` J. Bruce Fields
2007-12-03 18:30 ` Chuck Lever
2007-12-03 19:10 ` Tom Tucker
[not found] ` <1196709058.5811.21.camel-SMNkleLxa3ZimH42XvhXlA@public.gmane.org>
2007-12-03 20:36 ` Chuck Lever
2007-12-04 0:45 ` Tom Tucker [this message]
2007-12-05 8:44 ` Greg Banks
2007-11-29 22:41 ` [RFC,PATCH 35/38] knfsd: Support adding transports by writing portlist file Tom Tucker
2007-11-29 22:41 ` [RFC,PATCH 36/38] svc: Add svc API that queries for a transport instance Tom Tucker
[not found] ` <20071129224109.14563.34563.stgit-gUwIgmpLGaKNDNWfRnPdfg@public.gmane.org>
2007-12-01 0:00 ` Chuck Lever
2007-11-29 22:41 ` [RFC,PATCH 37/38] knfsd: Modify write_ports to use svc_find_xprt service Tom Tucker
2007-11-29 22:41 ` [RFC,PATCH 38/38] svc: Add svc_xprt_names service to replace svc_sock_names Tom Tucker
2007-11-29 23:18 ` [RFC,PATCH 00/38] SVC Transport Switch Tom Tucker
-- strict thread matches above, loose matches on Subject: below --
2007-11-29 22:51 Tom Tucker
[not found] ` <20071129225142.15107.46200.stgit-gUwIgmpLGaKNDNWfRnPdfg@public.gmane.org>
2007-11-29 22:54 ` [RFC,PATCH 34/38] svc: Add /proc/sys/sunrpc/transport files Tom Tucker
2007-11-29 22:55 [RFC,PATCH 00/38] RPC Transport Switch Tom Tucker
[not found] ` <20071129225510.15275.82660.stgit-gUwIgmpLGaKNDNWfRnPdfg@public.gmane.org>
2007-11-29 22:56 ` [RFC,PATCH 34/38] svc: Add /proc/sys/sunrpc/transport files Tom Tucker
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=C379FF33.20E40%tom@opengridcomputing.com \
--to=tom@opengridcomputing.com \
--cc=bfields@fieldses.org \
--cc=chuck.lever@oracle.com \
--cc=gnb@sgi.com \
--cc=linux-nfs@vger.kernel.org \
--cc=neilb@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.