Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: [RXRPC] net/rxrpc/ar-connection.c: fix NULL dereference [TCP]: Fix logic breakage due to DSACK separation [TCP]: Congestion control API RTT sampling fix
This commit is contained in:
commit
fa04a008a1
8 changed files with 38 additions and 7 deletions
|
@ -261,6 +261,18 @@ static inline s64 ktime_to_ns(const ktime_t kt)
|
|||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* ktime_equal - Compares two ktime_t variables to see if they are equal
|
||||
* @cmp1: comparable1
|
||||
* @cmp2: comparable2
|
||||
*
|
||||
* Compare two ktime_t variables, returns 1 if equal
|
||||
*/
|
||||
static inline int ktime_equal(const ktime_t cmp1, const ktime_t cmp2)
|
||||
{
|
||||
return cmp1.tv64 == cmp2.tv64;
|
||||
}
|
||||
|
||||
static inline s64 ktime_to_us(const ktime_t kt)
|
||||
{
|
||||
struct timeval tv = ktime_to_timeval(kt);
|
||||
|
|
|
@ -1579,6 +1579,10 @@ static inline ktime_t net_timedelta(ktime_t t)
|
|||
return ktime_sub(ktime_get_real(), t);
|
||||
}
|
||||
|
||||
static inline ktime_t net_invalid_timestamp(void)
|
||||
{
|
||||
return ktime_set(0, 0);
|
||||
}
|
||||
|
||||
extern __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len);
|
||||
extern __sum16 __skb_checksum_complete(struct sk_buff *skb);
|
||||
|
|
|
@ -90,6 +90,9 @@ static void tcp_illinois_acked(struct sock *sk, u32 pkts_acked, ktime_t last)
|
|||
|
||||
ca->acked = pkts_acked;
|
||||
|
||||
if (ktime_equal(last, net_invalid_timestamp()))
|
||||
return;
|
||||
|
||||
rtt = ktime_to_us(net_timedelta(last));
|
||||
|
||||
/* ignore bogus values, this prevents wraparound in alpha math */
|
||||
|
|
|
@ -953,7 +953,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
|
|||
int prior_fackets;
|
||||
u32 lost_retrans = 0;
|
||||
int flag = 0;
|
||||
int dup_sack = 0;
|
||||
int found_dup_sack = 0;
|
||||
int cached_fack_count;
|
||||
int i;
|
||||
int first_sack_index;
|
||||
|
@ -964,20 +964,20 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
|
|||
|
||||
/* Check for D-SACK. */
|
||||
if (before(ntohl(sp[0].start_seq), TCP_SKB_CB(ack_skb)->ack_seq)) {
|
||||
dup_sack = 1;
|
||||
found_dup_sack = 1;
|
||||
tp->rx_opt.sack_ok |= 4;
|
||||
NET_INC_STATS_BH(LINUX_MIB_TCPDSACKRECV);
|
||||
} else if (num_sacks > 1 &&
|
||||
!after(ntohl(sp[0].end_seq), ntohl(sp[1].end_seq)) &&
|
||||
!before(ntohl(sp[0].start_seq), ntohl(sp[1].start_seq))) {
|
||||
dup_sack = 1;
|
||||
found_dup_sack = 1;
|
||||
tp->rx_opt.sack_ok |= 4;
|
||||
NET_INC_STATS_BH(LINUX_MIB_TCPDSACKOFORECV);
|
||||
}
|
||||
|
||||
/* D-SACK for already forgotten data...
|
||||
* Do dumb counting. */
|
||||
if (dup_sack &&
|
||||
if (found_dup_sack &&
|
||||
!after(ntohl(sp[0].end_seq), prior_snd_una) &&
|
||||
after(ntohl(sp[0].end_seq), tp->undo_marker))
|
||||
tp->undo_retrans--;
|
||||
|
@ -1058,6 +1058,7 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
|
|||
__u32 start_seq = ntohl(sp->start_seq);
|
||||
__u32 end_seq = ntohl(sp->end_seq);
|
||||
int fack_count;
|
||||
int dup_sack = (found_dup_sack && (i == first_sack_index));
|
||||
|
||||
skb = cached_skb;
|
||||
fack_count = cached_fack_count;
|
||||
|
@ -2409,7 +2410,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p)
|
|||
int acked = 0;
|
||||
int prior_packets = tp->packets_out;
|
||||
__s32 seq_rtt = -1;
|
||||
ktime_t last_ackt = ktime_set(0,0);
|
||||
ktime_t last_ackt = net_invalid_timestamp();
|
||||
|
||||
while ((skb = tcp_write_queue_head(sk)) &&
|
||||
skb != tcp_send_head(sk)) {
|
||||
|
@ -2487,6 +2488,10 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p)
|
|||
tcp_ack_update_rtt(sk, acked, seq_rtt);
|
||||
tcp_ack_packets_out(sk);
|
||||
|
||||
/* Is the ACK triggering packet unambiguous? */
|
||||
if (acked & FLAG_RETRANS_DATA_ACKED)
|
||||
last_ackt = net_invalid_timestamp();
|
||||
|
||||
if (ca_ops->pkts_acked)
|
||||
ca_ops->pkts_acked(sk, pkts_acked, last_ackt);
|
||||
}
|
||||
|
|
|
@ -266,7 +266,8 @@ static void tcp_lp_pkts_acked(struct sock *sk, u32 num_acked, ktime_t last)
|
|||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
struct lp *lp = inet_csk_ca(sk);
|
||||
|
||||
tcp_lp_rtt_sample(sk, ktime_to_us(net_timedelta(last)));
|
||||
if (!ktime_equal(last, net_invalid_timestamp()))
|
||||
tcp_lp_rtt_sample(sk, ktime_to_us(net_timedelta(last)));
|
||||
|
||||
/* calc inference */
|
||||
if (tcp_time_stamp > tp->rx_opt.rcv_tsecr)
|
||||
|
|
|
@ -117,6 +117,9 @@ void tcp_vegas_pkts_acked(struct sock *sk, u32 cnt, ktime_t last)
|
|||
struct vegas *vegas = inet_csk_ca(sk);
|
||||
u32 vrtt;
|
||||
|
||||
if (ktime_equal(last, net_invalid_timestamp()))
|
||||
return;
|
||||
|
||||
/* Never allow zero rtt or baseRTT */
|
||||
vrtt = ktime_to_us(net_timedelta(last)) + 1;
|
||||
|
||||
|
|
|
@ -74,6 +74,9 @@ static void tcp_veno_pkts_acked(struct sock *sk, u32 cnt, ktime_t last)
|
|||
struct veno *veno = inet_csk_ca(sk);
|
||||
u32 vrtt;
|
||||
|
||||
if (ktime_equal(last, net_invalid_timestamp()))
|
||||
return;
|
||||
|
||||
/* Never allow zero rtt or baseRTT */
|
||||
vrtt = ktime_to_us(net_timedelta(last)) + 1;
|
||||
|
||||
|
|
|
@ -211,7 +211,7 @@ static struct rxrpc_connection *rxrpc_alloc_connection(gfp_t gfp)
|
|||
conn->header_size = sizeof(struct rxrpc_header);
|
||||
}
|
||||
|
||||
_leave(" = %p{%d}", conn, conn->debug_id);
|
||||
_leave(" = %p{%d}", conn, conn ? conn->debug_id : 0);
|
||||
return conn;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue