Skip to content

Commit

Permalink
ipv4: mark DST_NOGC and remove the operation of dst_free()
Browse files Browse the repository at this point in the history
With the previous preparation patches, we are ready to get rid of the
dst gc operation in ipv4 code and release dst based on refcnt only.
So this patch adds DST_NOGC flag for all IPv4 dst and remove the calls
to dst_free().
At this point, all dst created in ipv4 code do not use the dst gc
anymore and will be destroyed at the point when refcnt drops to 0.

Signed-off-by: Wei Wang <[email protected]>
Acked-by: Martin KaFai Lau <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
tracywwnj authored and davem330 committed Jun 18, 2017
1 parent 9df16ef commit b838d5e
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 16 deletions.
6 changes: 2 additions & 4 deletions net/ipv4/fib_semantics.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,8 +153,7 @@ static void rt_fibinfo_free(struct rtable __rcu **rtp)
*/

dst_dev_put(&rt->dst);
dst_release(&rt->dst);
dst_free(&rt->dst);
dst_release_immediate(&rt->dst);
}

static void free_nh_exceptions(struct fib_nh *nh)
Expand Down Expand Up @@ -198,8 +197,7 @@ static void rt_fibinfo_free_cpus(struct rtable __rcu * __percpu *rtp)
rt = rcu_dereference_protected(*per_cpu_ptr(rtp, cpu), 1);
if (rt) {
dst_dev_put(&rt->dst);
dst_release(&rt->dst);
dst_free(&rt->dst);
dst_release_immediate(&rt->dst);
}
}
free_percpu(rtp);
Expand Down
15 changes: 3 additions & 12 deletions net/ipv4/route.c
Original file line number Diff line number Diff line change
Expand Up @@ -589,11 +589,6 @@ static void ip_rt_build_flow_key(struct flowi4 *fl4, const struct sock *sk,
build_sk_flow_key(fl4, sk);
}

static inline void rt_free(struct rtable *rt)
{
call_rcu(&rt->dst.rcu_head, dst_rcu_free);
}

static DEFINE_SPINLOCK(fnhe_lock);

static void fnhe_flush_routes(struct fib_nh_exception *fnhe)
Expand All @@ -605,14 +600,12 @@ static void fnhe_flush_routes(struct fib_nh_exception *fnhe)
RCU_INIT_POINTER(fnhe->fnhe_rth_input, NULL);
dst_dev_put(&rt->dst);
dst_release(&rt->dst);
rt_free(rt);
}
rt = rcu_dereference(fnhe->fnhe_rth_output);
if (rt) {
RCU_INIT_POINTER(fnhe->fnhe_rth_output, NULL);
dst_dev_put(&rt->dst);
dst_release(&rt->dst);
rt_free(rt);
}
}

Expand Down Expand Up @@ -1341,7 +1334,6 @@ static bool rt_bind_exception(struct rtable *rt, struct fib_nh_exception *fnhe,
if (orig) {
dst_dev_put(&orig->dst);
dst_release(&orig->dst);
rt_free(orig);
}
ret = true;
}
Expand Down Expand Up @@ -1374,7 +1366,6 @@ static bool rt_cache_route(struct fib_nh *nh, struct rtable *rt)
if (orig) {
dst_dev_put(&orig->dst);
dst_release(&orig->dst);
rt_free(orig);
}
} else {
dst_release(&rt->dst);
Expand Down Expand Up @@ -1505,7 +1496,8 @@ struct rtable *rt_dst_alloc(struct net_device *dev,
rt = dst_alloc(&ipv4_dst_ops, dev, 1, DST_OBSOLETE_FORCE_CHK,
(will_cache ? 0 : (DST_HOST | DST_NOCACHE)) |
(nopolicy ? DST_NOPOLICY : 0) |
(noxfrm ? DST_NOXFRM : 0));
(noxfrm ? DST_NOXFRM : 0) |
DST_NOGC);

if (rt) {
rt->rt_genid = rt_genid_ipv4(dev_net(dev));
Expand Down Expand Up @@ -2511,7 +2503,7 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or
struct rtable *ort = (struct rtable *) dst_orig;
struct rtable *rt;

rt = dst_alloc(&ipv4_dst_blackhole_ops, NULL, 1, DST_OBSOLETE_NONE, 0);
rt = dst_alloc(&ipv4_dst_blackhole_ops, NULL, 1, DST_OBSOLETE_NONE, DST_NOGC);
if (rt) {
struct dst_entry *new = &rt->dst;

Expand All @@ -2534,7 +2526,6 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or
rt->rt_uses_gateway = ort->rt_uses_gateway;

INIT_LIST_HEAD(&rt->rt_uncached);
dst_free(new);
}

dst_release(dst_orig);
Expand Down

0 comments on commit b838d5e

Please sign in to comment.