net: sched: refactor reinsert action
authorJohn Hurley <john.hurley@netronome.com>
Mon, 24 Jun 2019 22:13:35 +0000 (23:13 +0100)
committerDavid S. Miller <davem@davemloft.net>
Fri, 28 Jun 2019 21:36:25 +0000 (14:36 -0700)
The TC_ACT_REINSERT return type was added as an in-kernel only option to
allow a packet ingress or egress redirect. This is used to avoid
unnecessary skb clones in situations where they are not required. If a TC
hook returns this code then the packet is 'reinserted' and no skb consume
is carried out as no clone took place.

This return type is only used in act_mirred. Rather than have the reinsert
called from the main datapath, call it directly in act_mirred. Instead of
returning TC_ACT_REINSERT, change the type to the new TC_ACT_CONSUMED
which tells the caller that the packet has been stolen by another process
and that no consume call is required.

Moving all redirect calls to the act_mirred code is in preparation for
tracking recursion created by act_mirred.

Signed-off-by: John Hurley <john.hurley@netronome.com>
Reviewed-by: Simon Horman <simon.horman@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/pkt_cls.h
include/net/sch_generic.h
net/core/dev.c
net/sched/act_mirred.c

index 720f2b32fc2f31f1ca0c182afd134540357c7d2d..1a7596ba0dbef870fdc3fd802f73ea60b7ee9fed 100644 (file)
@@ -10,7 +10,7 @@
 #include <net/net_namespace.h>
 
 /* TC action not accessible from user space */
-#define TC_ACT_REINSERT                (TC_ACT_VALUE_MAX + 1)
+#define TC_ACT_CONSUMED                (TC_ACT_VALUE_MAX + 1)
 
 /* Basic packet classifier frontend definitions. */
 
index 21f434f3ac9e34a9a00eb40e490481757b10f660..855167bbc3729940f7b44f533a13b0fdb00e558f 100644 (file)
@@ -279,7 +279,7 @@ struct tcf_result {
                };
                const struct tcf_proto *goto_tp;
 
-               /* used by the TC_ACT_REINSERT action */
+               /* used in the skb_tc_reinsert function */
                struct {
                        bool            ingress;
                        struct gnet_stats_queue *qstats;
index d6edd218babdde1ee35da7c0823ddf90dd5ba7cb..58529318b3a947b079153c0aec65d8740563295d 100644 (file)
@@ -4689,9 +4689,7 @@ sch_handle_ingress(struct sk_buff *skb, struct packet_type **pt_prev, int *ret,
                __skb_push(skb, skb->mac_len);
                skb_do_redirect(skb);
                return NULL;
-       case TC_ACT_REINSERT:
-               /* this does not scrub the packet, and updates stats on error */
-               skb_tc_reinsert(skb, &cl_res);
+       case TC_ACT_CONSUMED:
                return NULL;
        default:
                break;
index 58e7573dded4f32537954f3586d442964c980fff..8c1d73661cc4a8993e46175789b8cdb414bf4489 100644 (file)
@@ -277,7 +277,8 @@ static int tcf_mirred_act(struct sk_buff *skb, const struct tc_action *a,
                if (use_reinsert) {
                        res->ingress = want_ingress;
                        res->qstats = this_cpu_ptr(m->common.cpu_qstats);
-                       return TC_ACT_REINSERT;
+                       skb_tc_reinsert(skb, res);
+                       return TC_ACT_CONSUMED;
                }
        }