Commit a4c2fd7f authored by Wei Wang's avatar Wei Wang Committed by David S. Miller

net: remove DST_NOCACHE flag

DST_NOCACHE flag check has been removed from dst_release() and
dst_hold_safe() in a previous patch because all the dst are now ref
counted properly and can be released based on refcnt only.
Looking at the rest of the DST_NOCACHE use, all of them can now be
removed or replaced with other checks.
So this patch gets rid of all the DST_NOCACHE usage and remove this flag
completely.
Signed-off-by: default avatarWei Wang <weiwan@google.com>
Acked-by: default avatarMartin KaFai Lau <kafai@fb.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b2a9c0ed
...@@ -563,7 +563,7 @@ static void vrf_rt6_release(struct net_device *dev, struct net_vrf *vrf) ...@@ -563,7 +563,7 @@ static void vrf_rt6_release(struct net_device *dev, struct net_vrf *vrf)
static int vrf_rt6_create(struct net_device *dev) static int vrf_rt6_create(struct net_device *dev)
{ {
int flags = DST_HOST | DST_NOPOLICY | DST_NOXFRM | DST_NOCACHE; int flags = DST_HOST | DST_NOPOLICY | DST_NOXFRM;
struct net_vrf *vrf = netdev_priv(dev); struct net_vrf *vrf = netdev_priv(dev);
struct net *net = dev_net(dev); struct net *net = dev_net(dev);
struct fib6_table *rt6i_table; struct fib6_table *rt6i_table;
......
...@@ -51,7 +51,6 @@ struct dst_entry { ...@@ -51,7 +51,6 @@ struct dst_entry {
#define DST_HOST 0x0001 #define DST_HOST 0x0001
#define DST_NOXFRM 0x0002 #define DST_NOXFRM 0x0002
#define DST_NOPOLICY 0x0004 #define DST_NOPOLICY 0x0004
#define DST_NOCACHE 0x0010
#define DST_NOCOUNT 0x0020 #define DST_NOCOUNT 0x0020
#define DST_FAKE_RTABLE 0x0040 #define DST_FAKE_RTABLE 0x0040
#define DST_XFRM_TUNNEL 0x0080 #define DST_XFRM_TUNNEL 0x0080
......
...@@ -170,7 +170,7 @@ static inline void rt6_update_expires(struct rt6_info *rt0, int timeout) ...@@ -170,7 +170,7 @@ static inline void rt6_update_expires(struct rt6_info *rt0, int timeout)
static inline u32 rt6_get_cookie(const struct rt6_info *rt) static inline u32 rt6_get_cookie(const struct rt6_info *rt)
{ {
if (rt->rt6i_flags & RTF_PCPU || if (rt->rt6i_flags & RTF_PCPU ||
(unlikely(rt->dst.flags & DST_NOCACHE) && rt->dst.from)) (unlikely(!list_empty(&rt->rt6i_uncached)) && rt->dst.from))
rt = (struct rt6_info *)(rt->dst.from); rt = (struct rt6_info *)(rt->dst.from);
return rt->rt6i_node ? rt->rt6i_node->fn_sernum : 0; return rt->rt6i_node ? rt->rt6i_node->fn_sernum : 0;
......
...@@ -270,7 +270,7 @@ static void __metadata_dst_init(struct metadata_dst *md_dst, u8 optslen) ...@@ -270,7 +270,7 @@ static void __metadata_dst_init(struct metadata_dst *md_dst, u8 optslen)
dst = &md_dst->dst; dst = &md_dst->dst;
dst_init(dst, &md_dst_ops, NULL, 1, DST_OBSOLETE_NONE, dst_init(dst, &md_dst_ops, NULL, 1, DST_OBSOLETE_NONE,
DST_METADATA | DST_NOCACHE | DST_NOCOUNT); DST_METADATA | DST_NOCOUNT);
dst->input = dst_md_discard; dst->input = dst_md_discard;
dst->output = dst_md_discard_out; dst->output = dst_md_discard_out;
......
...@@ -1299,7 +1299,7 @@ static struct fib_nh_exception *find_exception(struct fib_nh *nh, __be32 daddr) ...@@ -1299,7 +1299,7 @@ static struct fib_nh_exception *find_exception(struct fib_nh *nh, __be32 daddr)
} }
static bool rt_bind_exception(struct rtable *rt, struct fib_nh_exception *fnhe, static bool rt_bind_exception(struct rtable *rt, struct fib_nh_exception *fnhe,
__be32 daddr) __be32 daddr, const bool do_cache)
{ {
bool ret = false; bool ret = false;
...@@ -1328,7 +1328,7 @@ static bool rt_bind_exception(struct rtable *rt, struct fib_nh_exception *fnhe, ...@@ -1328,7 +1328,7 @@ static bool rt_bind_exception(struct rtable *rt, struct fib_nh_exception *fnhe,
if (!rt->rt_gateway) if (!rt->rt_gateway)
rt->rt_gateway = daddr; rt->rt_gateway = daddr;
if (!(rt->dst.flags & DST_NOCACHE)) { if (do_cache) {
dst_hold(&rt->dst); dst_hold(&rt->dst);
rcu_assign_pointer(*porig, rt); rcu_assign_pointer(*porig, rt);
if (orig) { if (orig) {
...@@ -1441,7 +1441,8 @@ static bool rt_cache_valid(const struct rtable *rt) ...@@ -1441,7 +1441,8 @@ static bool rt_cache_valid(const struct rtable *rt)
static void rt_set_nexthop(struct rtable *rt, __be32 daddr, static void rt_set_nexthop(struct rtable *rt, __be32 daddr,
const struct fib_result *res, const struct fib_result *res,
struct fib_nh_exception *fnhe, struct fib_nh_exception *fnhe,
struct fib_info *fi, u16 type, u32 itag) struct fib_info *fi, u16 type, u32 itag,
const bool do_cache)
{ {
bool cached = false; bool cached = false;
...@@ -1462,8 +1463,8 @@ static void rt_set_nexthop(struct rtable *rt, __be32 daddr, ...@@ -1462,8 +1463,8 @@ static void rt_set_nexthop(struct rtable *rt, __be32 daddr,
#endif #endif
rt->dst.lwtstate = lwtstate_get(nh->nh_lwtstate); rt->dst.lwtstate = lwtstate_get(nh->nh_lwtstate);
if (unlikely(fnhe)) if (unlikely(fnhe))
cached = rt_bind_exception(rt, fnhe, daddr); cached = rt_bind_exception(rt, fnhe, daddr, do_cache);
else if (!(rt->dst.flags & DST_NOCACHE)) else if (do_cache)
cached = rt_cache_route(nh, rt); cached = rt_cache_route(nh, rt);
if (unlikely(!cached)) { if (unlikely(!cached)) {
/* Routes we intend to cache in nexthop exception or /* Routes we intend to cache in nexthop exception or
...@@ -1471,7 +1472,6 @@ static void rt_set_nexthop(struct rtable *rt, __be32 daddr, ...@@ -1471,7 +1472,6 @@ static void rt_set_nexthop(struct rtable *rt, __be32 daddr,
* However, if we are unsuccessful at storing this * However, if we are unsuccessful at storing this
* route into the cache we really need to set it. * route into the cache we really need to set it.
*/ */
rt->dst.flags |= DST_NOCACHE;
if (!rt->rt_gateway) if (!rt->rt_gateway)
rt->rt_gateway = daddr; rt->rt_gateway = daddr;
rt_add_uncached_list(rt); rt_add_uncached_list(rt);
...@@ -1494,7 +1494,7 @@ struct rtable *rt_dst_alloc(struct net_device *dev, ...@@ -1494,7 +1494,7 @@ struct rtable *rt_dst_alloc(struct net_device *dev,
struct rtable *rt; struct rtable *rt;
rt = dst_alloc(&ipv4_dst_ops, dev, 1, DST_OBSOLETE_FORCE_CHK, rt = dst_alloc(&ipv4_dst_ops, dev, 1, DST_OBSOLETE_FORCE_CHK,
(will_cache ? 0 : (DST_HOST | DST_NOCACHE)) | (will_cache ? 0 : DST_HOST) |
(nopolicy ? DST_NOPOLICY : 0) | (nopolicy ? DST_NOPOLICY : 0) |
(noxfrm ? DST_NOXFRM : 0)); (noxfrm ? DST_NOXFRM : 0));
...@@ -1738,7 +1738,8 @@ static int __mkroute_input(struct sk_buff *skb, ...@@ -1738,7 +1738,8 @@ static int __mkroute_input(struct sk_buff *skb,
rth->dst.input = ip_forward; rth->dst.input = ip_forward;
rt_set_nexthop(rth, daddr, res, fnhe, res->fi, res->type, itag); rt_set_nexthop(rth, daddr, res, fnhe, res->fi, res->type, itag,
do_cache);
set_lwt_redirect(rth); set_lwt_redirect(rth);
skb_dst_set(skb, &rth->dst); skb_dst_set(skb, &rth->dst);
out: out:
...@@ -2026,11 +2027,9 @@ out: return err; ...@@ -2026,11 +2027,9 @@ out: return err;
rth->dst.input = lwtunnel_input; rth->dst.input = lwtunnel_input;
} }
if (unlikely(!rt_cache_route(nh, rth))) { if (unlikely(!rt_cache_route(nh, rth)))
rth->dst.flags |= DST_NOCACHE;
rt_add_uncached_list(rth); rt_add_uncached_list(rth);
} }
}
skb_dst_set(skb, &rth->dst); skb_dst_set(skb, &rth->dst);
err = 0; err = 0;
goto out; goto out;
...@@ -2260,7 +2259,7 @@ static struct rtable *__mkroute_output(const struct fib_result *res, ...@@ -2260,7 +2259,7 @@ static struct rtable *__mkroute_output(const struct fib_result *res,
#endif #endif
} }
rt_set_nexthop(rth, fl4->daddr, res, fnhe, fi, type, 0); rt_set_nexthop(rth, fl4->daddr, res, fnhe, fi, type, 0, do_cache);
set_lwt_redirect(rth); set_lwt_redirect(rth);
return rth; return rth;
......
...@@ -975,8 +975,7 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt, ...@@ -975,8 +975,7 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt,
int replace_required = 0; int replace_required = 0;
int sernum = fib6_new_sernum(info->nl_net); int sernum = fib6_new_sernum(info->nl_net);
if (WARN_ON_ONCE((rt->dst.flags & DST_NOCACHE) && if (WARN_ON_ONCE(!atomic_read(&rt->dst.__refcnt)))
!atomic_read(&rt->dst.__refcnt)))
return -EINVAL; return -EINVAL;
if (info->nlh) { if (info->nlh) {
...@@ -1073,7 +1072,6 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt, ...@@ -1073,7 +1072,6 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt,
fib6_start_gc(info->nl_net, rt); fib6_start_gc(info->nl_net, rt);
if (!(rt->rt6i_flags & RTF_CACHE)) if (!(rt->rt6i_flags & RTF_CACHE))
fib6_prune_clones(info->nl_net, pn); fib6_prune_clones(info->nl_net, pn);
rt->dst.flags &= ~DST_NOCACHE;
} }
out: out:
......
...@@ -128,7 +128,6 @@ static void rt6_uncached_list_add(struct rt6_info *rt) ...@@ -128,7 +128,6 @@ static void rt6_uncached_list_add(struct rt6_info *rt)
{ {
struct uncached_list *ul = raw_cpu_ptr(&rt6_uncached_list); struct uncached_list *ul = raw_cpu_ptr(&rt6_uncached_list);
rt->dst.flags |= DST_NOCACHE;
rt->rt6i_uncached_list = ul; rt->rt6i_uncached_list = ul;
spin_lock_bh(&ul->lock); spin_lock_bh(&ul->lock);
...@@ -1326,7 +1325,7 @@ static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie) ...@@ -1326,7 +1325,7 @@ static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie)
rt6_dst_from_metrics_check(rt); rt6_dst_from_metrics_check(rt);
if (rt->rt6i_flags & RTF_PCPU || if (rt->rt6i_flags & RTF_PCPU ||
(unlikely(dst->flags & DST_NOCACHE) && rt->dst.from)) (unlikely(!list_empty(&rt->rt6i_uncached)) && rt->dst.from))
return rt6_dst_from_check(rt, cookie); return rt6_dst_from_check(rt, cookie);
else else
return rt6_check(rt, cookie); return rt6_check(rt, cookie);
...@@ -2130,8 +2129,7 @@ static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info) ...@@ -2130,8 +2129,7 @@ static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info)
struct fib6_table *table; struct fib6_table *table;
struct net *net = dev_net(rt->dst.dev); struct net *net = dev_net(rt->dst.dev);
if (rt == net->ipv6.ip6_null_entry || if (rt == net->ipv6.ip6_null_entry) {
rt->dst.flags & DST_NOCACHE) {
err = -ENOENT; err = -ENOENT;
goto out; goto out;
} }
...@@ -2722,7 +2720,6 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev, ...@@ -2722,7 +2720,6 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
rt->rt6i_dst.plen = 128; rt->rt6i_dst.plen = 128;
tb_id = l3mdev_fib_table(idev->dev) ? : RT6_TABLE_LOCAL; tb_id = l3mdev_fib_table(idev->dev) ? : RT6_TABLE_LOCAL;
rt->rt6i_table = fib6_get_table(net, tb_id); rt->rt6i_table = fib6_get_table(net, tb_id);
rt->dst.flags |= DST_NOCACHE;
return rt; return rt;
} }
......
...@@ -2231,7 +2231,6 @@ struct dst_entry *xfrm_lookup(struct net *net, struct dst_entry *dst_orig, ...@@ -2231,7 +2231,6 @@ struct dst_entry *xfrm_lookup(struct net *net, struct dst_entry *dst_orig,
} }
dst_hold(&xdst->u.dst); dst_hold(&xdst->u.dst);
xdst->u.dst.flags |= DST_NOCACHE;
route = xdst->route; route = xdst->route;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment