Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp933221pxj; Fri, 14 May 2021 21:40:03 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyDXbR1m5D90GinpUoDGjxS2R6ZnHUhs+VXUkEyw/SoQjB6xqdN/EyhMv3CWmV4CeEw1PHq X-Received: by 2002:a17:906:60d6:: with SMTP id f22mr52096466ejk.177.1621053603317; Fri, 14 May 2021 21:40:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621053603; cv=none; d=google.com; s=arc-20160816; b=uB57GxsCF4HREBrsbxs6R2sXSCkmsl+AizlHvuPQ1kqajAWpTkwKA4484BSLo7M1JB Sh7T9UjnGffA/mz/dR1iUyO5NshWzdQiNi2ggMVfZ/06BHblou7i86k43lDRuX06N9Tx bqRVtMArnH8VOIafdzZa6lHdBZbSyeHVUb2plSAg1vB4eVsM46vOv9D2HJRZOIkE+ctp mp6pxV3gQe0QSds8BgJL/jauzvEx+IAL6kUD/lH27ck1JAlW8Ys709yr01yxh+stktID vBS6KCYF2R1lMZeIyQUuLUkfJzXhtgIr/2N87UVNrMwhxnQVfdSH/S1xQpg9fDQmetTL nzjQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=eDL+c/QdtgD8r8VbwEvkT3lveRXwvBXnrSNmmwy0UmA=; b=tKCuNUUyXFW3PmtSIRmyf9rx/lUWEE9xhu82XNeEaYHq6chYyTXobHRIrIZvO9tXZn ETwc2MiYRV75CdYZqL9YIFEzJ9FDWCG1Z5pdPr+f5fbQIMhUVRgk6CVCRzV4FIHKLyPF PFfZxc8M8NfsUQZVcZTDSQO4QMb+lOWULOUJjo66jWd+t2ftds3+bWmtosRaBwYd6xkz 73oVG2vTTCGkmHjSHECUObpdxj7MvaW9hLO2ILwwiV+nf88HFwSxXYfNPjF45cgRIjhg 3VzA06EDSGCLdALQ87yayQrRpKOiDiRvc7+z7RyT8flF2nbeq4Kluvd5iiV1/55CLkYZ LF3A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=jDedEm27; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id se10si7676543ejb.387.2021.05.14.21.39.40; Fri, 14 May 2021 21:40:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=jDedEm27; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234087AbhEOCqd (ORCPT + 99 others); Fri, 14 May 2021 22:46:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46488 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234014AbhEOCqd (ORCPT ); Fri, 14 May 2021 22:46:33 -0400 Received: from mail-pl1-x632.google.com (mail-pl1-x632.google.com [IPv6:2607:f8b0:4864:20::632]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 68339C06175F for ; Fri, 14 May 2021 19:45:20 -0700 (PDT) Received: by mail-pl1-x632.google.com with SMTP id a11so306006plh.3 for ; Fri, 14 May 2021 19:45:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=eDL+c/QdtgD8r8VbwEvkT3lveRXwvBXnrSNmmwy0UmA=; b=jDedEm27tZgHLLfLtKgiGZLBdd+ltSyv0pkfzhgLsbMPM6Vj++PAjCKGpepipJwrOX dhG9vdZwgge3fpM/4K2wFf7+pWiepW3LYIViZXGDW20FZ+kHVglpZZVv5DryV1DMCuIk vSuPF7fuCPwXXED4fvPSl1Dpb/kXL/ZYZmKbI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=eDL+c/QdtgD8r8VbwEvkT3lveRXwvBXnrSNmmwy0UmA=; b=kMESrjPzQD3ycOfyz/44jHh5/xsg/+I+4UMDpCsrDjyzOJChMKZcvlUbsIk5yt29FJ Sifo0pgGUulHu2fA8wPKZfIq8esKXGRUjVlo72OM8cFc/NDbxk9xifWw/KZrgqqTtCb/ oRBazXo6iGduwoFk5tiVpSP/H5rj8swAzlZXmC3ynF8GzhQiw8a6XNuADVdPdOimu5Hh 7DDNK5K1Mob8Db7JKiWL5OAA8h6sgdSuOJlJJYUWm82WzqIq4JKFBs+vPMaUdwMGJePA TZPYPkkdZ9KbsB4r93j62lhlHOpjZXdZc0blF9hueVRBKERj8UbyUGW8BKHnb/deYj61 rLYA== X-Gm-Message-State: AOAM531QGjC2AlY/WUfUvbiJBJu3i5wuDeH4W4L3K4b1PrmkcHuCsUUI lfNYfq4FtvYjaCZuktkWtdEiRJaMPBFXAw== X-Received: by 2002:a17:902:7d87:b029:ef:176:843b with SMTP id a7-20020a1709027d87b02900ef0176843bmr44138408plm.61.1621046719611; Fri, 14 May 2021 19:45:19 -0700 (PDT) Received: from smtp.gmail.com ([2620:15c:202:201:c853:454e:e506:af89]) by smtp.gmail.com with ESMTPSA id a26sm4918037pff.149.2021.05.14.19.45.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 May 2021 19:45:19 -0700 (PDT) From: Brian Norris To: linux-wireless@vger.kernel.org Cc: , Ganapathi Bhat , Sharvari Harisangam , Amitkumar Karwar , Xinming Hu , Brian Norris , stable@vger.kernel.org, Maximilian Luz , dave@bewaar.me, Johannes Berg Subject: [PATCH 5.13] mwifiex: bring down link before deleting interface Date: Fri, 14 May 2021 19:42:27 -0700 Message-Id: <20210515024227.2159311-1-briannorris@chromium.org> X-Mailer: git-send-email 2.31.1.751.gd2f1c929bd-goog MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org We can deadlock when rmmod'ing the driver or going through firmware reset, because the cfg80211_unregister_wdev() has to bring down the link for us, ... which then grab the same wiphy lock. nl80211_del_interface() already handles a very similar case, with a nice description: /* * We hold RTNL, so this is safe, without RTNL opencount cannot * reach 0, and thus the rdev cannot be deleted. * * We need to do it for the dev_close(), since that will call * the netdev notifiers, and we need to acquire the mutex there * but don't know if we get there from here or from some other * place (e.g. "ip link set ... down"). */ mutex_unlock(&rdev->wiphy.mtx); ... Do similarly for mwifiex teardown, by ensuring we bring the link down first. Sample deadlock trace: [ 247.103516] INFO: task rmmod:2119 blocked for more than 123 seconds. [ 247.110630] Not tainted 5.12.4 #5 [ 247.115796] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 247.124557] task:rmmod state:D stack: 0 pid: 2119 ppid: 2114 flags:0x00400208 [ 247.133905] Call trace: [ 247.136644] __switch_to+0x130/0x170 [ 247.140643] __schedule+0x714/0xa0c [ 247.144548] schedule_preempt_disabled+0x88/0xf4 [ 247.149714] __mutex_lock_common+0x43c/0x750 [ 247.154496] mutex_lock_nested+0x5c/0x68 [ 247.158884] cfg80211_netdev_notifier_call+0x280/0x4e0 [cfg80211] [ 247.165769] raw_notifier_call_chain+0x4c/0x78 [ 247.170742] call_netdevice_notifiers_info+0x68/0xa4 [ 247.176305] __dev_close_many+0x7c/0x138 [ 247.180693] dev_close_many+0x7c/0x10c [ 247.184893] unregister_netdevice_many+0xfc/0x654 [ 247.190158] unregister_netdevice_queue+0xb4/0xe0 [ 247.195424] _cfg80211_unregister_wdev+0xa4/0x204 [cfg80211] [ 247.201816] cfg80211_unregister_wdev+0x20/0x2c [cfg80211] [ 247.208016] mwifiex_del_virtual_intf+0xc8/0x188 [mwifiex] [ 247.214174] mwifiex_uninit_sw+0x158/0x1b0 [mwifiex] [ 247.219747] mwifiex_remove_card+0x38/0xa0 [mwifiex] [ 247.225316] mwifiex_pcie_remove+0xd0/0xe0 [mwifiex_pcie] [ 247.231451] pci_device_remove+0x50/0xe0 [ 247.235849] device_release_driver_internal+0x110/0x1b0 [ 247.241701] driver_detach+0x5c/0x9c [ 247.245704] bus_remove_driver+0x84/0xb8 [ 247.250095] driver_unregister+0x3c/0x60 [ 247.254486] pci_unregister_driver+0x2c/0x90 [ 247.259267] cleanup_module+0x18/0xcdc [mwifiex_pcie] Fixes: a05829a7222e ("cfg80211: avoid holding the RTNL when calling the driver") Cc: stable@vger.kernel.org Link: https://lore.kernel.org/linux-wireless/98392296-40ee-6300-369c-32e16cff3725@gmail.com/ Link: https://lore.kernel.org/linux-wireless/ab4d00ce52f32bd8e45ad0448a44737e@bewaar.me/ Reported-by: Maximilian Luz Reported-by: dave@bewaar.me Cc: Johannes Berg Signed-off-by: Brian Norris --- drivers/net/wireless/marvell/mwifiex/main.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c index 529dfd8b7ae8..17399d4aa129 100644 --- a/drivers/net/wireless/marvell/mwifiex/main.c +++ b/drivers/net/wireless/marvell/mwifiex/main.c @@ -1445,11 +1445,18 @@ static void mwifiex_uninit_sw(struct mwifiex_adapter *adapter) if (!priv) continue; rtnl_lock(); - wiphy_lock(adapter->wiphy); if (priv->netdev && - priv->wdev.iftype != NL80211_IFTYPE_UNSPECIFIED) + priv->wdev.iftype != NL80211_IFTYPE_UNSPECIFIED) { + /* + * Close the netdev now, because if we do it later, the + * netdev notifiers will need to acquire the wiphy lock + * again --> deadlock. + */ + dev_close(priv->wdev.netdev); + wiphy_lock(adapter->wiphy); mwifiex_del_virtual_intf(adapter->wiphy, &priv->wdev); - wiphy_unlock(adapter->wiphy); + wiphy_unlock(adapter->wiphy); + } rtnl_unlock(); } --