net-tc: extract skip classify bit from tc_verd
authorWillem de Bruijn <willemb@google.com>
Sat, 7 Jan 2017 22:06:35 +0000 (17:06 -0500)
committerDavid S. Miller <davem@davemloft.net>
Mon, 9 Jan 2017 01:58:52 +0000 (20:58 -0500)
Packets sent by the IFB device skip subsequent tc classification.
A single bit governs this state. Move it out of tc_verd in
anticipation of removing that __u16 completely.

The new bitfield tc_skip_classify temporarily uses one bit of a
hole, until tc_verd is removed completely in a follow-up patch.

Remove the bit hole comment. It could be 2, 3, 4 or 5 bits long.
With that many options, little value in documenting it.

Introduce a helper function to deduplicate the logic in the two
sites that check this bit.

The field tc_skip_classify is set only in IFB on skbs cloned in
act_mirred, so original packet sources do not have to clear the
bit when reusing packets (notably, pktgen and octeon).

Signed-off-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ifb.c
include/linux/skbuff.h
include/net/sch_generic.h
include/uapi/linux/pkt_cls.h
net/core/dev.c
net/sched/act_api.c

index 082534e187fcf36c0f16d5e7ee1ecb4d03d1a672..442c4c4a9606f4a918cbff19aab687a9fc3846da 100644 (file)
@@ -81,7 +81,7 @@ static void ifb_ri_tasklet(unsigned long _txp)
                u32 from = G_TC_FROM(skb->tc_verd);
 
                skb->tc_verd = 0;
-               skb->tc_verd = SET_TC_NCLS(skb->tc_verd);
+               skb->tc_skip_classify = 1;
 
                u64_stats_update_begin(&txp->tsync);
                txp->tx_packets++;
index b53c0cfd417e3bec1c5cfab76787901bafa5884c..570f60ec6cb4a1bfbfbc9cd3c179ca13a359fb7b 100644 (file)
@@ -589,6 +589,7 @@ static inline bool skb_mstamp_after(const struct skb_mstamp *t1,
  *     @pkt_type: Packet class
  *     @fclone: skbuff clone status
  *     @ipvs_property: skbuff is owned by ipvs
+ *     @tc_skip_classify: do not classify packet. set by IFB device
  *     @peeked: this packet has been seen already, so stats have been
  *             done for it, don't do them again
  *     @nf_trace: netfilter packet trace flag
@@ -749,7 +750,9 @@ struct sk_buff {
 #ifdef CONFIG_NET_SWITCHDEV
        __u8                    offload_fwd_mark:1;
 #endif
-       /* 2, 4 or 5 bit hole */
+#ifdef CONFIG_NET_CLS_ACT
+       __u8                    tc_skip_classify:1;
+#endif
 
 #ifdef CONFIG_NET_SCHED
        __u16                   tc_index;       /* traffic control index */
index 498f81b229a4565e140f1a054ce931e80361e8b2..857356f2d74b7a6872e52fabe12069151b475597 100644 (file)
@@ -418,6 +418,17 @@ static inline bool skb_at_tc_ingress(const struct sk_buff *skb)
 #endif
 }
 
+static inline bool skb_skip_tc_classify(struct sk_buff *skb)
+{
+#ifdef CONFIG_NET_CLS_ACT
+       if (skb->tc_skip_classify) {
+               skb->tc_skip_classify = 0;
+               return true;
+       }
+#endif
+       return false;
+}
+
 /* Reset all TX qdiscs greater then index of a device.  */
 static inline void qdisc_reset_all_tx_gt(struct net_device *dev, unsigned int i)
 {
index bba23dbb3ab60be86ed7b68a7c8913a54f77c00f..1eed5d7509bcdd18a9c31961d02cbb3e38e57d13 100644 (file)
@@ -22,8 +22,6 @@ bit 6,7: Where this packet was last seen
 1: on the Ingress
 2: on the Egress
 
-bit 8: when set --> Request not to classify on ingress. 
-
  *
  * */
 
@@ -36,10 +34,6 @@ bit 8: when set --> Request not to classify on ingress.
 #define AT_INGRESS     0x1
 #define AT_EGRESS      0x2
 
-#define TC_NCLS          _TC_MAKEMASK1(8)
-#define SET_TC_NCLS(v)   ( TC_NCLS | (v & ~TC_NCLS))
-#define CLR_TC_NCLS(v)   ( v & ~TC_NCLS)
-
 #define S_TC_AT          _TC_MAKE32(12)
 #define M_TC_AT          _TC_MAKEMASK(2,S_TC_AT)
 #define G_TC_AT(x)       _TC_GETVALUE(x,S_TC_AT,M_TC_AT)
index 56818f7eab2be7f2e5c632b135f2e4e49f7e2c63..e39e35d2e082b863c1d123be70695ec9e89d753f 100644 (file)
@@ -4093,12 +4093,8 @@ another_round:
                        goto out;
        }
 
-#ifdef CONFIG_NET_CLS_ACT
-       if (skb->tc_verd & TC_NCLS) {
-               skb->tc_verd = CLR_TC_NCLS(skb->tc_verd);
-               goto ncls;
-       }
-#endif
+       if (skb_skip_tc_classify(skb))
+               goto skip_classify;
 
        if (pfmemalloc)
                goto skip_taps;
@@ -4128,8 +4124,8 @@ skip_taps:
 #endif
 #ifdef CONFIG_NET_CLS_ACT
        skb->tc_verd = 0;
-ncls:
 #endif
+skip_classify:
        if (pfmemalloc && !skb_pfmemalloc_protocol(skb))
                goto drop;
 
index 2095c83ce7730d49550103a8efad943d28815617..f04715a57300cc3e5ffc441ccac247ac0942e8ad 100644 (file)
@@ -426,11 +426,9 @@ int tcf_action_exec(struct sk_buff *skb, struct tc_action **actions,
 {
        int ret = -1, i;
 
-       if (skb->tc_verd & TC_NCLS) {
-               skb->tc_verd = CLR_TC_NCLS(skb->tc_verd);
-               ret = TC_ACT_OK;
-               goto exec_done;
-       }
+       if (skb_skip_tc_classify(skb))
+               return TC_ACT_OK;
+
        for (i = 0; i < nr_actions; i++) {
                const struct tc_action *a = actions[i];
 
@@ -439,9 +437,8 @@ repeat:
                if (ret == TC_ACT_REPEAT)
                        goto repeat;    /* we need a ttl - JHS */
                if (ret != TC_ACT_PIPE)
-                       goto exec_done;
+                       break;
        }
-exec_done:
        return ret;
 }
 EXPORT_SYMBOL(tcf_action_exec);