• Alex Williamson's avatar
    vfio/pci: Use kernel VPD access functions · 4e1a6355
    Alex Williamson authored
    The PCI VPD capability operates on a set of window registers in PCI
    config space.  Writing to the address register triggers either a read
    or write, depending on the setting of the PCI_VPD_ADDR_F bit within
    the address register.  The data register provides either the source
    for writes or the target for reads.
    
    This model is susceptible to being broken by concurrent access, for
    which the kernel has adopted a set of access functions to serialize
    these registers.  Additionally, commits like 932c435c ("PCI: Add
    dev_flags bit to access VPD through function 0") and 7aa6ca4d
    ("PCI: Add VPD function 0 quirk for Intel Ethernet devices") indicate
    that VPD registers can be shared between functions on multifunction
    devices creating dependencies between otherwise independent devices.
    
    Fortunately it's quite easy to emulate the VPD registers, simply
    storing copies of the address and data registers in memory and
    triggering a VPD read or write on writes to the address register.
    This allows vfio users to avoid seeing spurious register changes from
    accesses on other devices and enables the use of shared quirks in the
    host kernel.  We can theoretically still race with access through
    sysfs, but the window of opportunity is much smaller.
    Signed-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
    Acked-by: default avatarMark Rustad <mark.d.rustad@intel.com>
    4e1a6355
vfio_pci_config.c 44.1 KB