aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlpo Järvinen <ilpo.jarvinen@helsinki.fi>2007-08-09 07:44:16 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-10-10 19:47:57 -0400
commit005903bc3a0e8473fef809e8775db52dcd3cde63 (patch)
tree4fd945740a3615dbd5493fa0ded13f0352e21b2c
parent83ae40885f33e406c87c86b0bd4b6fd31a741f12 (diff)
[TCP]: Left out sync->verify (the new meaning of it) & definify
Left_out was dropped a while ago, thus leaving verifying consistency of the "left out" as only task for the function in question. Thus make it's name more appropriate. In addition, it is intentionally converted to #define instead of static inline because the location of the invariant failure is the most important thing to have if this ever triggers. I think it would have been helpful e.g. in this case where the location of the failure point had to be based on some quesswork: http://lkml.org/lkml/2007/5/2/464 ...Luckily the guesswork seems to have proved to be correct. Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/net/tcp.h7
-rw-r--r--net/ipv4/tcp_input.c20
-rw-r--r--net/ipv4/tcp_output.c4
3 files changed, 15 insertions, 16 deletions
diff --git a/include/net/tcp.h b/include/net/tcp.h
index 39d0df6afe47..7042c32085f5 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -758,10 +758,9 @@ static inline __u32 tcp_current_ssthresh(const struct sock *sk)
758 (tp->snd_cwnd >> 2))); 758 (tp->snd_cwnd >> 2)));
759} 759}
760 760
761static inline void tcp_sync_left_out(struct tcp_sock *tp) 761/* Use define here intentionally to get BUG_ON location shown at the caller */
762{ 762#define tcp_verify_left_out(tp) \
763 BUG_ON(tp->rx_opt.sack_ok && (tcp_left_out(tp) > tp->packets_out)); 763 BUG_ON(tp->rx_opt.sack_ok && (tcp_left_out(tp) > tp->packets_out))
764}
765 764
766extern void tcp_enter_cwr(struct sock *sk, const int set_ssthresh); 765extern void tcp_enter_cwr(struct sock *sk, const int set_ssthresh);
767extern __u32 tcp_init_cwnd(struct tcp_sock *tp, struct dst_entry *dst); 766extern __u32 tcp_init_cwnd(struct tcp_sock *tp, struct dst_entry *dst);
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 6bdd053e252f..b11bd1624227 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -1383,7 +1383,7 @@ static void tcp_add_reno_sack(struct sock *sk)
1383 struct tcp_sock *tp = tcp_sk(sk); 1383 struct tcp_sock *tp = tcp_sk(sk);
1384 tp->sacked_out++; 1384 tp->sacked_out++;
1385 tcp_check_reno_reordering(sk, 0); 1385 tcp_check_reno_reordering(sk, 0);
1386 tcp_sync_left_out(tp); 1386 tcp_verify_left_out(tp);
1387} 1387}
1388 1388
1389/* Account for ACK, ACKing some data in Reno Recovery phase. */ 1389/* Account for ACK, ACKing some data in Reno Recovery phase. */
@@ -1400,7 +1400,7 @@ static void tcp_remove_reno_sacks(struct sock *sk, int acked)
1400 tp->sacked_out -= acked-1; 1400 tp->sacked_out -= acked-1;
1401 } 1401 }
1402 tcp_check_reno_reordering(sk, acked); 1402 tcp_check_reno_reordering(sk, acked);
1403 tcp_sync_left_out(tp); 1403 tcp_verify_left_out(tp);
1404} 1404}
1405 1405
1406static inline void tcp_reset_reno_sack(struct tcp_sock *tp) 1406static inline void tcp_reset_reno_sack(struct tcp_sock *tp)
@@ -1496,7 +1496,7 @@ void tcp_enter_frto(struct sock *sk)
1496 TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_RETRANS; 1496 TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_RETRANS;
1497 tp->retrans_out -= tcp_skb_pcount(skb); 1497 tp->retrans_out -= tcp_skb_pcount(skb);
1498 } 1498 }
1499 tcp_sync_left_out(tp); 1499 tcp_verify_left_out(tp);
1500 1500
1501 /* Earlier loss recovery underway (see RFC4138; Appendix B). 1501 /* Earlier loss recovery underway (see RFC4138; Appendix B).
1502 * The last condition is necessary at least in tp->frto_counter case. 1502 * The last condition is necessary at least in tp->frto_counter case.
@@ -1551,7 +1551,7 @@ static void tcp_enter_frto_loss(struct sock *sk, int allowed_segments, int flag)
1551 tp->lost_out += tcp_skb_pcount(skb); 1551 tp->lost_out += tcp_skb_pcount(skb);
1552 } 1552 }
1553 } 1553 }
1554 tcp_sync_left_out(tp); 1554 tcp_verify_left_out(tp);
1555 1555
1556 tp->snd_cwnd = tcp_packets_in_flight(tp) + allowed_segments; 1556 tp->snd_cwnd = tcp_packets_in_flight(tp) + allowed_segments;
1557 tp->snd_cwnd_cnt = 0; 1557 tp->snd_cwnd_cnt = 0;
@@ -1626,7 +1626,7 @@ void tcp_enter_loss(struct sock *sk, int how)
1626 tp->fackets_out = cnt; 1626 tp->fackets_out = cnt;
1627 } 1627 }
1628 } 1628 }
1629 tcp_sync_left_out(tp); 1629 tcp_verify_left_out(tp);
1630 1630
1631 tp->reordering = min_t(unsigned int, tp->reordering, 1631 tp->reordering = min_t(unsigned int, tp->reordering,
1632 sysctl_tcp_reordering); 1632 sysctl_tcp_reordering);
@@ -1861,7 +1861,7 @@ static void tcp_mark_head_lost(struct sock *sk,
1861 tcp_verify_retransmit_hint(tp, skb); 1861 tcp_verify_retransmit_hint(tp, skb);
1862 } 1862 }
1863 } 1863 }
1864 tcp_sync_left_out(tp); 1864 tcp_verify_left_out(tp);
1865} 1865}
1866 1866
1867/* Account newly detected lost packet(s) */ 1867/* Account newly detected lost packet(s) */
@@ -1905,7 +1905,7 @@ static void tcp_update_scoreboard(struct sock *sk)
1905 1905
1906 tp->scoreboard_skb_hint = skb; 1906 tp->scoreboard_skb_hint = skb;
1907 1907
1908 tcp_sync_left_out(tp); 1908 tcp_verify_left_out(tp);
1909 } 1909 }
1910} 1910}
1911 1911
@@ -2217,8 +2217,8 @@ tcp_fastretrans_alert(struct sock *sk, int prior_packets, int flag)
2217 NET_INC_STATS_BH(LINUX_MIB_TCPLOSS); 2217 NET_INC_STATS_BH(LINUX_MIB_TCPLOSS);
2218 } 2218 }
2219 2219
2220 /* D. Synchronize left_out to current state. */ 2220 /* D. Check consistency of the current state. */
2221 tcp_sync_left_out(tp); 2221 tcp_verify_left_out(tp);
2222 2222
2223 /* E. Check state exit conditions. State can be terminated 2223 /* E. Check state exit conditions. State can be terminated
2224 * when high_seq is ACKed. */ 2224 * when high_seq is ACKed. */
@@ -2765,7 +2765,7 @@ static int tcp_process_frto(struct sock *sk, int flag)
2765{ 2765{
2766 struct tcp_sock *tp = tcp_sk(sk); 2766 struct tcp_sock *tp = tcp_sk(sk);
2767 2767
2768 tcp_sync_left_out(tp); 2768 tcp_verify_left_out(tp);
2769 2769
2770 /* Duplicate the behavior from Loss state (fastretrans_alert) */ 2770 /* Duplicate the behavior from Loss state (fastretrans_alert) */
2771 if (flag&FLAG_DATA_ACKED) 2771 if (flag&FLAG_DATA_ACKED)
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 7434944caa8f..a92fad55cd32 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -739,7 +739,7 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss
739 /* Adjust Reno SACK estimate. */ 739 /* Adjust Reno SACK estimate. */
740 if (!tp->rx_opt.sack_ok) { 740 if (!tp->rx_opt.sack_ok) {
741 tcp_dec_pcount_approx_int(&tp->sacked_out, diff); 741 tcp_dec_pcount_approx_int(&tp->sacked_out, diff);
742 tcp_sync_left_out(tp); 742 tcp_verify_left_out(tp);
743 } 743 }
744 744
745 tcp_dec_pcount_approx_int(&tp->fackets_out, diff); 745 tcp_dec_pcount_approx_int(&tp->fackets_out, diff);
@@ -1774,7 +1774,7 @@ void tcp_simple_retransmit(struct sock *sk)
1774 if (!lost) 1774 if (!lost)
1775 return; 1775 return;
1776 1776
1777 tcp_sync_left_out(tp); 1777 tcp_verify_left_out(tp);
1778 1778
1779 /* Don't muck with the congestion window here. 1779 /* Don't muck with the congestion window here.
1780 * Reason is that we do not increase amount of _data_ 1780 * Reason is that we do not increase amount of _data_