Selaa lähdekoodia

[TCP]: Fix GSO ignorance of pkts_acked arg (cong.cntrl modules)

The code used to ignore GSO completely, passing either way too
small or zero pkts_acked when GSO skb or part of it got ACKed.
In addition, there is no need to calculate the value in the loop
but simple arithmetics after the loop is sufficient. There is
no need to handle SYN case specially because congestion control
modules are not yet initialized when FLAG_SYN_ACKED is set.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
Ilpo Järvinen 18 vuotta sitten
vanhempi
commit
6418204f91
1 muutettua tiedostoa jossa 2 lisäystä ja 2 poistoa
  1. 2 2
      net/ipv4/tcp_input.c

+ 2 - 2
net/ipv4/tcp_input.c

@@ -2407,8 +2407,8 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p)
 	struct sk_buff *skb;
 	struct sk_buff *skb;
 	__u32 now = tcp_time_stamp;
 	__u32 now = tcp_time_stamp;
 	int acked = 0;
 	int acked = 0;
+	int prior_packets = tp->packets_out;
 	__s32 seq_rtt = -1;
 	__s32 seq_rtt = -1;
-	u32 pkts_acked = 0;
 	ktime_t last_ackt = ktime_set(0,0);
 	ktime_t last_ackt = ktime_set(0,0);
 
 
 	while ((skb = tcp_write_queue_head(sk)) &&
 	while ((skb = tcp_write_queue_head(sk)) &&
@@ -2437,7 +2437,6 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p)
 		 */
 		 */
 		if (!(scb->flags & TCPCB_FLAG_SYN)) {
 		if (!(scb->flags & TCPCB_FLAG_SYN)) {
 			acked |= FLAG_DATA_ACKED;
 			acked |= FLAG_DATA_ACKED;
-			++pkts_acked;
 		} else {
 		} else {
 			acked |= FLAG_SYN_ACKED;
 			acked |= FLAG_SYN_ACKED;
 			tp->retrans_stamp = 0;
 			tp->retrans_stamp = 0;
@@ -2481,6 +2480,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p)
 	}
 	}
 
 
 	if (acked&FLAG_ACKED) {
 	if (acked&FLAG_ACKED) {
+		u32 pkts_acked = prior_packets - tp->packets_out;
 		const struct tcp_congestion_ops *ca_ops
 		const struct tcp_congestion_ops *ca_ops
 			= inet_csk(sk)->icsk_ca_ops;
 			= inet_csk(sk)->icsk_ca_ops;