[TCP]: Dropped unnecessary skb/sacked accessing in reneging
SACK reneging can be precalculated to a FLAG in clean_rtx_queue which has the right skb looked up. This will help a bit in future because skb->sacked access will be changed eventually, changing it already won't hurt any. Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									90840defab
								
							
						
					
					
						commit
						cadbd0313b
					
				| @ -105,6 +105,7 @@ int sysctl_tcp_abc __read_mostly; | ||||
| #define FLAG_SND_UNA_ADVANCED	0x400 /* Snd_una was changed (!= FLAG_DATA_ACKED) */ | ||||
| #define FLAG_DSACKING_ACK	0x800 /* SACK blocks contained D-SACK info */ | ||||
| #define FLAG_NONHEAD_RETRANS_ACKED	0x1000 /* Non-head rexmitted data was ACKed */ | ||||
| #define FLAG_SACK_RENEGING	0x2000 /* snd_una advanced to a sacked seq */ | ||||
| 
 | ||||
| #define FLAG_ACKED		(FLAG_DATA_ACKED|FLAG_SYN_ACKED) | ||||
| #define FLAG_NOT_DUP		(FLAG_DATA|FLAG_WIN_UPDATE|FLAG_ACKED) | ||||
| @ -1918,18 +1919,15 @@ void tcp_enter_loss(struct sock *sk, int how) | ||||
| 	tp->frto_counter = 0; | ||||
| } | ||||
| 
 | ||||
| static int tcp_check_sack_reneging(struct sock *sk) | ||||
| /* If ACK arrived pointing to a remembered SACK, it means that our
 | ||||
|  * remembered SACKs do not reflect real state of receiver i.e. | ||||
|  * receiver _host_ is heavily congested (or buggy). | ||||
|  * | ||||
|  * Do processing similar to RTO timeout. | ||||
|  */ | ||||
| static int tcp_check_sack_reneging(struct sock *sk, int flag) | ||||
| { | ||||
| 	struct sk_buff *skb; | ||||
| 
 | ||||
| 	/* If ACK arrived pointing to a remembered SACK,
 | ||||
| 	 * it means that our remembered SACKs do not reflect | ||||
| 	 * real state of receiver i.e. | ||||
| 	 * receiver _host_ is heavily congested (or buggy). | ||||
| 	 * Do processing similar to RTO timeout. | ||||
| 	 */ | ||||
| 	if ((skb = tcp_write_queue_head(sk)) != NULL && | ||||
| 	    (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_ACKED)) { | ||||
| 	if (flag & FLAG_SACK_RENEGING) { | ||||
| 		struct inet_connection_sock *icsk = inet_csk(sk); | ||||
| 		NET_INC_STATS_BH(LINUX_MIB_TCPSACKRENEGING); | ||||
| 
 | ||||
| @ -2515,7 +2513,7 @@ tcp_fastretrans_alert(struct sock *sk, int pkts_acked, int flag) | ||||
| 		tp->prior_ssthresh = 0; | ||||
| 
 | ||||
| 	/* B. In all the states check for reneging SACKs. */ | ||||
| 	if (tp->sacked_out && tcp_check_sack_reneging(sk)) | ||||
| 	if (tcp_check_sack_reneging(sk, flag)) | ||||
| 		return; | ||||
| 
 | ||||
| 	/* C. Process data loss notification, provided it is valid. */ | ||||
| @ -2852,6 +2850,9 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets) | ||||
| 		tcp_clear_all_retrans_hints(tp); | ||||
| 	} | ||||
| 
 | ||||
| 	if (skb && (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_ACKED)) | ||||
| 		flag |= FLAG_SACK_RENEGING; | ||||
| 
 | ||||
| 	if (flag & FLAG_ACKED) { | ||||
| 		const struct tcp_congestion_ops *ca_ops | ||||
| 			= inet_csk(sk)->icsk_ca_ops; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user