Updated from Linux LTS 3.10.22 to 3.10.23
This commit is contained in:
@@ -57,7 +57,7 @@ int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
|
||||
if (IS_ERR(rt)) {
|
||||
err = PTR_ERR(rt);
|
||||
if (err == -ENETUNREACH)
|
||||
IP_INC_STATS_BH(sock_net(sk), IPSTATS_MIB_OUTNOROUTES);
|
||||
IP_INC_STATS(sock_net(sk), IPSTATS_MIB_OUTNOROUTES);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
@@ -351,6 +351,7 @@ static netdev_tx_t vti_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
if (!rt->dst.xfrm ||
|
||||
rt->dst.xfrm->props.mode != XFRM_MODE_TUNNEL) {
|
||||
dev->stats.tx_carrier_errors++;
|
||||
ip_rt_put(rt);
|
||||
goto tx_error_icmp;
|
||||
}
|
||||
tdev = rt->dst.dev;
|
||||
|
||||
@@ -583,7 +583,7 @@ static int ping_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
||||
err = PTR_ERR(rt);
|
||||
rt = NULL;
|
||||
if (err == -ENETUNREACH)
|
||||
IP_INC_STATS_BH(net, IPSTATS_MIB_OUTNOROUTES);
|
||||
IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
@@ -1725,8 +1725,12 @@ local_input:
|
||||
rth->dst.error= -err;
|
||||
rth->rt_flags &= ~RTCF_LOCAL;
|
||||
}
|
||||
if (do_cache)
|
||||
rt_cache_route(&FIB_RES_NH(res), rth);
|
||||
if (do_cache) {
|
||||
if (unlikely(!rt_cache_route(&FIB_RES_NH(res), rth))) {
|
||||
rth->dst.flags |= DST_NOCACHE;
|
||||
rt_add_uncached_list(rth);
|
||||
}
|
||||
}
|
||||
skb_dst_set(skb, &rth->dst);
|
||||
err = 0;
|
||||
goto out;
|
||||
|
||||
@@ -813,12 +813,6 @@ static unsigned int tcp_xmit_size_goal(struct sock *sk, u32 mss_now,
|
||||
xmit_size_goal = min_t(u32, gso_size,
|
||||
sk->sk_gso_max_size - 1 - hlen);
|
||||
|
||||
/* TSQ : try to have at least two segments in flight
|
||||
* (one in NIC TX ring, another in Qdisc)
|
||||
*/
|
||||
xmit_size_goal = min_t(u32, xmit_size_goal,
|
||||
sysctl_tcp_limit_output_bytes >> 1);
|
||||
|
||||
xmit_size_goal = tcp_bound_to_half_wnd(tp, xmit_size_goal);
|
||||
|
||||
/* We try hard to avoid divides here */
|
||||
@@ -2915,6 +2909,7 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb,
|
||||
netdev_features_t features)
|
||||
{
|
||||
struct sk_buff *segs = ERR_PTR(-EINVAL);
|
||||
unsigned int sum_truesize = 0;
|
||||
struct tcphdr *th;
|
||||
unsigned int thlen;
|
||||
unsigned int seq;
|
||||
@@ -2998,13 +2993,7 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb,
|
||||
if (copy_destructor) {
|
||||
skb->destructor = gso_skb->destructor;
|
||||
skb->sk = gso_skb->sk;
|
||||
/* {tcp|sock}_wfree() use exact truesize accounting :
|
||||
* sum(skb->truesize) MUST be exactly be gso_skb->truesize
|
||||
* So we account mss bytes of 'true size' for each segment.
|
||||
* The last segment will contain the remaining.
|
||||
*/
|
||||
skb->truesize = mss;
|
||||
gso_skb->truesize -= mss;
|
||||
sum_truesize += skb->truesize;
|
||||
}
|
||||
skb = skb->next;
|
||||
th = tcp_hdr(skb);
|
||||
@@ -3021,7 +3010,9 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb,
|
||||
if (copy_destructor) {
|
||||
swap(gso_skb->sk, skb->sk);
|
||||
swap(gso_skb->destructor, skb->destructor);
|
||||
swap(gso_skb->truesize, skb->truesize);
|
||||
sum_truesize += skb->truesize;
|
||||
atomic_add(sum_truesize - gso_skb->truesize,
|
||||
&skb->sk->sk_wmem_alloc);
|
||||
}
|
||||
|
||||
delta = htonl(oldlen + (skb->tail - skb->transport_header) +
|
||||
|
||||
@@ -176,7 +176,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
|
||||
if (IS_ERR(rt)) {
|
||||
err = PTR_ERR(rt);
|
||||
if (err == -ENETUNREACH)
|
||||
IP_INC_STATS_BH(sock_net(sk), IPSTATS_MIB_OUTNOROUTES);
|
||||
IP_INC_STATS(sock_net(sk), IPSTATS_MIB_OUTNOROUTES);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -1877,8 +1877,12 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle,
|
||||
* - better RTT estimation and ACK scheduling
|
||||
* - faster recovery
|
||||
* - high rates
|
||||
* Alas, some drivers / subsystems require a fair amount
|
||||
* of queued bytes to ensure line rate.
|
||||
* One example is wifi aggregation (802.11 AMPDU)
|
||||
*/
|
||||
limit = max(skb->truesize, sk->sk_pacing_rate >> 10);
|
||||
limit = max_t(unsigned int, sysctl_tcp_limit_output_bytes,
|
||||
sk->sk_pacing_rate >> 10);
|
||||
|
||||
if (atomic_read(&sk->sk_wmem_alloc) > limit) {
|
||||
set_bit(TSQ_THROTTLED, &tp->tsq_flags);
|
||||
@@ -3111,7 +3115,6 @@ void tcp_send_window_probe(struct sock *sk)
|
||||
{
|
||||
if (sk->sk_state == TCP_ESTABLISHED) {
|
||||
tcp_sk(sk)->snd_wl1 = tcp_sk(sk)->rcv_nxt - 1;
|
||||
tcp_sk(sk)->snd_nxt = tcp_sk(sk)->write_seq;
|
||||
tcp_xmit_probe_skb(sk, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -972,7 +972,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
||||
err = PTR_ERR(rt);
|
||||
rt = NULL;
|
||||
if (err == -ENETUNREACH)
|
||||
IP_INC_STATS_BH(net, IPSTATS_MIB_OUTNOROUTES);
|
||||
IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -1071,6 +1071,9 @@ int udp_sendpage(struct sock *sk, struct page *page, int offset,
|
||||
struct udp_sock *up = udp_sk(sk);
|
||||
int ret;
|
||||
|
||||
if (flags & MSG_SENDPAGE_NOTLAST)
|
||||
flags |= MSG_MORE;
|
||||
|
||||
if (!up->pending) {
|
||||
struct msghdr msg = { .msg_flags = flags|MSG_MORE };
|
||||
|
||||
|
||||
Reference in New Issue
Block a user