On Tue, Nov 08, 2022 at 08:53:00AM -0600, Bjorn Helgaas wrote: > On Wed, Oct 26, 2022 at 02:11:21AM -0400, Michael S. Tsirkin wrote: > > virtio uses the same driver for VFs and PFs. Accordingly, > > pci_device_is_present is used to detect device presence. This function > > isn't currently working properly for VFs since it attempts reading > > device and vendor ID. > > > As VFs are present if and only if PF is present, > > just return the value for that device. > > VFs are only present when the PF is present *and* the PF has VF Enable > set. Do you care about the possibility that VF Enable has been > cleared? Can you also include a hint about how the problem manifests, and a URL to the report if available? It's beyond the scope of this patch, but I've never liked the semantics of pci_device_is_present() because it's racy by design. All it tells us is that some time in the *past*, the device was present. It's telling that almost all calls test for !pci_device_is_present(), which does make a little more sense. > > Reported-by: Wei Gong <gongwei833x@xxxxxxxxx> > > Signed-off-by: Michael S. Tsirkin <mst@xxxxxxxxxx> > > --- > > > > Wei Gong, thanks for your testing of the RFC! > > As I made a small change, would appreciate re-testing. > > > > Thanks! > > > > changes from RFC: > > use pci_physfn() wrapper to make the code build without PCI_IOV > > > > > > drivers/pci/pci.c | 5 +++++ > > 1 file changed, 5 insertions(+) > > > > diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c > > index 2127aba3550b..899b3f52e84e 100644 > > --- a/drivers/pci/pci.c > > +++ b/drivers/pci/pci.c > > @@ -6445,8 +6445,13 @@ bool pci_devs_are_dma_aliases(struct pci_dev *dev1, struct pci_dev *dev2) > > > > bool pci_device_is_present(struct pci_dev *pdev) > > { > > + struct pci_dev *physfn = pci_physfn(pdev); > > u32 v; > > > > + /* Not a PF? Switch to the PF. */ > > + if (physfn != pdev) > > + return pci_device_is_present(physfn); > > + > > if (pci_dev_is_disconnected(pdev)) > > return false; > > return pci_bus_read_dev_vendor_id(pdev->bus, pdev->devfn, &v, 0); > > -- > > MST > >