diff options
author | Timo Teräs <timo.teras@iki.fi> | 2013-05-27 22:46:32 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-06-03 09:07:43 +0200 |
commit | f016229e303c294afac721de4cd4427e634950ea (patch) | |
tree | 9289683f82bc09ccadba983778f39e842ddaa2f2 /net/ipv4/route.c | |
parent | ipv4: properly refresh rtable entries on pmtu/redirect events (diff) | |
download | linux-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.c | 4 |
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); |