diff options
author | David Ahern <dsahern@gmail.com> | 2018-04-17 20:33:25 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-04-17 23:41:17 -0400 |
commit | 93531c6743157d7e8c5792f8ed1a57641149d62c (patch) | |
tree | 4b98aae69f30150406618f00ac902c88de9a3a94 /net/ipv6/anycast.c | |
parent | a64efe142f5e70b7e39276a414bbb3b96691c608 (diff) |
net/ipv6: separate handling of FIB entries from dst based routes
Last step before flipping the data type for FIB entries:
- use fib6_info_alloc to create FIB entries in ip6_route_info_create
and addrconf_dst_alloc
- use fib6_info_release in place of dst_release, ip6_rt_put and
rt6_release
- remove the dst_hold before calling __ip6_ins_rt or ip6_del_rt
- when purging routes, drop per-cpu routes
- replace inc and dec of rt6i_ref with fib6_info_hold and fib6_info_release
- use rt->from since it points to the FIB entry
- drop references to exception bucket, fib6_metrics and per-cpu from
dst entries (those are relevant for fib entries only)
Signed-off-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/anycast.c')
-rw-r--r-- | net/ipv6/anycast.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/net/ipv6/anycast.c b/net/ipv6/anycast.c index e456386fe4d5..3db8fe10322b 100644 --- a/net/ipv6/anycast.c +++ b/net/ipv6/anycast.c | |||
@@ -213,7 +213,7 @@ static void aca_put(struct ifacaddr6 *ac) | |||
213 | { | 213 | { |
214 | if (refcount_dec_and_test(&ac->aca_refcnt)) { | 214 | if (refcount_dec_and_test(&ac->aca_refcnt)) { |
215 | in6_dev_put(ac->aca_idev); | 215 | in6_dev_put(ac->aca_idev); |
216 | dst_release(&ac->aca_rt->dst); | 216 | fib6_info_release(ac->aca_rt); |
217 | kfree(ac); | 217 | kfree(ac); |
218 | } | 218 | } |
219 | } | 219 | } |
@@ -231,6 +231,7 @@ static struct ifacaddr6 *aca_alloc(struct rt6_info *rt, | |||
231 | aca->aca_addr = *addr; | 231 | aca->aca_addr = *addr; |
232 | in6_dev_hold(idev); | 232 | in6_dev_hold(idev); |
233 | aca->aca_idev = idev; | 233 | aca->aca_idev = idev; |
234 | fib6_info_hold(rt); | ||
234 | aca->aca_rt = rt; | 235 | aca->aca_rt = rt; |
235 | aca->aca_users = 1; | 236 | aca->aca_users = 1; |
236 | /* aca_tstamp should be updated upon changes */ | 237 | /* aca_tstamp should be updated upon changes */ |
@@ -274,7 +275,7 @@ int __ipv6_dev_ac_inc(struct inet6_dev *idev, const struct in6_addr *addr) | |||
274 | } | 275 | } |
275 | aca = aca_alloc(rt, addr); | 276 | aca = aca_alloc(rt, addr); |
276 | if (!aca) { | 277 | if (!aca) { |
277 | ip6_rt_put(rt); | 278 | fib6_info_release(rt); |
278 | err = -ENOMEM; | 279 | err = -ENOMEM; |
279 | goto out; | 280 | goto out; |
280 | } | 281 | } |
@@ -330,7 +331,6 @@ int __ipv6_dev_ac_dec(struct inet6_dev *idev, const struct in6_addr *addr) | |||
330 | write_unlock_bh(&idev->lock); | 331 | write_unlock_bh(&idev->lock); |
331 | addrconf_leave_solict(idev, &aca->aca_addr); | 332 | addrconf_leave_solict(idev, &aca->aca_addr); |
332 | 333 | ||
333 | dst_hold(&aca->aca_rt->dst); | ||
334 | ip6_del_rt(dev_net(idev->dev), aca->aca_rt); | 334 | ip6_del_rt(dev_net(idev->dev), aca->aca_rt); |
335 | 335 | ||
336 | aca_put(aca); | 336 | aca_put(aca); |
@@ -358,7 +358,6 @@ void ipv6_ac_destroy_dev(struct inet6_dev *idev) | |||
358 | 358 | ||
359 | addrconf_leave_solict(idev, &aca->aca_addr); | 359 | addrconf_leave_solict(idev, &aca->aca_addr); |
360 | 360 | ||
361 | dst_hold(&aca->aca_rt->dst); | ||
362 | ip6_del_rt(dev_net(idev->dev), aca->aca_rt); | 361 | ip6_del_rt(dev_net(idev->dev), aca->aca_rt); |
363 | 362 | ||
364 | aca_put(aca); | 363 | aca_put(aca); |