diff options
author | David S. Miller <davem@davemloft.net> | 2014-08-05 21:46:26 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-08-05 21:46:26 -0400 |
commit | d247b6ab3ce6dd43665780865ec5fa145d9ab6bd (patch) | |
tree | 02eb71e4d64b678d7568d2b99f309e08f56ef2fe /net/ipv4 | |
parent | 30f00847953e3aa3f710d62ffd37b42042807900 (diff) | |
parent | 4d8fdc95c60e90d84c8257a0067ff4b1729a3757 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts:
drivers/net/Makefile
net/ipv6/sysctl_net_ipv6.c
Two ipv6_table_template[] additions overlap, so the index
of the ipv6_table[x] assignments needed to be adjusted.
In the drivers/net/Makefile case, we've gotten rid of the
garbage whereby we had to list every single USB networking
driver in the top-level Makefile, there is just one
"USB_NETWORKING" that guards everything.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/ip_tunnel.c | 29 | ||||
-rw-r--r-- | net/ipv4/tcp_vegas.c | 3 | ||||
-rw-r--r-- | net/ipv4/tcp_veno.c | 2 |
3 files changed, 21 insertions, 13 deletions
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index dd8c8c765799..afed1aac2638 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c | |||
@@ -69,23 +69,25 @@ static unsigned int ip_tunnel_hash(__be32 key, __be32 remote) | |||
69 | } | 69 | } |
70 | 70 | ||
71 | static void __tunnel_dst_set(struct ip_tunnel_dst *idst, | 71 | static void __tunnel_dst_set(struct ip_tunnel_dst *idst, |
72 | struct dst_entry *dst) | 72 | struct dst_entry *dst, __be32 saddr) |
73 | { | 73 | { |
74 | struct dst_entry *old_dst; | 74 | struct dst_entry *old_dst; |
75 | 75 | ||
76 | dst_clone(dst); | 76 | dst_clone(dst); |
77 | old_dst = xchg((__force struct dst_entry **)&idst->dst, dst); | 77 | old_dst = xchg((__force struct dst_entry **)&idst->dst, dst); |
78 | dst_release(old_dst); | 78 | dst_release(old_dst); |
79 | idst->saddr = saddr; | ||
79 | } | 80 | } |
80 | 81 | ||
81 | static void tunnel_dst_set(struct ip_tunnel *t, struct dst_entry *dst) | 82 | static void tunnel_dst_set(struct ip_tunnel *t, |
83 | struct dst_entry *dst, __be32 saddr) | ||
82 | { | 84 | { |
83 | __tunnel_dst_set(this_cpu_ptr(t->dst_cache), dst); | 85 | __tunnel_dst_set(this_cpu_ptr(t->dst_cache), dst, saddr); |
84 | } | 86 | } |
85 | 87 | ||
86 | static void tunnel_dst_reset(struct ip_tunnel *t) | 88 | static void tunnel_dst_reset(struct ip_tunnel *t) |
87 | { | 89 | { |
88 | tunnel_dst_set(t, NULL); | 90 | tunnel_dst_set(t, NULL, 0); |
89 | } | 91 | } |
90 | 92 | ||
91 | void ip_tunnel_dst_reset_all(struct ip_tunnel *t) | 93 | void ip_tunnel_dst_reset_all(struct ip_tunnel *t) |
@@ -93,20 +95,25 @@ void ip_tunnel_dst_reset_all(struct ip_tunnel *t) | |||
93 | int i; | 95 | int i; |
94 | 96 | ||
95 | for_each_possible_cpu(i) | 97 | for_each_possible_cpu(i) |
96 | __tunnel_dst_set(per_cpu_ptr(t->dst_cache, i), NULL); | 98 | __tunnel_dst_set(per_cpu_ptr(t->dst_cache, i), NULL, 0); |
97 | } | 99 | } |
98 | EXPORT_SYMBOL(ip_tunnel_dst_reset_all); | 100 | EXPORT_SYMBOL(ip_tunnel_dst_reset_all); |
99 | 101 | ||
100 | static struct rtable *tunnel_rtable_get(struct ip_tunnel *t, u32 cookie) | 102 | static struct rtable *tunnel_rtable_get(struct ip_tunnel *t, |
103 | u32 cookie, __be32 *saddr) | ||
101 | { | 104 | { |
105 | struct ip_tunnel_dst *idst; | ||
102 | struct dst_entry *dst; | 106 | struct dst_entry *dst; |
103 | 107 | ||
104 | rcu_read_lock(); | 108 | rcu_read_lock(); |
105 | dst = rcu_dereference(this_cpu_ptr(t->dst_cache)->dst); | 109 | idst = this_cpu_ptr(t->dst_cache); |
110 | dst = rcu_dereference(idst->dst); | ||
106 | if (dst && !atomic_inc_not_zero(&dst->__refcnt)) | 111 | if (dst && !atomic_inc_not_zero(&dst->__refcnt)) |
107 | dst = NULL; | 112 | dst = NULL; |
108 | if (dst) { | 113 | if (dst) { |
109 | if (dst->obsolete && dst->ops->check(dst, cookie) == NULL) { | 114 | if (!dst->obsolete || dst->ops->check(dst, cookie)) { |
115 | *saddr = idst->saddr; | ||
116 | } else { | ||
110 | tunnel_dst_reset(t); | 117 | tunnel_dst_reset(t); |
111 | dst_release(dst); | 118 | dst_release(dst); |
112 | dst = NULL; | 119 | dst = NULL; |
@@ -367,7 +374,7 @@ static int ip_tunnel_bind_dev(struct net_device *dev) | |||
367 | 374 | ||
368 | if (!IS_ERR(rt)) { | 375 | if (!IS_ERR(rt)) { |
369 | tdev = rt->dst.dev; | 376 | tdev = rt->dst.dev; |
370 | tunnel_dst_set(tunnel, &rt->dst); | 377 | tunnel_dst_set(tunnel, &rt->dst, fl4.saddr); |
371 | ip_rt_put(rt); | 378 | ip_rt_put(rt); |
372 | } | 379 | } |
373 | if (dev->type != ARPHRD_ETHER) | 380 | if (dev->type != ARPHRD_ETHER) |
@@ -610,7 +617,7 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, | |||
610 | init_tunnel_flow(&fl4, protocol, dst, tnl_params->saddr, | 617 | init_tunnel_flow(&fl4, protocol, dst, tnl_params->saddr, |
611 | tunnel->parms.o_key, RT_TOS(tos), tunnel->parms.link); | 618 | tunnel->parms.o_key, RT_TOS(tos), tunnel->parms.link); |
612 | 619 | ||
613 | rt = connected ? tunnel_rtable_get(tunnel, 0) : NULL; | 620 | rt = connected ? tunnel_rtable_get(tunnel, 0, &fl4.saddr) : NULL; |
614 | 621 | ||
615 | if (!rt) { | 622 | if (!rt) { |
616 | rt = ip_route_output_key(tunnel->net, &fl4); | 623 | rt = ip_route_output_key(tunnel->net, &fl4); |
@@ -620,7 +627,7 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, | |||
620 | goto tx_error; | 627 | goto tx_error; |
621 | } | 628 | } |
622 | if (connected) | 629 | if (connected) |
623 | tunnel_dst_set(tunnel, &rt->dst); | 630 | tunnel_dst_set(tunnel, &rt->dst, fl4.saddr); |
624 | } | 631 | } |
625 | 632 | ||
626 | if (rt->dst.dev == dev) { | 633 | if (rt->dst.dev == dev) { |
diff --git a/net/ipv4/tcp_vegas.c b/net/ipv4/tcp_vegas.c index 9a5e05f27f4f..b40ad897f945 100644 --- a/net/ipv4/tcp_vegas.c +++ b/net/ipv4/tcp_vegas.c | |||
@@ -218,7 +218,8 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 acked) | |||
218 | * This is: | 218 | * This is: |
219 | * (actual rate in segments) * baseRTT | 219 | * (actual rate in segments) * baseRTT |
220 | */ | 220 | */ |
221 | target_cwnd = tp->snd_cwnd * vegas->baseRTT / rtt; | 221 | target_cwnd = (u64)tp->snd_cwnd * vegas->baseRTT; |
222 | do_div(target_cwnd, rtt); | ||
222 | 223 | ||
223 | /* Calculate the difference between the window we had, | 224 | /* Calculate the difference between the window we had, |
224 | * and the window we would like to have. This quantity | 225 | * and the window we would like to have. This quantity |
diff --git a/net/ipv4/tcp_veno.c b/net/ipv4/tcp_veno.c index 27b9825753d1..8276977d2c85 100644 --- a/net/ipv4/tcp_veno.c +++ b/net/ipv4/tcp_veno.c | |||
@@ -144,7 +144,7 @@ static void tcp_veno_cong_avoid(struct sock *sk, u32 ack, u32 acked) | |||
144 | 144 | ||
145 | rtt = veno->minrtt; | 145 | rtt = veno->minrtt; |
146 | 146 | ||
147 | target_cwnd = (tp->snd_cwnd * veno->basertt); | 147 | target_cwnd = (u64)tp->snd_cwnd * veno->basertt; |
148 | target_cwnd <<= V_PARAM_SHIFT; | 148 | target_cwnd <<= V_PARAM_SHIFT; |
149 | do_div(target_cwnd, rtt); | 149 | do_div(target_cwnd, rtt); |
150 | 150 | ||