• Jason Gunthorpe's avatar
    vfio/pci: Fix vf_token mechanism when device-specific VF drivers are used · 1ef3342a
    Jason Gunthorpe authored
    get_pf_vdev() tries to check if a PF is a VFIO PF by looking at the driver:
    
           if (pci_dev_driver(physfn) != pci_dev_driver(vdev->pdev)) {
    
    However now that we have multiple VF and PF drivers this is no longer
    reliable.
    
    This means that security tests realted to vf_token can be skipped by
    mixing and matching different VFIO PCI drivers.
    
    Instead of trying to use the driver core to find the PF devices maintain a
    linked list of all PF vfio_pci_core_device's that we have called
    pci_enable_sriov() on.
    
    When registering a VF just search the list to see if the PF is present and
    record the match permanently in the struct. PCI core locking prevents a PF
    from passing pci_disable_sriov() while VF drivers are attached so the VFIO
    owned PF becomes a static property of the VF.
    
    In common cases where vfio does not own the PF the global list remains
    empty and the VF's pointer is statically NULL.
    
    This also fixes a lockdep splat from recursive locking of the
    vfio_group::device_lock between vfio_device_get_from_name() and
    vfio_device_get_from_dev(). If the VF and PF share the same group this
    would deadlock.
    
    Fixes: ff53edf6 ("vfio/pci: Split the pci_driver code out of vfio_pci_core.c")
    Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    Link: https://lore.kernel.org/r/0-v3-876570980634+f2e8-vfio_vf_token_jgg@nvidia.comSigned-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
    1ef3342a
vfio_pci_core.c 58.2 KB