diff options
author | wenxu <wenxu@ucloud.cn> | 2019-02-22 10:58:12 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-02-25 08:51:55 +0300 |
commit | 41411e2fd6b8dcc91dadcc4f9d553b93e66da3b5 (patch) | |
tree | eca054c90c5af84c333287288f250295fc6d1000 /net/sched | |
parent | caf337bdef33a71c5e38a41f4f49c163018c375a (diff) | |
download | linux-41411e2fd6b8dcc91dadcc4f9d553b93e66da3b5.tar.xz |
net/sched: act_tunnel_key: Add dst_cache support
The metadata_dst is not init the dst_cache which make the
ip_md_tunnel_xmit can't use the dst_cache. It will lookup
route table every packets.
Signed-off-by: wenxu <wenxu@ucloud.cn>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched')
-rw-r--r-- | net/sched/act_tunnel_key.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/net/sched/act_tunnel_key.c b/net/sched/act_tunnel_key.c index 9104b8e36482..3404af72b4c1 100644 --- a/net/sched/act_tunnel_key.c +++ b/net/sched/act_tunnel_key.c @@ -321,12 +321,18 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla, goto err_out; } +#ifdef CONFIG_DST_CACHE + ret = dst_cache_init(&metadata->u.tun_info.dst_cache, GFP_KERNEL); + if (ret) + goto release_tun_meta; +#endif + if (opts_len) { ret = tunnel_key_opts_set(tb[TCA_TUNNEL_KEY_ENC_OPTS], &metadata->u.tun_info, opts_len, extack); if (ret < 0) - goto release_tun_meta; + goto release_dst_cache; } metadata->u.tun_info.mode |= IP_TUNNEL_INFO_TX; @@ -342,14 +348,14 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla, &act_tunnel_key_ops, bind, true); if (ret) { NL_SET_ERR_MSG(extack, "Cannot create TC IDR"); - goto release_tun_meta; + goto release_dst_cache; } ret = ACT_P_CREATED; } else if (!ovr) { NL_SET_ERR_MSG(extack, "TC IDR already exists"); ret = -EEXIST; - goto release_tun_meta; + goto release_dst_cache; } t = to_tunnel_key(*a); @@ -359,7 +365,7 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla, NL_SET_ERR_MSG(extack, "Cannot allocate tunnel key parameters"); ret = -ENOMEM; exists = true; - goto release_tun_meta; + goto release_dst_cache; } params_new->tcft_action = parm->t_action; params_new->tcft_enc_metadata = metadata; @@ -376,6 +382,10 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla, return ret; +release_dst_cache: +#ifdef CONFIG_DST_CACHE + dst_cache_destroy(&metadata->u.tun_info.dst_cache); +#endif release_tun_meta: dst_release(&metadata->dst); @@ -391,8 +401,15 @@ static void tunnel_key_release(struct tc_action *a) { struct tcf_tunnel_key *t = to_tunnel_key(a); struct tcf_tunnel_key_params *params; +#ifdef CONFIG_DST_CACHE + struct ip_tunnel_info *info; +#endif params = rcu_dereference_protected(t->params, 1); +#ifdef CONFIG_DST_CACHE + info = ¶ms->tcft_enc_metadata->u.tun_info; + dst_cache_destroy(&info->dst_cache); +#endif tunnel_key_release_params(params); } |