diff options
Diffstat (limited to 'net/ipv4/route.c')
| -rw-r--r-- | net/ipv4/route.c | 43 |
1 files changed, 5 insertions, 38 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 82cf2a722b23..fd9af60397b5 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -202,11 +202,6 @@ EXPORT_SYMBOL(ip_tos2prio); | |||
| 202 | static DEFINE_PER_CPU(struct rt_cache_stat, rt_cache_stat); | 202 | static DEFINE_PER_CPU(struct rt_cache_stat, rt_cache_stat); |
| 203 | #define RT_CACHE_STAT_INC(field) __this_cpu_inc(rt_cache_stat.field) | 203 | #define RT_CACHE_STAT_INC(field) __this_cpu_inc(rt_cache_stat.field) |
| 204 | 204 | ||
| 205 | static inline int rt_genid(struct net *net) | ||
| 206 | { | ||
| 207 | return atomic_read(&net->ipv4.rt_genid); | ||
| 208 | } | ||
| 209 | |||
| 210 | #ifdef CONFIG_PROC_FS | 205 | #ifdef CONFIG_PROC_FS |
| 211 | static void *rt_cache_seq_start(struct seq_file *seq, loff_t *pos) | 206 | static void *rt_cache_seq_start(struct seq_file *seq, loff_t *pos) |
| 212 | { | 207 | { |
| @@ -447,27 +442,9 @@ static inline bool rt_is_expired(const struct rtable *rth) | |||
| 447 | return rth->rt_genid != rt_genid(dev_net(rth->dst.dev)); | 442 | return rth->rt_genid != rt_genid(dev_net(rth->dst.dev)); |
| 448 | } | 443 | } |
| 449 | 444 | ||
| 450 | /* | 445 | void rt_cache_flush(struct net *net) |
| 451 | * Perturbation of rt_genid by a small quantity [1..256] | ||
| 452 | * Using 8 bits of shuffling ensure we can call rt_cache_invalidate() | ||
| 453 | * many times (2^24) without giving recent rt_genid. | ||
| 454 | * Jenkins hash is strong enough that litle changes of rt_genid are OK. | ||
| 455 | */ | ||
| 456 | static void rt_cache_invalidate(struct net *net) | ||
| 457 | { | 446 | { |
| 458 | unsigned char shuffle; | 447 | rt_genid_bump(net); |
| 459 | |||
| 460 | get_random_bytes(&shuffle, sizeof(shuffle)); | ||
| 461 | atomic_add(shuffle + 1U, &net->ipv4.rt_genid); | ||
| 462 | } | ||
| 463 | |||
| 464 | /* | ||
| 465 | * delay < 0 : invalidate cache (fast : entries will be deleted later) | ||
| 466 | * delay >= 0 : invalidate & flush cache (can be long) | ||
| 467 | */ | ||
| 468 | void rt_cache_flush(struct net *net, int delay) | ||
| 469 | { | ||
| 470 | rt_cache_invalidate(net); | ||
| 471 | } | 448 | } |
| 472 | 449 | ||
| 473 | static struct neighbour *ipv4_neigh_lookup(const struct dst_entry *dst, | 450 | static struct neighbour *ipv4_neigh_lookup(const struct dst_entry *dst, |
| @@ -2345,7 +2322,7 @@ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 2345 | 2322 | ||
| 2346 | void ip_rt_multicast_event(struct in_device *in_dev) | 2323 | void ip_rt_multicast_event(struct in_device *in_dev) |
| 2347 | { | 2324 | { |
| 2348 | rt_cache_flush(dev_net(in_dev->dev), 0); | 2325 | rt_cache_flush(dev_net(in_dev->dev)); |
| 2349 | } | 2326 | } |
| 2350 | 2327 | ||
| 2351 | #ifdef CONFIG_SYSCTL | 2328 | #ifdef CONFIG_SYSCTL |
| @@ -2354,16 +2331,7 @@ static int ipv4_sysctl_rtcache_flush(ctl_table *__ctl, int write, | |||
| 2354 | size_t *lenp, loff_t *ppos) | 2331 | size_t *lenp, loff_t *ppos) |
| 2355 | { | 2332 | { |
| 2356 | if (write) { | 2333 | if (write) { |
| 2357 | int flush_delay; | 2334 | rt_cache_flush((struct net *)__ctl->extra1); |
| 2358 | ctl_table ctl; | ||
| 2359 | struct net *net; | ||
| 2360 | |||
| 2361 | memcpy(&ctl, __ctl, sizeof(ctl)); | ||
| 2362 | ctl.data = &flush_delay; | ||
| 2363 | proc_dointvec(&ctl, write, buffer, lenp, ppos); | ||
| 2364 | |||
| 2365 | net = (struct net *)__ctl->extra1; | ||
| 2366 | rt_cache_flush(net, flush_delay); | ||
| 2367 | return 0; | 2335 | return 0; |
| 2368 | } | 2336 | } |
| 2369 | 2337 | ||
| @@ -2533,8 +2501,7 @@ static __net_initdata struct pernet_operations sysctl_route_ops = { | |||
| 2533 | 2501 | ||
| 2534 | static __net_init int rt_genid_init(struct net *net) | 2502 | static __net_init int rt_genid_init(struct net *net) |
| 2535 | { | 2503 | { |
| 2536 | get_random_bytes(&net->ipv4.rt_genid, | 2504 | atomic_set(&net->rt_genid, 0); |
| 2537 | sizeof(net->ipv4.rt_genid)); | ||
| 2538 | get_random_bytes(&net->ipv4.dev_addr_genid, | 2505 | get_random_bytes(&net->ipv4.dev_addr_genid, |
| 2539 | sizeof(net->ipv4.dev_addr_genid)); | 2506 | sizeof(net->ipv4.dev_addr_genid)); |
| 2540 | return 0; | 2507 | return 0; |
