ipv6: fib: Add helpers to hold / drop a reference on rt6_info
Similar to commit1c677b3d28
("ipv4: fib: Add fib_info_hold() helper") and commitb423cb1080
("ipv4: fib: Export free_fib_info()") add an helper to hold a reference on rt6_info and export rt6_release() to drop it and potentially release the route. This is needed so that drivers capable of FIB offload could hold a reference on the route before queueing it for offload and drop it after the route has been programmed to the device's tables. Signed-off-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
fc882fcff1
commit
a460aa8396
|
@ -187,6 +187,22 @@ static inline void ip6_rt_put(struct rt6_info *rt)
|
|||
dst_release(&rt->dst);
|
||||
}
|
||||
|
||||
void rt6_free_pcpu(struct rt6_info *non_pcpu_rt);
|
||||
|
||||
static inline void rt6_hold(struct rt6_info *rt)
|
||||
{
|
||||
atomic_inc(&rt->rt6i_ref);
|
||||
}
|
||||
|
||||
static inline void rt6_release(struct rt6_info *rt)
|
||||
{
|
||||
if (atomic_dec_and_test(&rt->rt6i_ref)) {
|
||||
rt6_free_pcpu(rt);
|
||||
dst_dev_put(&rt->dst);
|
||||
dst_release(&rt->dst);
|
||||
}
|
||||
}
|
||||
|
||||
enum fib6_walk_state {
|
||||
#ifdef CONFIG_IPV6_SUBTREES
|
||||
FWS_S,
|
||||
|
|
|
@ -154,7 +154,7 @@ static void node_free(struct fib6_node *fn)
|
|||
kmem_cache_free(fib6_node_kmem, fn);
|
||||
}
|
||||
|
||||
static void rt6_free_pcpu(struct rt6_info *non_pcpu_rt)
|
||||
void rt6_free_pcpu(struct rt6_info *non_pcpu_rt)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
|
@ -177,15 +177,7 @@ static void rt6_free_pcpu(struct rt6_info *non_pcpu_rt)
|
|||
free_percpu(non_pcpu_rt->rt6i_pcpu);
|
||||
non_pcpu_rt->rt6i_pcpu = NULL;
|
||||
}
|
||||
|
||||
static void rt6_release(struct rt6_info *rt)
|
||||
{
|
||||
if (atomic_dec_and_test(&rt->rt6i_ref)) {
|
||||
rt6_free_pcpu(rt);
|
||||
dst_dev_put(&rt->dst);
|
||||
dst_release(&rt->dst);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt6_free_pcpu);
|
||||
|
||||
static void fib6_link_table(struct net *net, struct fib6_table *tb)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue