diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h index 9092e697059e..5a03cded3054 100644 --- a/include/net/pkt_sched.h +++ b/include/net/pkt_sched.h @@ -123,7 +123,7 @@ bool sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q, void __qdisc_run(struct Qdisc *q); -static inline void qdisc_run(struct Qdisc *q) +static inline bool qdisc_run(struct Qdisc *q) { if (qdisc_run_begin(q)) { /* NOLOCK qdisc must check 'state' under the qdisc seqlock @@ -133,7 +133,9 @@ static inline void qdisc_run(struct Qdisc *q) likely(!test_bit(__QDISC_STATE_DEACTIVATED, &q->state))) __qdisc_run(q); qdisc_run_end(q); + return true; } + return false; } static inline __be16 tc_skb_protocol(const struct sk_buff *skb) diff --git a/net/core/dev.c b/net/core/dev.c index 90b59fc50dc9..c7e48356132a 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3744,7 +3744,8 @@ static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q, if (q->flags & TCQ_F_NOLOCK) { rc = q->enqueue(skb, q, &to_free) & NET_XMIT_MASK; - qdisc_run(q); + if (!qdisc_run(q) && rc == NET_XMIT_SUCCESS) + __netif_schedule(q); if (unlikely(to_free)) kfree_skb_list(to_free);