Commit 871cf386 authored by Pedro Tammela's avatar Pedro Tammela Committed by David S. Miller

net/sched: avoid indirect act functions on retpoline kernels

Expose the necessary tc act functions and wire up act_api to use
direct calls in retpoline kernels.
Signed-off-by: default avatarPedro Tammela <pctammela@mojatatu.com>
Reviewed-by: default avatarJamal Hadi Salim <jhs@mojatatu.com>
Reviewed-by: default avatarVictor Nogueira <victor@mojatatu.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7f0e8102
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <net/act_api.h> #include <net/act_api.h>
#include <net/netlink.h> #include <net/netlink.h>
#include <net/flow_offload.h> #include <net/flow_offload.h>
#include <net/tc_wrapper.h>
#ifdef CONFIG_INET #ifdef CONFIG_INET
DEFINE_STATIC_KEY_FALSE(tcf_frag_xmit_count); DEFINE_STATIC_KEY_FALSE(tcf_frag_xmit_count);
...@@ -1080,7 +1081,7 @@ int tcf_action_exec(struct sk_buff *skb, struct tc_action **actions, ...@@ -1080,7 +1081,7 @@ int tcf_action_exec(struct sk_buff *skb, struct tc_action **actions,
repeat_ttl = 32; repeat_ttl = 32;
repeat: repeat:
ret = a->ops->act(skb, a, res); ret = tc_act(skb, a, res);
if (unlikely(ret == TC_ACT_REPEAT)) { if (unlikely(ret == TC_ACT_REPEAT)) {
if (--repeat_ttl != 0) if (--repeat_ttl != 0)
goto repeat; goto repeat;
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <linux/tc_act/tc_bpf.h> #include <linux/tc_act/tc_bpf.h>
#include <net/tc_act/tc_bpf.h> #include <net/tc_act/tc_bpf.h>
#include <net/tc_wrapper.h>
#define ACT_BPF_NAME_LEN 256 #define ACT_BPF_NAME_LEN 256
...@@ -31,7 +32,8 @@ struct tcf_bpf_cfg { ...@@ -31,7 +32,8 @@ struct tcf_bpf_cfg {
static struct tc_action_ops act_bpf_ops; static struct tc_action_ops act_bpf_ops;
static int tcf_bpf_act(struct sk_buff *skb, const struct tc_action *act, TC_INDIRECT_SCOPE int tcf_bpf_act(struct sk_buff *skb,
const struct tc_action *act,
struct tcf_result *res) struct tcf_result *res)
{ {
bool at_ingress = skb_at_tc_ingress(skb); bool at_ingress = skb_at_tc_ingress(skb);
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <net/pkt_cls.h> #include <net/pkt_cls.h>
#include <uapi/linux/tc_act/tc_connmark.h> #include <uapi/linux/tc_act/tc_connmark.h>
#include <net/tc_act/tc_connmark.h> #include <net/tc_act/tc_connmark.h>
#include <net/tc_wrapper.h>
#include <net/netfilter/nf_conntrack.h> #include <net/netfilter/nf_conntrack.h>
#include <net/netfilter/nf_conntrack_core.h> #include <net/netfilter/nf_conntrack_core.h>
...@@ -27,7 +28,8 @@ ...@@ -27,7 +28,8 @@
static struct tc_action_ops act_connmark_ops; static struct tc_action_ops act_connmark_ops;
static int tcf_connmark_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tcf_connmark_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
const struct nf_conntrack_tuple_hash *thash; const struct nf_conntrack_tuple_hash *thash;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <linux/tc_act/tc_csum.h> #include <linux/tc_act/tc_csum.h>
#include <net/tc_act/tc_csum.h> #include <net/tc_act/tc_csum.h>
#include <net/tc_wrapper.h>
static const struct nla_policy csum_policy[TCA_CSUM_MAX + 1] = { static const struct nla_policy csum_policy[TCA_CSUM_MAX + 1] = {
[TCA_CSUM_PARMS] = { .len = sizeof(struct tc_csum), }, [TCA_CSUM_PARMS] = { .len = sizeof(struct tc_csum), },
...@@ -563,7 +564,8 @@ static int tcf_csum_ipv6(struct sk_buff *skb, u32 update_flags) ...@@ -563,7 +564,8 @@ static int tcf_csum_ipv6(struct sk_buff *skb, u32 update_flags)
return 0; return 0;
} }
static int tcf_csum_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tcf_csum_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
struct tcf_csum *p = to_tcf_csum(a); struct tcf_csum *p = to_tcf_csum(a);
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <net/ipv6_frag.h> #include <net/ipv6_frag.h>
#include <uapi/linux/tc_act/tc_ct.h> #include <uapi/linux/tc_act/tc_ct.h>
#include <net/tc_act/tc_ct.h> #include <net/tc_act/tc_ct.h>
#include <net/tc_wrapper.h>
#include <net/netfilter/nf_flow_table.h> #include <net/netfilter/nf_flow_table.h>
#include <net/netfilter/nf_conntrack.h> #include <net/netfilter/nf_conntrack.h>
...@@ -1038,7 +1039,7 @@ static int tcf_ct_act_nat(struct sk_buff *skb, ...@@ -1038,7 +1039,7 @@ static int tcf_ct_act_nat(struct sk_buff *skb,
#endif #endif
} }
static int tcf_ct_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tcf_ct_act(struct sk_buff *skb, const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
struct net *net = dev_net(skb->dev); struct net *net = dev_net(skb->dev);
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <net/pkt_cls.h> #include <net/pkt_cls.h>
#include <uapi/linux/tc_act/tc_ctinfo.h> #include <uapi/linux/tc_act/tc_ctinfo.h>
#include <net/tc_act/tc_ctinfo.h> #include <net/tc_act/tc_ctinfo.h>
#include <net/tc_wrapper.h>
#include <net/netfilter/nf_conntrack.h> #include <net/netfilter/nf_conntrack.h>
#include <net/netfilter/nf_conntrack_core.h> #include <net/netfilter/nf_conntrack_core.h>
...@@ -75,7 +76,8 @@ static void tcf_ctinfo_cpmark_set(struct nf_conn *ct, struct tcf_ctinfo *ca, ...@@ -75,7 +76,8 @@ static void tcf_ctinfo_cpmark_set(struct nf_conn *ct, struct tcf_ctinfo *ca,
skb->mark = READ_ONCE(ct->mark) & cp->cpmarkmask; skb->mark = READ_ONCE(ct->mark) & cp->cpmarkmask;
} }
static int tcf_ctinfo_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tcf_ctinfo_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
const struct nf_conntrack_tuple_hash *thash = NULL; const struct nf_conntrack_tuple_hash *thash = NULL;
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <net/pkt_cls.h> #include <net/pkt_cls.h>
#include <linux/tc_act/tc_gact.h> #include <linux/tc_act/tc_gact.h>
#include <net/tc_act/tc_gact.h> #include <net/tc_act/tc_gact.h>
#include <net/tc_wrapper.h>
static struct tc_action_ops act_gact_ops; static struct tc_action_ops act_gact_ops;
...@@ -145,7 +146,8 @@ static int tcf_gact_init(struct net *net, struct nlattr *nla, ...@@ -145,7 +146,8 @@ static int tcf_gact_init(struct net *net, struct nlattr *nla,
return err; return err;
} }
static int tcf_gact_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tcf_gact_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
struct tcf_gact *gact = to_gact(a); struct tcf_gact *gact = to_gact(a);
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <net/netlink.h> #include <net/netlink.h>
#include <net/pkt_cls.h> #include <net/pkt_cls.h>
#include <net/tc_act/tc_gate.h> #include <net/tc_act/tc_gate.h>
#include <net/tc_wrapper.h>
static struct tc_action_ops act_gate_ops; static struct tc_action_ops act_gate_ops;
...@@ -113,7 +114,8 @@ static enum hrtimer_restart gate_timer_func(struct hrtimer *timer) ...@@ -113,7 +114,8 @@ static enum hrtimer_restart gate_timer_func(struct hrtimer *timer)
return HRTIMER_RESTART; return HRTIMER_RESTART;
} }
static int tcf_gate_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tcf_gate_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
struct tcf_gate *gact = to_gate(a); struct tcf_gate *gact = to_gate(a);
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <net/tc_act/tc_ife.h> #include <net/tc_act/tc_ife.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <net/ife.h> #include <net/ife.h>
#include <net/tc_wrapper.h>
static int max_metacnt = IFE_META_MAX + 1; static int max_metacnt = IFE_META_MAX + 1;
static struct tc_action_ops act_ife_ops; static struct tc_action_ops act_ife_ops;
...@@ -861,7 +862,8 @@ static int tcf_ife_encode(struct sk_buff *skb, const struct tc_action *a, ...@@ -861,7 +862,8 @@ static int tcf_ife_encode(struct sk_buff *skb, const struct tc_action *a,
return action; return action;
} }
static int tcf_ife_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tcf_ife_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
struct tcf_ife_info *ife = to_ife(a); struct tcf_ife_info *ife = to_ife(a);
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <net/pkt_sched.h> #include <net/pkt_sched.h>
#include <linux/tc_act/tc_ipt.h> #include <linux/tc_act/tc_ipt.h>
#include <net/tc_act/tc_ipt.h> #include <net/tc_act/tc_ipt.h>
#include <net/tc_wrapper.h>
#include <linux/netfilter_ipv4/ip_tables.h> #include <linux/netfilter_ipv4/ip_tables.h>
...@@ -216,7 +217,8 @@ static int tcf_xt_init(struct net *net, struct nlattr *nla, ...@@ -216,7 +217,8 @@ static int tcf_xt_init(struct net *net, struct nlattr *nla,
a, &act_xt_ops, tp, flags); a, &act_xt_ops, tp, flags);
} }
static int tcf_ipt_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tcf_ipt_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
int ret = 0, result = 0; int ret = 0, result = 0;
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <net/pkt_cls.h> #include <net/pkt_cls.h>
#include <linux/tc_act/tc_mirred.h> #include <linux/tc_act/tc_mirred.h>
#include <net/tc_act/tc_mirred.h> #include <net/tc_act/tc_mirred.h>
#include <net/tc_wrapper.h>
static LIST_HEAD(mirred_list); static LIST_HEAD(mirred_list);
static DEFINE_SPINLOCK(mirred_list_lock); static DEFINE_SPINLOCK(mirred_list_lock);
...@@ -217,7 +218,8 @@ static int tcf_mirred_forward(bool want_ingress, struct sk_buff *skb) ...@@ -217,7 +218,8 @@ static int tcf_mirred_forward(bool want_ingress, struct sk_buff *skb)
return err; return err;
} }
static int tcf_mirred_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tcf_mirred_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
struct tcf_mirred *m = to_mirred(a); struct tcf_mirred *m = to_mirred(a);
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <net/pkt_sched.h> #include <net/pkt_sched.h>
#include <net/pkt_cls.h> #include <net/pkt_cls.h>
#include <net/tc_act/tc_mpls.h> #include <net/tc_act/tc_mpls.h>
#include <net/tc_wrapper.h>
static struct tc_action_ops act_mpls_ops; static struct tc_action_ops act_mpls_ops;
...@@ -49,7 +50,8 @@ static __be32 tcf_mpls_get_lse(struct mpls_shim_hdr *lse, ...@@ -49,7 +50,8 @@ static __be32 tcf_mpls_get_lse(struct mpls_shim_hdr *lse,
return cpu_to_be32(new_lse); return cpu_to_be32(new_lse);
} }
static int tcf_mpls_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tcf_mpls_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
struct tcf_mpls *m = to_mpls(a); struct tcf_mpls *m = to_mpls(a);
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#include <net/tc_act/tc_nat.h> #include <net/tc_act/tc_nat.h>
#include <net/tcp.h> #include <net/tcp.h>
#include <net/udp.h> #include <net/udp.h>
#include <net/tc_wrapper.h>
static struct tc_action_ops act_nat_ops; static struct tc_action_ops act_nat_ops;
...@@ -98,7 +98,8 @@ static int tcf_nat_init(struct net *net, struct nlattr *nla, struct nlattr *est, ...@@ -98,7 +98,8 @@ static int tcf_nat_init(struct net *net, struct nlattr *nla, struct nlattr *est,
return err; return err;
} }
static int tcf_nat_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tcf_nat_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
struct tcf_nat *p = to_tcf_nat(a); struct tcf_nat *p = to_tcf_nat(a);
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <net/tc_act/tc_pedit.h> #include <net/tc_act/tc_pedit.h>
#include <uapi/linux/tc_act/tc_pedit.h> #include <uapi/linux/tc_act/tc_pedit.h>
#include <net/pkt_cls.h> #include <net/pkt_cls.h>
#include <net/tc_wrapper.h>
static struct tc_action_ops act_pedit_ops; static struct tc_action_ops act_pedit_ops;
...@@ -319,7 +320,8 @@ static int pedit_skb_hdr_offset(struct sk_buff *skb, ...@@ -319,7 +320,8 @@ static int pedit_skb_hdr_offset(struct sk_buff *skb,
return ret; return ret;
} }
static int tcf_pedit_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tcf_pedit_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
struct tcf_pedit *p = to_pedit(a); struct tcf_pedit *p = to_pedit(a);
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <net/netlink.h> #include <net/netlink.h>
#include <net/pkt_cls.h> #include <net/pkt_cls.h>
#include <net/tc_act/tc_police.h> #include <net/tc_act/tc_police.h>
#include <net/tc_wrapper.h>
/* Each policer is serialized by its individual spinlock */ /* Each policer is serialized by its individual spinlock */
...@@ -242,7 +243,8 @@ static bool tcf_police_mtu_check(struct sk_buff *skb, u32 limit) ...@@ -242,7 +243,8 @@ static bool tcf_police_mtu_check(struct sk_buff *skb, u32 limit)
return len <= limit; return len <= limit;
} }
static int tcf_police_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tcf_police_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
struct tcf_police *police = to_police(a); struct tcf_police *police = to_police(a);
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <net/tc_act/tc_sample.h> #include <net/tc_act/tc_sample.h>
#include <net/psample.h> #include <net/psample.h>
#include <net/pkt_cls.h> #include <net/pkt_cls.h>
#include <net/tc_wrapper.h>
#include <linux/if_arp.h> #include <linux/if_arp.h>
...@@ -153,7 +154,8 @@ static bool tcf_sample_dev_ok_push(struct net_device *dev) ...@@ -153,7 +154,8 @@ static bool tcf_sample_dev_ok_push(struct net_device *dev)
} }
} }
static int tcf_sample_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tcf_sample_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
struct tcf_sample *s = to_sample(a); struct tcf_sample *s = to_sample(a);
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <net/netlink.h> #include <net/netlink.h>
#include <net/pkt_sched.h> #include <net/pkt_sched.h>
#include <net/pkt_cls.h> #include <net/pkt_cls.h>
#include <net/tc_wrapper.h>
#include <linux/tc_act/tc_defact.h> #include <linux/tc_act/tc_defact.h>
#include <net/tc_act/tc_defact.h> #include <net/tc_act/tc_defact.h>
...@@ -21,7 +22,8 @@ ...@@ -21,7 +22,8 @@
static struct tc_action_ops act_simp_ops; static struct tc_action_ops act_simp_ops;
#define SIMP_MAX_DATA 32 #define SIMP_MAX_DATA 32
static int tcf_simp_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tcf_simp_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
struct tcf_defact *d = to_defact(a); struct tcf_defact *d = to_defact(a);
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <net/ipv6.h> #include <net/ipv6.h>
#include <net/dsfield.h> #include <net/dsfield.h>
#include <net/pkt_cls.h> #include <net/pkt_cls.h>
#include <net/tc_wrapper.h>
#include <linux/tc_act/tc_skbedit.h> #include <linux/tc_act/tc_skbedit.h>
#include <net/tc_act/tc_skbedit.h> #include <net/tc_act/tc_skbedit.h>
...@@ -36,7 +37,8 @@ static u16 tcf_skbedit_hash(struct tcf_skbedit_params *params, ...@@ -36,7 +37,8 @@ static u16 tcf_skbedit_hash(struct tcf_skbedit_params *params,
return netdev_cap_txqueue(skb->dev, queue_mapping); return netdev_cap_txqueue(skb->dev, queue_mapping);
} }
static int tcf_skbedit_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tcf_skbedit_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
struct tcf_skbedit *d = to_skbedit(a); struct tcf_skbedit *d = to_skbedit(a);
......
...@@ -15,13 +15,15 @@ ...@@ -15,13 +15,15 @@
#include <net/netlink.h> #include <net/netlink.h>
#include <net/pkt_sched.h> #include <net/pkt_sched.h>
#include <net/pkt_cls.h> #include <net/pkt_cls.h>
#include <net/tc_wrapper.h>
#include <linux/tc_act/tc_skbmod.h> #include <linux/tc_act/tc_skbmod.h>
#include <net/tc_act/tc_skbmod.h> #include <net/tc_act/tc_skbmod.h>
static struct tc_action_ops act_skbmod_ops; static struct tc_action_ops act_skbmod_ops;
static int tcf_skbmod_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tcf_skbmod_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
struct tcf_skbmod *d = to_skbmod(a); struct tcf_skbmod *d = to_skbmod(a);
......
...@@ -16,13 +16,15 @@ ...@@ -16,13 +16,15 @@
#include <net/pkt_sched.h> #include <net/pkt_sched.h>
#include <net/dst.h> #include <net/dst.h>
#include <net/pkt_cls.h> #include <net/pkt_cls.h>
#include <net/tc_wrapper.h>
#include <linux/tc_act/tc_tunnel_key.h> #include <linux/tc_act/tc_tunnel_key.h>
#include <net/tc_act/tc_tunnel_key.h> #include <net/tc_act/tc_tunnel_key.h>
static struct tc_action_ops act_tunnel_key_ops; static struct tc_action_ops act_tunnel_key_ops;
static int tunnel_key_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tunnel_key_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
struct tcf_tunnel_key *t = to_tunnel_key(a); struct tcf_tunnel_key *t = to_tunnel_key(a);
......
...@@ -12,13 +12,15 @@ ...@@ -12,13 +12,15 @@
#include <net/netlink.h> #include <net/netlink.h>
#include <net/pkt_sched.h> #include <net/pkt_sched.h>
#include <net/pkt_cls.h> #include <net/pkt_cls.h>
#include <net/tc_wrapper.h>
#include <linux/tc_act/tc_vlan.h> #include <linux/tc_act/tc_vlan.h>
#include <net/tc_act/tc_vlan.h> #include <net/tc_act/tc_vlan.h>
static struct tc_action_ops act_vlan_ops; static struct tc_action_ops act_vlan_ops;
static int tcf_vlan_act(struct sk_buff *skb, const struct tc_action *a, TC_INDIRECT_SCOPE int tcf_vlan_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res) struct tcf_result *res)
{ {
struct tcf_vlan *v = to_vlan(a); struct tcf_vlan *v = to_vlan(a);
......
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