From: Chris Wright <chrisw@sous-sol.org>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: Justin Forbes <jmforbes@linuxtx.org>,
Zwane Mwaikambo <zwane@arm.linux.org.uk>,
"Theodore Ts'o" <tytso@mit.edu>,
Randy Dunlap <rdunlap@xenotime.net>,
Dave Jones <davej@redhat.com>,
Chuck Wolber <chuckw@quantumlinux.com>,
Chris Wedgwood <reviews@ml.cw.f00f.org>,
torvalds@osdl.org, akpm@osdl.org, alan@lxorguk.ukuu.org.uk,
David Miller <davem@davemloft.net>,
Neil Horman <nhorman@tuxdriver.com>,
Sridhar Samudrala <sri@us.ibm.com>
Subject: [PATCH 09/25] SCTP: Fix persistent slowdown in sctp when a gap ack consumes rx buffer.
Date: Tue, 27 Jun 2006 00:00:09 -0700 [thread overview]
Message-ID: <20060627201151.581322000@sous-sol.org> (raw)
In-Reply-To: 20060627200745.771284000@sous-sol.org
[-- Attachment #1: sctp-fix-persistent-slowdown-in-sctp-when-a-gap-ack-consumes-rx-buffer.patch --]
[-- Type: text/plain, Size: 2522 bytes --]
-stable review patch. If anyone has any objections, please let us know.
------------------
From: Neil Horman <nhorman@tuxdriver.com>
In the event that our entire receive buffer is full with a series of
chunks that represent a single gap-ack, and then we accept a chunk
(or chunks) that fill in the gap between the ctsn and the first gap,
we renege chunks from the end of the buffer, which effectively does
nothing but move our gap to the end of our received tsn stream. This
does little but move our missing tsns down stream a little, and, if the
sender is sending sufficiently large retransmit frames, the result is a
perpetual slowdown which can never be recovered from, since the only
chunk that can be accepted to allow progress in the tsn stream necessitates
that a new gap be created to make room for it. This leads to a constant
need for retransmits, and subsequent receiver stalls. The fix I've come up
with is to deliver the frame without reneging if we have a full receive
buffer and the receiving sockets sk_receive_queue is empty(indicating that
the receive buffer is being blocked by a missing tsn).
Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: Sridhar Samudrala <sri@us.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Chris Wright <chrisw@sous-sol.org>
---
net/sctp/sm_statefuns.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
--- linux-2.6.17.1.orig/net/sctp/sm_statefuns.c
+++ linux-2.6.17.1/net/sctp/sm_statefuns.c
@@ -5293,10 +5293,18 @@ static int sctp_eat_data(const struct sc
* seems a bit troublesome in that frag_point varies based on
* PMTU. In cases, such as loopback, this might be a rather
* large spill over.
+ * NOTE: If we have a full receive buffer here, we only renege if
+ * our receiver can still make progress without the tsn being
+ * received. We do this because in the event that the associations
+ * receive queue is empty we are filling a leading gap, and since
+ * reneging moves the gap to the end of the tsn stream, we are likely
+ * to stall again very shortly. Avoiding the renege when we fill a
+ * leading gap is a good heuristic for avoiding such steady state
+ * stalls.
*/
if (!asoc->rwnd || asoc->rwnd_over ||
(datalen > asoc->rwnd + asoc->frag_point) ||
- rcvbuf_over) {
+ (rcvbuf_over && (!skb_queue_len(&sk->sk_receive_queue)))) {
/* If this is the next TSN, consider reneging to make
* room. Note: Playing nice with a confused sender. A
--
next prev parent reply other threads:[~2006-06-27 20:14 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-06-27 20:07 [PATCH 00/25] -stable review Chris Wright
2006-06-27 7:00 ` [PATCH 01/25] USB: Whiteheat: fix firmware spurious errors Chris Wright
2006-06-27 7:00 ` [PATCH 02/25] SERIAL: PARPORT_SERIAL should depend on SERIAL_8250_PCI Chris Wright
2006-06-27 7:00 ` [PATCH 03/25] IPV6: Sum real space for RTAs Chris Wright
2006-06-27 7:00 ` [PATCH 04/25] PFKEYV2: Fix inconsistent typing in struct sadb_x_kmprivate Chris Wright
2006-06-27 7:00 ` [PATCH 05/25] SCTP: Limit association max_retrans setting in setsockopt Chris Wright
2006-06-27 7:00 ` [PATCH 06/25] SCTP: Reject sctp packets with broadcast addresses Chris Wright
2006-06-27 7:00 ` [PATCH 07/25] SCTP: Reset rtt_in_progress for the chunk when processing its sack Chris Wright
2006-06-27 7:00 ` [PATCH 08/25] SCTP: Send only 1 window update SACK per message Chris Wright
2006-06-27 7:00 ` Chris Wright [this message]
2006-06-27 7:00 ` [PATCH 10/25] ETHTOOL: Fix UFO typo Chris Wright
2006-06-27 7:00 ` [PATCH 11/25] SPARC32: Fix iommu_flush_iotlb end address Chris Wright
2006-06-27 7:00 ` [PATCH 12/25] NTFS: Critical bug fix (affects MIPS and possibly others) Chris Wright
2006-06-27 7:00 ` [PATCH 13/25] x86: compile fix for asm-i386/alternatives.h Chris Wright
2006-06-27 7:00 ` [PATCH 14/25] bcm43xx: init fix for possible Machine Check Chris Wright
2006-06-27 7:00 ` [PATCH 15/25] UML: fix uptime Chris Wright
2006-06-27 7:00 ` [PATCH 16/25] IPV6: Fix source address selection Chris Wright
2006-06-27 7:00 ` [PATCH 17/25] IPV6 ADDRCONF: Fix default source address selection without CONFIG_IPV6_PRIVACY Chris Wright
2006-06-27 7:00 ` [PATCH 18/25] ohci1394: Fix broken suspend/resume in ohci1394 Chris Wright
2006-06-27 22:07 ` Stefan Richter
2006-06-28 16:42 ` [stable] " Chris Wright
2006-06-27 7:00 ` [PATCH 19/25] libata: minor patch for ATA_DFLAG_PIO Chris Wright
2006-06-27 7:00 ` [PATCH 20/25] ide-io: increase timeout value to allow for slave wakeup Chris Wright
2006-06-27 7:00 ` [PATCH 21/25] kbuild: Fix 100% initramfs bloat in 2.6.17 versus 2.6.16 Chris Wright
2006-06-29 21:34 ` [stable] " Chris Wright
2006-06-29 21:43 ` Nix
2006-06-29 21:46 ` Chris Wright
2006-06-27 7:00 ` [PATCH 22/25] Link error when futexes are disabled on 64bit architectures Chris Wright
2006-06-27 7:00 ` [PATCH 23/25] idr: fix race in idr code Chris Wright
2006-06-27 7:00 ` [PATCH 24/25] Input: return correct size when reading modalias attribute Chris Wright
2006-06-27 7:00 ` [PATCH 25/25] generic_file_buffered_write(): deadlock on vectored write Chris Wright
2006-06-29 18:24 ` [stable] " Chris Wright
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=20060627201151.581322000@sous-sol.org \
--to=chrisw@sous-sol.org \
--cc=akpm@osdl.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=chuckw@quantumlinux.com \
--cc=davej@redhat.com \
--cc=davem@davemloft.net \
--cc=jmforbes@linuxtx.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nhorman@tuxdriver.com \
--cc=rdunlap@xenotime.net \
--cc=reviews@ml.cw.f00f.org \
--cc=sri@us.ibm.com \
--cc=stable@kernel.org \
--cc=torvalds@osdl.org \
--cc=tytso@mit.edu \
--cc=zwane@arm.linux.org.uk \
/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