From mboxrd@z Thu Jan 1 00:00:00 1970 From: Cong Wang Subject: [Patch net-next] net_sched: call qdisc_reset() with qdisc lock Date: Thu, 21 Dec 2017 16:03:29 -0800 Message-ID: <20171222000330.29009-1-xiyou.wangcong@gmail.com> Cc: jakub.kicinski@netronome.com, Cong Wang , John Fastabend To: netdev@vger.kernel.org Return-path: Received: from mail-pg0-f67.google.com ([74.125.83.67]:40119 "EHLO mail-pg0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752500AbdLVADk (ORCPT ); Thu, 21 Dec 2017 19:03:40 -0500 Received: by mail-pg0-f67.google.com with SMTP id k15so13863851pgr.7 for ; Thu, 21 Dec 2017 16:03:40 -0800 (PST) Sender: netdev-owner@vger.kernel.org List-ID: qdisc_reset() should always be called with qdisc spinlock and with BH disabled, otherwise qdisc ->reset() could race with TX BH. Fixes: 7bbde83b1860 ("net: sched: drop qdisc_reset from dev_graft_qdisc") Reported-by: Jakub Kicinski Cc: John Fastabend Signed-off-by: Cong Wang --- net/sched/sch_generic.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 10aaa3b615ce..00ddb5f8f430 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c @@ -1097,8 +1097,11 @@ static void dev_qdisc_reset(struct net_device *dev, { struct Qdisc *qdisc = dev_queue->qdisc_sleeping; - if (qdisc) + if (qdisc) { + spin_lock_bh(qdisc_lock(qdisc)); qdisc_reset(qdisc); + spin_unlock_bh(qdisc_lock(qdisc)); + } } /** -- 2.13.0