diff options
Diffstat (limited to 'net/ipv4/route.c')
-rw-r--r-- | net/ipv4/route.c | 16 |
1 files changed, 4 insertions, 12 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index fc1a81ca79a7..d6eabcfe8a90 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -1199,11 +1199,6 @@ restart: | |||
1199 | fnhe->fnhe_stamp = jiffies; | 1199 | fnhe->fnhe_stamp = jiffies; |
1200 | } | 1200 | } |
1201 | 1201 | ||
1202 | static inline void rt_free(struct rtable *rt) | ||
1203 | { | ||
1204 | call_rcu_bh(&rt->dst.rcu_head, dst_rcu_free); | ||
1205 | } | ||
1206 | |||
1207 | static void rt_cache_route(struct fib_nh *nh, struct rtable *rt) | 1202 | static void rt_cache_route(struct fib_nh *nh, struct rtable *rt) |
1208 | { | 1203 | { |
1209 | struct rtable *orig, *prev, **p = &nh->nh_rth_output; | 1204 | struct rtable *orig, *prev, **p = &nh->nh_rth_output; |
@@ -1213,17 +1208,14 @@ static void rt_cache_route(struct fib_nh *nh, struct rtable *rt) | |||
1213 | 1208 | ||
1214 | orig = *p; | 1209 | orig = *p; |
1215 | 1210 | ||
1211 | rt->dst.flags |= DST_RCU_FREE; | ||
1212 | dst_hold(&rt->dst); | ||
1216 | prev = cmpxchg(p, orig, rt); | 1213 | prev = cmpxchg(p, orig, rt); |
1217 | if (prev == orig) { | 1214 | if (prev == orig) { |
1218 | if (orig) | 1215 | if (orig) |
1219 | rt_free(orig); | 1216 | dst_release(&orig->dst); |
1220 | } else { | 1217 | } else { |
1221 | /* Routes we intend to cache in the FIB nexthop have | 1218 | dst_release(&rt->dst); |
1222 | * the DST_NOCACHE bit clear. However, if we are | ||
1223 | * unsuccessful at storing this route into the cache | ||
1224 | * we really need to set it. | ||
1225 | */ | ||
1226 | rt->dst.flags |= DST_NOCACHE; | ||
1227 | } | 1219 | } |
1228 | } | 1220 | } |
1229 | 1221 | ||