summaryrefslogtreecommitdiffstats
path: root/net/ipv4/route.c
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2013-05-27 22:46:32 +0200
committerDavid S. Miller <davem@davemloft.net>2013-06-03 09:07:43 +0200
commitf016229e303c294afac721de4cd4427e634950ea (patch)
tree9289683f82bc09ccadba983778f39e842ddaa2f2 /net/ipv4/route.c
parentipv4: properly refresh rtable entries on pmtu/redirect events (diff)
downloadlinux-f016229e303c294afac721de4cd4427e634950ea.tar.xz
linux-f016229e303c294afac721de4cd4427e634950ea.zip
ipv4: rate limit updating of next hop exceptions with same pmtu
The tunnel devices call update_pmtu for each packet sent, this causes contention on the fnhe_lock. Ignore the pmtu update if pmtu is not actually changed, and there is still plenty of time before the entry expires. Signed-off-by: Timo Teräs <timo.teras@iki.fi> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/route.c')
-rw-r--r--net/ipv4/route.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 561a37833d86..a4082be1b9b4 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -947,6 +947,10 @@ static void __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu)
if (mtu < ip_rt_min_pmtu)
mtu = ip_rt_min_pmtu;
+ if (rt->rt_pmtu == mtu &&
+ time_before(jiffies, dst->expires - ip_rt_mtu_expires / 2))
+ return;
+
rcu_read_lock();
if (fib_lookup(dev_net(dst->dev), fl4, &res) == 0) {
struct fib_nh *nh = &FIB_RES_NH(res);