From: "Michael S. Tsirkin" <mst@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: Bjorn Helgaas <bhelgaas@google.com>,
linux-pci@vger.kernel.org, Parav Pandit <parav@nvidia.com>,
virtualization@lists.linux.dev, stefanha@redhat.com,
alok.a.tiwari@oracle.com
Subject: [PATCH RFC] pci: report surprise removal events
Date: Sat, 28 Jun 2025 14:58:49 -0400 [thread overview]
Message-ID: <11cfcb55b5302999b0e58b94018f92a379196698.1751136072.git.mst@redhat.com> (raw)
At the moment, in case of a surprise removal, the regular
remove callback is invoked, exclusively.
This works well, because mostly, the cleanup would be the same.
However, there's a race: imagine device removal was initiated by a user
action, such as driver unbind, and it in turn initiated some cleanup and
is now waiting for an interrupt from the device. If the device is now
surprise-removed, that never arrives and the remove callback hangs
forever.
Drivers can artificially add timeouts to handle that, but it can be
flaky.
Instead, let's add a way for the driver to be notified about the
disconnect. It can then do any necessary cleanup, knowing that the
device is inactive.
Given this is by design kind of asynchronous with normal probe/remove
callbacks, I added it in the pci_error_handlers callback.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
Warning: build-tested only at this point.
Posting for early flames/feedback.
Cc a bunch of people who discussed this problem specifically in the
virtio blk driver.
drivers/pci/pci.h | 9 +++++++++
include/linux/pci.h | 3 +++
2 files changed, 12 insertions(+)
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index b81e99cd4b62..78b064be10d5 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -549,6 +549,15 @@ static inline int pci_dev_set_disconnected(struct pci_dev *dev, void *unused)
pci_dev_set_io_state(dev, pci_channel_io_perm_failure);
pci_doe_disconnected(dev);
+ /* Notify driver of surprise removal */
+ device_lock(&dev->dev);
+
+ if (dev->driver && dev->driver->err_handler &&
+ dev->driver->err_handler->disconnect)
+ dev->driver->err_handler->disconnect(dev);
+
+ device_unlock(&dev->dev);
+
return 0;
}
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 51e2bd6405cd..30a8c7ee09f6 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -878,6 +878,9 @@ struct pci_error_handlers {
/* PCI slot has been reset */
pci_ers_result_t (*slot_reset)(struct pci_dev *dev);
+ /* PCI slot has been disconnected */
+ void (*disconnect)(struct pci_dev *dev);
+
/* PCI function reset prepare or completed */
void (*reset_prepare)(struct pci_dev *dev);
void (*reset_done)(struct pci_dev *dev);
--
MST
next reply other threads:[~2025-06-28 18:58 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-28 18:58 Michael S. Tsirkin [this message]
2025-06-29 13:36 ` [PATCH RFC] pci: report surprise removal events Lukas Wunner
2025-06-29 17:28 ` Michael S. Tsirkin
2025-06-29 23:39 ` Keith Busch
2025-06-30 4:07 ` Parav Pandit
2025-06-30 13:44 ` Keith Busch
2025-06-30 13:52 ` Parav Pandit
2025-06-30 16:57 ` Keith Busch
2025-06-30 17:25 ` Michael S. Tsirkin
2025-06-30 7:17 ` Michael S. Tsirkin
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=11cfcb55b5302999b0e58b94018f92a379196698.1751136072.git.mst@redhat.com \
--to=mst@redhat.com \
--cc=alok.a.tiwari@oracle.com \
--cc=bhelgaas@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=parav@nvidia.com \
--cc=stefanha@redhat.com \
--cc=virtualization@lists.linux.dev \
/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;
as well as URLs for NNTP newsgroup(s).