diff options
author | Nandita Dukkipati <nanditad@google.com> | 2013-05-21 15:12:07 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-05-23 00:10:09 -0700 |
commit | 35f079ebbc860dcd1cca70890c9c8d59c1145525 (patch) | |
tree | 932fb1909f503a61997e6f691755f2f97fa6ee0b /block/blk-softirq.c | |
parent | d02cea0f4341b25cae044d2ec393049d60bff036 (diff) |
tcp: bug fix in proportional rate reduction.
This patch is a fix for a bug triggering newly_acked_sacked < 0
in tcp_ack(.).
The bug is triggered by sacked_out decreasing relative to prior_sacked,
but packets_out remaining the same as pior_packets. This is because the
snapshot of prior_packets is taken after tcp_sacktag_write_queue() while
prior_sacked is captured before tcp_sacktag_write_queue(). The problem
is: tcp_sacktag_write_queue (tcp_match_skb_to_sack() -> tcp_fragment)
adjusts the pcount for packets_out and sacked_out (MSS change or other
reason). As a result, this delta in pcount is reflected in
(prior_sacked - sacked_out) but not in (prior_packets - packets_out).
This patch does the following:
1) initializes prior_packets at the start of tcp_ack() so as to
capture the delta in packets_out created by tcp_fragment.
2) introduces a new "previous_packets_out" variable that snapshots
packets_out right before tcp_clean_rtx_queue, so pkts_acked can be
correctly computed as before.
3) Computes pkts_acked using previous_packets_out, and computes
newly_acked_sacked using prior_packets.
Signed-off-by: Nandita Dukkipati <nanditad@google.com>
Acked-by: Yuchung Cheng <ycheng@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'block/blk-softirq.c')
0 files changed, 0 insertions, 0 deletions