net: tc_skbedit: Make the skbedit priority offloadable
authorPetr Machata <petrm@mellanox.com>
Thu, 19 Mar 2020 13:47:21 +0000 (15:47 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 20 Mar 2020 04:09:19 +0000 (21:09 -0700)
The skbedit action "priority" is used for adjusting SKB priority. Allow
drivers to offload the action by introducing two new skbedit getters and a
new flow action, and initializing appropriately in tc_setup_flow_action().

Signed-off-by: Petr Machata <petrm@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/flow_offload.h
include/net/tc_act/tc_skbedit.h
net/sched/cls_api.c

index 1e30b0d..51b9893 100644 (file)
@@ -137,6 +137,7 @@ enum flow_action_id {
        FLOW_ACTION_CSUM,
        FLOW_ACTION_MARK,
        FLOW_ACTION_PTYPE,
+       FLOW_ACTION_PRIORITY,
        FLOW_ACTION_WAKE,
        FLOW_ACTION_QUEUE,
        FLOW_ACTION_SAMPLE,
@@ -211,6 +212,7 @@ struct flow_action_entry {
                u32                     csum_flags;     /* FLOW_ACTION_CSUM */
                u32                     mark;           /* FLOW_ACTION_MARK */
                u16                     ptype;          /* FLOW_ACTION_PTYPE */
+               u32                     priority;       /* FLOW_ACTION_PRIORITY */
                struct {                                /* FLOW_ACTION_QUEUE */
                        u32             ctx;
                        u32             index;
index ac8ff60..00bfee7 100644 (file)
@@ -77,4 +77,21 @@ static inline u32 tcf_skbedit_ptype(const struct tc_action *a)
        return ptype;
 }
 
+/* Return true iff action is priority */
+static inline bool is_tcf_skbedit_priority(const struct tc_action *a)
+{
+       return is_tcf_skbedit_with_flag(a, SKBEDIT_F_PRIORITY);
+}
+
+static inline u32 tcf_skbedit_priority(const struct tc_action *a)
+{
+       u32 priority;
+
+       rcu_read_lock();
+       priority = rcu_dereference(to_skbedit(a)->params)->priority;
+       rcu_read_unlock();
+
+       return priority;
+}
+
 #endif /* __NET_TC_SKBEDIT_H */
index eefacb3..fb6c366 100644 (file)
@@ -3665,6 +3665,9 @@ int tc_setup_flow_action(struct flow_action *flow_action,
                } else if (is_tcf_skbedit_ptype(act)) {
                        entry->id = FLOW_ACTION_PTYPE;
                        entry->ptype = tcf_skbedit_ptype(act);
+               } else if (is_tcf_skbedit_priority(act)) {
+                       entry->id = FLOW_ACTION_PRIORITY;
+                       entry->priority = tcf_skbedit_priority(act);
                } else {
                        err = -EOPNOTSUPP;
                        goto err_out_locked;