[PATCH 7/9] PCI: Link a virtual function to its physical function

Bjorn Helgaas helgaas at kernel.org
Thu Sep 3 15:12:58 PDT 2026


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 at google.com>
> Signed-off-by: David Jeffery <djeffery at redhat.com>
> Tested-by: Laurence Oberman <loberman at redhat.com>

Reviewed-by: Bjorn Helgaas <bhelgaas at google.com>

> ---
>  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
> 



More information about the kexec mailing list