From: Jay Zhou <jianjay.zhou@huawei.com>
To: <linux-pci@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<bhelgaas@google.com>, <alex.williamson@redhat.com>
Cc: <weidong.huang@huawei.com>, <jianjay.zhou@huawei.com>
Subject: [PATCH] pci: avoid dead lock between device reset and sriov disable
Date: Mon, 4 Apr 2022 14:25:39 +0800 [thread overview]
Message-ID: <20220404062539.1710-1-jianjay.zhou@huawei.com> (raw)
Call trace of PF SRIOV disable:
sriov_numvfs_store
device_lock <----------------- (1) get the device lock
->sriov_configure # e.g. vfio_pci_sriov_configure
sriov_disable
pci_cfg_access_lock <--- (4) wait dev->block_cfg_access to be 0
Call trace of PF reset:
reset_store
pci_reset_function
pci_dev_lock
pci_cfg_access_lock <----- (2) set dev->block_cfg_access = 1
device_lock <------------- (3) want to get the device lock
These two oprations would wait for each other forever if the
code execution sequence is (1)(2)(3)(4).
Let's get the device lock and then the config access lock in
pci_dev_lock().
Signed-off-by: Jay Zhou <jianjay.zhou@huawei.com>
---
drivers/pci/pci.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 9ecce435fb3f..61a6db1d21f6 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -5103,19 +5103,19 @@ static int pci_reset_bus_function(struct pci_dev *dev, bool probe)
void pci_dev_lock(struct pci_dev *dev)
{
- pci_cfg_access_lock(dev);
/* block PM suspend, driver probe, etc. */
device_lock(&dev->dev);
+ pci_cfg_access_lock(dev);
}
EXPORT_SYMBOL_GPL(pci_dev_lock);
/* Return 1 on successful lock, 0 on contention */
int pci_dev_trylock(struct pci_dev *dev)
{
- if (pci_cfg_access_trylock(dev)) {
- if (device_trylock(&dev->dev))
+ if (device_trylock(&dev->dev)) {
+ if (pci_cfg_access_trylock(dev))
return 1;
- pci_cfg_access_unlock(dev);
+ device_unlock(&dev->dev);
}
return 0;
@@ -5124,8 +5124,8 @@ EXPORT_SYMBOL_GPL(pci_dev_trylock);
void pci_dev_unlock(struct pci_dev *dev)
{
- device_unlock(&dev->dev);
pci_cfg_access_unlock(dev);
+ device_unlock(&dev->dev);
}
EXPORT_SYMBOL_GPL(pci_dev_unlock);
--
2.27.0
next reply other threads:[~2022-04-04 6:25 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-04 6:25 Jay Zhou [this message]
2022-05-10 2:03 ` [PATCH] pci: avoid dead lock between device reset and sriov disable Yicong Yang
2022-05-11 22:22 ` Bjorn Helgaas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220404062539.1710-1-jianjay.zhou@huawei.com \
--to=jianjay.zhou@huawei.com \
--cc=alex.williamson@redhat.com \
--cc=bhelgaas@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=weidong.huang@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox