From nobody Mon Feb 9 15:09:46 2026 Received: from mail-dy1-f179.google.com (mail-dy1-f179.google.com [74.125.82.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E4E39326930 for ; Fri, 16 Jan 2026 01:05:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768525559; cv=none; b=QMlXHLqUCqDQSicZMEucnGwL76rOzgrj3R4HMLDXxJDZ/03pjJw1RlU1KRYdrSz0eWp0PucIgfyzfWiF7EpE50fsl3zIDJwmCFeLy9VxOmR0lK0R9PVdMhI3wPsOT4HxRUKx+YMyD1lXfMwif4gcxyx8uMe2e8yolAiXtA/LY6g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768525559; c=relaxed/simple; bh=xQRro3eUc7+kAN+ySF7Y8lq417EJb125DwuP6Y/XROE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JgMkzQMDTJDTKXfH1KFQ3Uk0Ai0fO3XqReOha39F96YeRHNVyT5PaV8e9zUFefSOImwZPyK7cyB7ooZ+Xe6ma4f9CY55eqrpZjcWNboJBtEcAHm/IRlXnGc5evYOsgEcju+XXUJujsG7ZP03eYE1fY1tfaiVRuPiMQei31pXe38= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=zacbowling.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=NnBZHSan; arc=none smtp.client-ip=74.125.82.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=zacbowling.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NnBZHSan" Received: by mail-dy1-f179.google.com with SMTP id 5a478bee46e88-2ac3d5ab81bso1765263eec.1 for ; Thu, 15 Jan 2026 17:05:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768525551; x=1769130351; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=VPmr/YvMhh6PyVTDX5uGjbBQK9qU8oKB4kDMk8rc0co=; b=NnBZHSanZ+A4AEA98UD7U2186AoVx78VFx7jl/fs7poER/HTLIhwX/AloQzUYXs0/H Ra90f4e3xN0R+6VAXEYlTGBdVSzpiOsx8yxWDlXthSjM8Mz96c1RQqlVxX5QvvhYG+57 95sSSuKKRqTYWGc2xbU5oISHShmQ9ZL1wH1fiW5KQ1dKtC/xQGwLPt1o0HNLjAxXuxsV vebOgAptrds6aPB7HZwClH2UOMKW3LRyazBkGa4KZgUdf8txLn/N31seeQZEkMFBO3JL AzOwh3Ej9iEDYQCzXSmhcMYRkk/UEDVJ5Atk5df4mvaeRBfmCRpAeszdqN4RMFB/sUh3 vgAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768525551; x=1769130351; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=VPmr/YvMhh6PyVTDX5uGjbBQK9qU8oKB4kDMk8rc0co=; b=ZQo/7OLLFsOu9y0yfzxC2yWeG4KcTjK6fkJHW1M0WprIUmAH+XOj4wI1+66J7Ke3WO R80UZUhjHr5vdq+G0ShMk9EqLIH7MWARYe+GQzTuRE8PPWxA+w70CWm6a1T6cGZ8w1xs VciNYsX1Yp4FQBbkpn2SR6Zxt96xqFnrhEGBL5kE2da2fllhpwMJJSu3gAefgRnPPp1y aJIqds+g9Ud87ud5sTr9ILB75Y6CCU2188BTdqQDpYWBaN1mWmMllptcVpX4o9DI0WQU kRO4Bi4JwCWGXTTrdxUC37XD1lBsURpXBeOaUYJTKMEIgbWqNhpPOuM34qAzaGO5MszY aixQ== X-Forwarded-Encrypted: i=1; AJvYcCXvTUoNizdco1ISUJBCQJ3vcPKIFd8O2F09eJ6uwFDsmkrNKMqXPCesTgGDDRVlMYfA8NjUBU36NT5pLtE=@vger.kernel.org X-Gm-Message-State: AOJu0YyIN6XdpZsuMkNMt5mV7RF+SccDn9yHHSvbaPXWoSD4GiUN9Ixu 5XpVXPtHzmVtMfDDhhCj6NSBLnG56QNkfFrt+MKHXALSrV4lIYwQaU5V X-Gm-Gg: AY/fxX5Xc2GNNLOV2PvusoKSsdezgLA3NY9Yo4zeZCBxfg4Qzj18cfqivFhCFa9uBJN t7WR9tio1n/zCWrJpKfvNz3/mPfJB0oSbcx0ZjqMT8bVJChAhuazT9ijW33nOB6sDbZCOUPrxK6 DfGCnZI1JiccvlIA5jrFQy+MiPTumVCcw97Y2JyEeS/ZFVMQN7VH2dDu3eVJhUw9CXvrAX1rFFj GDJmA8UI6ye46jO0TMgzS2ZeAvqugfPNPFtRU9e/iu9R+zD+kUWm1OPMJCri2JbOlhoXpU3euWf axJf7Wfn7xASEin7Z+IVaCwIPxXM7dTNnM9KSzpXo1vM1NtQ4h+JPgQJ91Vhd7OC7EObLyz5Cbq Qy9RO9cAjhFYQ4u635dLd0nf/ElU0fzEZt6vcba68o6aWjsLUCNXGiwX61uVeOoYNgLmcs3VVC0 TvmKK3y+Z1v/eZHZtpeUHInC8AIU29EqThpO2Yyd4lLCgr0TOXtgm6DqVdF2mhcA== X-Received: by 2002:a05:7301:7c0b:b0:2ae:56d7:b02 with SMTP id 5a478bee46e88-2b6b46c6449mr1393747eec.9.1768525551316; Thu, 15 Jan 2026 17:05:51 -0800 (PST) Received: from zcache.home.zacbowling.com ([2001:5a8:60d:bc9:f1d2:502c:a6ff:5556]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2b6b367cbc9sm1019884eec.32.2026.01.15.17.05.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Jan 2026 17:05:50 -0800 (PST) Sender: Zac Bowling From: Zac To: sean.wang@kernel.org Cc: deren.wu@mediatek.com, kvalo@kernel.org, linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-wireless@vger.kernel.org, lorenzo@kernel.org, nbd@nbd.name, linux@frame.work, ryder.lee@mediatek.com, sean.wang@mediatek.com, Zac Subject: [PATCH v4 19/21] wifi: mt76: mt7921: fix mutex deadlocks in multiple paths Date: Thu, 15 Jan 2026 17:05:17 -0800 Message-ID: <20260116010519.37001-20-zac@zacbowling.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260116010519.37001-1-zac@zacbowling.com> References: <20260116010519.37001-1-zac@zacbowling.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Fix mutex handling to prevent deadlocks: - mt7921_roc_abort_sync(): Remove internal mutex acquire/release since this function is called from contexts that already hold the mutex (mt7921_mac_sta_remove via mt76_sta_remove). Add mutex at caller sites that don't hold it (pci.c and sdio.c suspend paths). - mt7921_set_runtime_pm(): Remove internal mutex acquire/release since the only caller (debugfs) already holds the mutex. The previous patches incorrectly added mutex acquire inside functions that can be called from contexts where the mutex is already held, causing deadlocks. Signed-off-by: Zac Bowling --- drivers/net/wireless/mediatek/mt76/mt7921/main.c | 13 +++++++------ drivers/net/wireless/mediatek/mt76/mt7921/pci.c | 2 ++ drivers/net/wireless/mediatek/mt76/mt7921/sdio.c | 2 ++ 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/main.c b/drivers/net= /wireless/mediatek/mt76/mt7921/main.c index 8fc3770d1b..9315dbdf88 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c @@ -373,13 +373,15 @@ void mt7921_roc_abort_sync(struct mt792x_dev *dev) =20 timer_delete_sync(&phy->roc_timer); cancel_work_sync(&phy->roc_work); - if (test_and_clear_bit(MT76_STATE_ROC, &phy->mt76->state)) { - mt792x_mutex_acquire(dev); + /* Note: caller must hold mutex if ieee80211_iterate_interfaces is + * needed for ROC cleanup. Some call sites (like mt7921_mac_sta_remove) + * already hold the mutex via mt76_sta_remove(). For suspend paths, + * the mutex should be acquired before calling this function. + */ + if (test_and_clear_bit(MT76_STATE_ROC, &phy->mt76->state)) ieee80211_iterate_interfaces(mt76_hw(dev), IEEE80211_IFACE_ITER_RESUME_ALL, mt7921_roc_iter, (void *)phy); - mt792x_mutex_release(dev); - } } EXPORT_SYMBOL_GPL(mt7921_roc_abort_sync); =20 @@ -622,11 +624,10 @@ void mt7921_set_runtime_pm(struct mt792x_dev *dev) bool monitor =3D !!(hw->conf.flags & IEEE80211_CONF_MONITOR); =20 pm->enable =3D pm->enable_user && !monitor; - mt792x_mutex_acquire(dev); + /* Note: caller (debugfs) must hold mutex before calling this function */ ieee80211_iterate_active_interfaces(hw, IEEE80211_IFACE_ITER_RESUME_ALL, mt7921_pm_interface_iter, dev); - mt792x_mutex_release(dev); pm->ds_enable =3D pm->ds_enable_user && !monitor; mt76_connac_mcu_set_deep_sleep(&dev->mt76, pm->ds_enable); } diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c b/drivers/net/= wireless/mediatek/mt76/mt7921/pci.c index ec96861832..9f76b334b9 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c @@ -426,7 +426,9 @@ static int mt7921_pci_suspend(struct device *device) cancel_delayed_work_sync(&pm->ps_work); cancel_work_sync(&pm->wake_work); =20 + mt792x_mutex_acquire(dev); mt7921_roc_abort_sync(dev); + mt792x_mutex_release(dev); =20 err =3D mt792x_mcu_drv_pmctrl(dev); if (err < 0) diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/sdio.c b/drivers/net= /wireless/mediatek/mt76/mt7921/sdio.c index 3421e53dc9..92ea281181 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/sdio.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/sdio.c @@ -219,7 +219,9 @@ static int mt7921s_suspend(struct device *__dev) cancel_delayed_work_sync(&pm->ps_work); cancel_work_sync(&pm->wake_work); =20 + mt792x_mutex_acquire(dev); mt7921_roc_abort_sync(dev); + mt792x_mutex_release(dev); =20 err =3D mt792x_mcu_drv_pmctrl(dev); if (err < 0) --=20 2.52.0