Re: [PATCH 7/9] PCI: Link a virtual function to its physical function
From: Bjorn Helgaas
Date: Thu Sep 03 2026 - 18:14:46 EST
On Wed, Sep 02, 2026 at 01:07:32PM -0400, David Jeffery wrote:
> 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>
> Tested-by: Laurence Oberman <loberman@xxxxxxxxxx>
Reviewed-by: Bjorn Helgaas <bhelgaas@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 9d408fb8ac25..9b74211c6ab4 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
>