[PATCH 7/9] PCI: Link a virtual function to its physical function
From: David Jeffery
Date: Fri Aug 21 2026 - 10:29:34 EST
With a PCI virtual function having the same bus for its parent
as the physical function it is associated with, there is no
explicit dependency between the two in the device tree. With
async shutdown, this can result in the PF being shutdown before the
VF has an opportunity to shutdown.
Link the VF as a consumer of the PF to note its dependency and
ensure clean shutdown ordering.
Signed-off-by: Tarun Sahu <tarunsahu@xxxxxxxxxx>
Signed-off-by: David Jeffery <djeffery@xxxxxxxxxx>
---
drivers/pci/iov.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index b0d24839c084..c75da093d60c 100644
--- a/drivers/pci/iov.c
+++ b/drivers/pci/iov.c
@@ -382,14 +382,20 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id)
}
pci_device_add(virtfn, virtfn->bus);
+ if (!device_link_add(&virtfn->dev, &dev->dev, DL_FLAG_STATELESS)) {
+ rc = -ENOMEM;
+ goto failed1;
+ }
+
rc = pci_iov_sysfs_link(dev, virtfn, id);
if (rc)
- goto failed1;
+ goto unlink;
pci_bus_add_device(virtfn);
return 0;
-
+unlink:
+ device_link_remove(&virtfn->dev, &dev->dev);
failed1:
pci_stop_and_remove_bus_device(virtfn);
pci_dev_put(dev);
@@ -421,6 +427,7 @@ void pci_iov_remove_virtfn(struct pci_dev *dev, int id)
if (virtfn->dev.kobj.sd)
sysfs_remove_link(&virtfn->dev.kobj, "physfn");
+ device_link_remove(&virtfn->dev, &dev->dev);
pci_stop_and_remove_bus_device(virtfn);
virtfn_remove_bus(dev->bus, virtfn->bus);
--
2.55.0