Received: by 2002:ad5:4acb:0:0:0:0:0 with SMTP id n11csp3753041imw; Mon, 18 Jul 2022 13:57:38 -0700 (PDT) X-Google-Smtp-Source: AGRyM1tCguSCWgi5kzdNPpZWZ84T1DEUpno2t9fpJa1Wzppm4I5LWigSp7w/2BRu8RfzJeLZs/xG X-Received: by 2002:a05:6402:2cd:b0:43a:70f7:1af2 with SMTP id b13-20020a05640202cd00b0043a70f71af2mr39455186edx.357.1658177858522; Mon, 18 Jul 2022 13:57:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1658177858; cv=none; d=google.com; s=arc-20160816; b=xj6iMhpoQs4sefQ/7Du2MTNno6rmsn8EkT3lclX/rm450FmU8lJK8Xg/Qb+i5G0KBU BI0l/MlAh3zEmv/PJowR7oXMr2uwUKAcLSuF0uW+9XM00a9uNqeI7g4U+vw8L2gwx5Nd ah9cvpXTntbst5gLrz9KwtuqRizaDK+uMz9TOrXqzXlnKSvNI3YYUNzu8OYljAiqVv5q lqzXer42aSe1jU+obrrRx8nTmzZrOavC/R4eIBCviePoUoFLKaghcYNYoJ8oSRQVAbAW N2iDRO3EqAql+0YtnzpWSBfzJC8XZg96w3EV7yCFXBnrtiwbgsieUUefJjB8WDJzM3sr hNDA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:message-id:date:subject:cc:to:from; bh=/awS/rH49q2/UN8dXRT7sg2stJQKrk9+Sx8DfU1COWQ=; b=tr15sYK8MLALXuCw65MN3L8u1PhUISp8bQZbyISL2jU9y20jr860sKTAFh7Ll8FgVc IQ+h3yrJNE/xA0QKHq6PoS5r26Mt5MONVKv2N9MyRhIxPMQK+ZLGFY6SC5y1XXbM2DVD h7MdxDkgPWYc5+me9Px+gVXnfbPdsHRrVR9daYV3QgGbWTnfNBBzsi4iAHyQjDSIboGy R4vJ0D1QwCKV9dzNa8nZ1J4kV645AXzzxhTxOpuZhoHYXCySZvDZq6AWc9RaissfPeob sVpHJkK79pbY4q2pO6J9KlZyq/V9l4ajZvYZwQgxo1Xj5VDE7zAHHLE45d8nk0ciQo7e eMqg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id nb36-20020a1709071ca400b007262c51b07dsi11579572ejc.724.2022.07.18.13.57.22; Mon, 18 Jul 2022 13:57:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mediatek.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235141AbiGRUw1 (ORCPT + 65 others); Mon, 18 Jul 2022 16:52:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52888 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235067AbiGRUwZ (ORCPT ); Mon, 18 Jul 2022 16:52:25 -0400 Received: from mailgw02.mediatek.com (unknown [210.61.82.184]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 70850326DB for ; Mon, 18 Jul 2022 13:52:24 -0700 (PDT) X-UUID: 622ecece87204d259fac9b3424429de0-20220719 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.8,REQID:a382244a-9818-4005-8a2d-01634ffa64b0,OB:0,LO B:0,IP:0,URL:5,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,RULE:Release_Ham,ACTI ON:release,TS:5 X-CID-META: VersionHash:0f94e32,CLOUDID:e94d9e64-0b3f-4b2c-b3a6-ed5c044366a0,C OID:IGNORED,Recheck:0,SF:nil,TC:nil,Content:0,EDM:-3,IP:nil,URL:1,File:nil ,QS:nil,BEC:nil,COL:0 X-UUID: 622ecece87204d259fac9b3424429de0-20220719 Received: from mtkmbs10n2.mediatek.inc [(172.21.101.183)] by mailgw02.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 1145465249; Tue, 19 Jul 2022 04:52:19 +0800 Received: from mtkmbs11n2.mediatek.inc (172.21.101.187) by mtkmbs11n1.mediatek.inc (172.21.101.185) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.792.3; Tue, 19 Jul 2022 04:52:17 +0800 Received: from mtkswgap22.mediatek.inc (172.21.77.33) by mtkmbs11n2.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.792.3 via Frontend Transport; Tue, 19 Jul 2022 04:52:17 +0800 From: To: , CC: , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH 1/3] mt76: mt7921s: fix the deadlock caused by sdio->stat_work Date: Tue, 19 Jul 2022 04:52:13 +0800 Message-ID: X-Mailer: git-send-email 1.7.9.5 MIME-Version: 1.0 Content-Type: text/plain X-MTK: N X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RCVD_IN_MSPIKE_H2, SPF_HELO_PASS,SPF_PASS,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org From: Sean Wang Because wake_work and sdio->stat_work share the same workqueue mt76->wq, if sdio->stat_work cannot acquire the mutex lock such as that was possibly held up by mt7921_mutex_acquire, we should exit immediately and schedule another stat_work to avoid blocking the mt7921_mutex_acquire. Also, if mt7921_mutex_acquire was called by sdio->stat_work self, the wake would be blocked by itself, so we have to changing into an unblocking wake (directly wakeup via mt7921_mcu_drv_pmctrl, not via the wake_work) in the context. Fixes: 48fab5bbef40 ("mt76: mt7921: introduce mt7921s support") Co-developed-by: YN Chen Signed-off-by: YN Chen Signed-off-by: Sean Wang --- .../net/wireless/mediatek/mt76/mt7921/mac.c | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mac.c b/drivers/net/wireless/mediatek/mt76/mt7921/mac.c index 6bd9fc9228a2..75e719175e92 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/mac.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/mac.c @@ -1080,10 +1080,28 @@ bool mt7921_usb_sdio_tx_status_data(struct mt76_dev *mdev, u8 *update) { struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); - mt7921_mutex_acquire(dev); + if (!mutex_trylock(&mdev->mutex)) { + /* Because wake_work and stat_work share the same workqueue + * mt76->wq, if sdio->stat_work cannot acquire the mutex lock, + * we should exit immediately and schedule another stat_work + * to avoid blocking the wake_work. + */ + struct work_struct *stat_work; + + stat_work = mt76_is_sdio(mdev) ? &mdev->sdio.stat_work : + &mdev->usb.stat_work; + queue_work(dev->mt76.wq, stat_work); + + goto out; + } + + mt7921_mcu_drv_pmctrl(dev); mt7921_mac_sta_poll(dev); - mt7921_mutex_release(dev); + mt76_connac_power_save_sched(&mdev->phy, &dev->pm); + mutex_unlock(&mdev->mutex); + +out: return false; } EXPORT_SYMBOL_GPL(mt7921_usb_sdio_tx_status_data); -- 2.25.1