net_sched: refactor TC action init API
TC action ->init() API has 10 parameters, it becomes harder to read. Some of them are just boolean and can be replaced by flags. Similarly for the internal API tcf_action_init() and tcf_exts_validate(). This patch converts them to flags and fold them into the upper 16 bits of "flags", whose lower 16 bits are still reserved for user-space. More specifically, the following kernel flags are introduced: TCA_ACT_FLAGS_POLICE replace 'name' in a few contexts, to distinguish whether it is compatible with policer. TCA_ACT_FLAGS_BIND replaces 'bind', to indicate whether this action is bound to a filter. TCA_ACT_FLAGS_REPLACE replaces 'ovr' in most contexts, means we are replacing an existing action. TCA_ACT_FLAGS_NO_RTNL replaces 'rtnl_held' but has the opposite meaning, because we still hold RTNL in most cases. The only user-space flag TCA_ACT_FLAGS_NO_PERCPU_STATS is untouched and still stored as before. I have tested this patch with tdc and I do not see any failure related to this patch. Tested-by: Vlad Buslov <vladbu@nvidia.com> Acked-by: Jamal Hadi Salim<jhs@mojatatu.com> Cc: Jiri Pirko <jiri@resnulli.us> Signed-off-by: Cong Wang <cong.wang@bytedance.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
451395f798
commit
695176bfe5
@@ -58,6 +58,14 @@ struct tc_action {
|
||||
#define TCA_ACT_HW_STATS_ANY (TCA_ACT_HW_STATS_IMMEDIATE | \
|
||||
TCA_ACT_HW_STATS_DELAYED)
|
||||
|
||||
/* Reserve 16 bits for user-space. See TCA_ACT_FLAGS_NO_PERCPU_STATS. */
|
||||
#define TCA_ACT_FLAGS_USER_BITS 16
|
||||
#define TCA_ACT_FLAGS_USER_MASK 0xffff
|
||||
#define TCA_ACT_FLAGS_POLICE (1U << TCA_ACT_FLAGS_USER_BITS)
|
||||
#define TCA_ACT_FLAGS_BIND (1U << (TCA_ACT_FLAGS_USER_BITS + 1))
|
||||
#define TCA_ACT_FLAGS_REPLACE (1U << (TCA_ACT_FLAGS_USER_BITS + 2))
|
||||
#define TCA_ACT_FLAGS_NO_RTNL (1U << (TCA_ACT_FLAGS_USER_BITS + 3))
|
||||
|
||||
/* Update lastuse only if needed, to avoid dirtying a cache line.
|
||||
* We use a temp variable to avoid fetching jiffies twice.
|
||||
*/
|
||||
@@ -99,8 +107,8 @@ struct tc_action_ops {
|
||||
void (*cleanup)(struct tc_action *);
|
||||
int (*lookup)(struct net *net, struct tc_action **a, u32 index);
|
||||
int (*init)(struct net *net, struct nlattr *nla,
|
||||
struct nlattr *est, struct tc_action **act, int ovr,
|
||||
int bind, bool rtnl_held, struct tcf_proto *tp,
|
||||
struct nlattr *est, struct tc_action **act,
|
||||
struct tcf_proto *tp,
|
||||
u32 flags, struct netlink_ext_ack *extack);
|
||||
int (*walk)(struct net *, struct sk_buff *,
|
||||
struct netlink_callback *, int,
|
||||
@@ -179,18 +187,16 @@ int tcf_action_destroy(struct tc_action *actions[], int bind);
|
||||
int tcf_action_exec(struct sk_buff *skb, struct tc_action **actions,
|
||||
int nr_actions, struct tcf_result *res);
|
||||
int tcf_action_init(struct net *net, struct tcf_proto *tp, struct nlattr *nla,
|
||||
struct nlattr *est, char *name, int ovr, int bind,
|
||||
struct nlattr *est,
|
||||
struct tc_action *actions[], int init_res[], size_t *attr_size,
|
||||
bool rtnl_held, struct netlink_ext_ack *extack);
|
||||
struct tc_action_ops *tc_action_load_ops(char *name, struct nlattr *nla,
|
||||
u32 flags, struct netlink_ext_ack *extack);
|
||||
struct tc_action_ops *tc_action_load_ops(struct nlattr *nla, bool police,
|
||||
bool rtnl_held,
|
||||
struct netlink_ext_ack *extack);
|
||||
struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp,
|
||||
struct nlattr *nla, struct nlattr *est,
|
||||
char *name, int ovr, int bind,
|
||||
struct tc_action_ops *a_o, int *init_res,
|
||||
bool rtnl_held,
|
||||
struct netlink_ext_ack *extack);
|
||||
u32 flags, struct netlink_ext_ack *extack);
|
||||
int tcf_action_dump(struct sk_buff *skb, struct tc_action *actions[], int bind,
|
||||
int ref, bool terse);
|
||||
int tcf_action_dump_old(struct sk_buff *skb, struct tc_action *a, int, int);
|
||||
|
||||
Reference in New Issue
Block a user