|
@@ -1630,6 +1630,22 @@ int call_netdevice_notifiers(unsigned long val, struct net_device *dev)
|
|
|
}
|
|
|
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
|
|
@@ -3547,7 +3563,7 @@ static inline struct sk_buff *handle_ing(struct sk_buff *skb,
|
|
|
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);
|
|
@@ -3561,8 +3577,6 @@ static inline struct sk_buff *handle_ing(struct sk_buff *skb,
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
-out:
|
|
|
- skb->tc_verd = 0;
|
|
|
return skb;
|
|
|
}
|
|
|
#endif
|
|
@@ -3698,12 +3712,15 @@ another_round:
|
|
|
|
|
|
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;
|
|
|
|