summaryrefslogtreecommitdiff
path: root/net/sched/act_api.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2022-09-09 10:24:43 +0300
committerDavid S. Miller <davem@davemloft.net>2022-09-09 10:24:43 +0300
commit34df6a8a50aa72c4ac4fd65033a2798fc321adf8 (patch)
tree0d488fb3dfe110208028de199280cd09c9c91667 /net/sched/act_api.c
parentdd14043af7b86238a4dc3280acf635eb43ea9851 (diff)
parent6d13a65d2a674c1cf4e70863394c01e4d07372e8 (diff)
downloadlinux-34df6a8a50aa72c4ac4fd65033a2798fc321adf8.tar.xz
Merge branch 'tc_action_ops-refactor'
Zhengchao Shao says: ==================== net: refactor the walk and lookup hook functions in tc_action_ops The implementation logic of the walk/lookup hook function in each action module is the same. Therefore, the two functions can be reconstructed. When registering tc_action_ops of each action module, the corresponding net_id is saved to tc_action_ops. In this way, the net_id of the corresponding module can be directly obtained in act_api without executing the specific walk and lookup hook functions. Then, generic functions can be added to replace the walk and lookup hook functions of each action module. Last, modify each action module in alphabetical order. Reserve the walk and lookup interfaces and delete them when they are no longer used. This patchset has been tested by using TDC, and I will add selftest in other patchset. Last, thanks to Jamal Hadi Salim and Cong Wang for their advice. --- v3: remove hole from the structure tc_action_ops v2: save the net_id of each TC action module to the tc_action_ops structure ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/act_api.c')
-rw-r--r--net/sched/act_api.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/net/sched/act_api.c b/net/sched/act_api.c
index 817065aa2833..9b31a10cc639 100644
--- a/net/sched/act_api.c
+++ b/net/sched/act_api.c
@@ -676,6 +676,31 @@ int tcf_idr_search(struct tc_action_net *tn, struct tc_action **a, u32 index)
}
EXPORT_SYMBOL(tcf_idr_search);
+static int __tcf_generic_walker(struct net *net, struct sk_buff *skb,
+ struct netlink_callback *cb, int type,
+ const struct tc_action_ops *ops,
+ struct netlink_ext_ack *extack)
+{
+ struct tc_action_net *tn = net_generic(net, ops->net_id);
+
+ if (unlikely(ops->walk))
+ return ops->walk(net, skb, cb, type, ops, extack);
+
+ return tcf_generic_walker(tn, skb, cb, type, ops, extack);
+}
+
+static int __tcf_idr_search(struct net *net,
+ const struct tc_action_ops *ops,
+ struct tc_action **a, u32 index)
+{
+ struct tc_action_net *tn = net_generic(net, ops->net_id);
+
+ if (unlikely(ops->lookup))
+ return ops->lookup(net, a, index);
+
+ return tcf_idr_search(tn, a, index);
+}
+
static int tcf_idr_delete_index(struct tcf_idrinfo *idrinfo, u32 index)
{
struct tc_action *p;
@@ -926,7 +951,7 @@ int tcf_register_action(struct tc_action_ops *act,
struct tc_action_ops *a;
int ret;
- if (!act->act || !act->dump || !act->init || !act->walk || !act->lookup)
+ if (!act->act || !act->dump || !act->init)
return -EINVAL;
/* We have to register pernet ops before making the action ops visible,
@@ -1638,7 +1663,7 @@ static struct tc_action *tcf_action_get_1(struct net *net, struct nlattr *nla,
goto err_out;
}
err = -ENOENT;
- if (ops->lookup(net, &a, index) == 0) {
+ if (__tcf_idr_search(net, ops, &a, index) == 0) {
NL_SET_ERR_MSG(extack, "TC action with specified index not found");
goto err_mod;
}
@@ -1703,7 +1728,7 @@ static int tca_action_flush(struct net *net, struct nlattr *nla,
goto out_module_put;
}
- err = ops->walk(net, skb, &dcb, RTM_DELACTION, ops, extack);
+ err = __tcf_generic_walker(net, skb, &dcb, RTM_DELACTION, ops, extack);
if (err <= 0) {
nla_nest_cancel(skb, nest);
goto out_module_put;
@@ -2121,7 +2146,7 @@ static int tc_dump_action(struct sk_buff *skb, struct netlink_callback *cb)
if (nest == NULL)
goto out_module_put;
- ret = a_o->walk(net, skb, cb, RTM_GETACTION, a_o, NULL);
+ ret = __tcf_generic_walker(net, skb, cb, RTM_GETACTION, a_o, NULL);
if (ret < 0)
goto out_module_put;