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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox