return rtnl_dereference(dev->ingress_queue);
 }
 
-extern struct netdev_queue *dev_ingress_queue_create(struct net_device *dev);
+struct netdev_queue *dev_ingress_queue_create(struct net_device *dev);
+
+#ifdef CONFIG_NET_CLS_ACT
+void net_inc_ingress_queue(void);
+void net_dec_ingress_queue(void);
+#else
+static inline void net_inc_ingress_queue(void)
+{
+}
+
+static inline void net_dec_ingress_queue(void)
+{
+}
+#endif
 
 extern void rtnetlink_init(void);
 extern void __rtnl_unlock(void);
 
 }
 EXPORT_SYMBOL(call_netdevice_notifiers);
 
+#ifdef CONFIG_NET_CLS_ACT
+static struct static_key ingress_needed __read_mostly;
+
+void net_inc_ingress_queue(void)
+{
+       static_key_slow_inc(&ingress_needed);
+}
+EXPORT_SYMBOL_GPL(net_inc_ingress_queue);
+
+void net_dec_ingress_queue(void)
+{
+       static_key_slow_dec(&ingress_needed);
+}
+EXPORT_SYMBOL_GPL(net_dec_ingress_queue);
+#endif
+
 static struct static_key netstamp_needed __read_mostly;
 #ifdef HAVE_JUMP_LABEL
 /* We are not allowed to call static_key_slow_dec() from irq context
        struct netdev_queue *rxq = rcu_dereference(skb->dev->ingress_queue);
 
        if (!rxq || rcu_access_pointer(rxq->qdisc) == &noop_qdisc)
-               goto out;
+               return skb;
 
        if (*pt_prev) {
                *ret = deliver_skb(skb, *pt_prev, orig_dev);
                return NULL;
        }
 
-out:
-       skb->tc_verd = 0;
        return skb;
 }
 #endif
 
 skip_taps:
 #ifdef CONFIG_NET_CLS_ACT
-       skb = handle_ing(skb, &pt_prev, &ret, orig_dev);
-       if (!skb)
-               goto unlock;
+       if (static_key_false(&ingress_needed)) {
+               skb = handle_ing(skb, &pt_prev, &ret, orig_dev);
+               if (!skb)
+                       goto unlock;
+       }
+
+       skb->tc_verd = 0;
 ncls:
 #endif
-
        if (pfmemalloc && !skb_pfmemalloc_protocol(skb))
                goto drop;
 
 
 
 /* ------------------------------------------------------------- */
 
+static int ingress_init(struct Qdisc *sch, struct nlattr *opt)
+{
+       net_inc_ingress_queue();
+
+       return 0;
+}
+
 static void ingress_destroy(struct Qdisc *sch)
 {
        struct ingress_qdisc_data *p = qdisc_priv(sch);
 
        tcf_destroy_chain(&p->filter_list);
+       net_dec_ingress_queue();
 }
 
 static int ingress_dump(struct Qdisc *sch, struct sk_buff *skb)
        .id             =       "ingress",
        .priv_size      =       sizeof(struct ingress_qdisc_data),
        .enqueue        =       ingress_enqueue,
+       .init           =       ingress_init,
        .destroy        =       ingress_destroy,
        .dump           =       ingress_dump,
        .owner          =       THIS_MODULE,