Skip to content
  • Alex Williamson's avatar
    PCI: Introduce new device binding path using pci_dev.driver_override · 782a985d
    Alex Williamson authored
    
    
    The driver_override field allows us to specify the driver for a device
    rather than relying on the driver to provide a positive match of the
    device.  This shortcuts the existing process of looking up the vendor and
    device ID, adding them to the driver new_id, binding the device, then
    removing the ID, but it also provides a couple advantages.
    
    First, the above existing process allows the driver to bind to any device
    matching the new_id for the window where it's enabled.  This is often not
    desired, such as the case of trying to bind a single device to a meta
    driver like pci-stub or vfio-pci.  Using driver_override we can do this
    deterministically using:
    
      echo pci-stub > /sys/bus/pci/devices/0000:03:00.0/driver_override
      echo 0000:03:00.0 > /sys/bus/pci/devices/0000:03:00.0/driver/unbind
      echo 0000:03:00.0 > /sys/bus/pci/drivers_probe
    
    Previously we could not invoke drivers_probe after adding a device to
    new_id for a driver as we get non-deterministic behavior whether the driver
    we intend or the standard driver will claim the device.  Now it becomes a
    deterministic process, only the driver matching driver_override will probe
    the device.
    
    To return the device to the standard driver, we simply clear the
    driver_override and reprobe the device:
    
      echo > /sys/bus/pci/devices/0000:03:00.0/driver_override
      echo 0000:03:00.0 > /sys/bus/pci/devices/0000:03:00.0/driver/unbind
      echo 0000:03:00.0 > /sys/bus/pci/drivers_probe
    
    Another advantage to this approach is that we can specify a driver override
    to force a specific binding or prevent any binding.  For instance when an
    IOMMU group is exposed to userspace through VFIO we require that all
    devices within that group are owned by VFIO.  However, devices can be
    hot-added into an IOMMU group, in which case we want to prevent the device
    from binding to any driver (override driver = "none") or perhaps have it
    automatically bind to vfio-pci.  With driver_override it's a simple matter
    for this field to be set internally when the device is first discovered to
    prevent driver matches.
    
    Signed-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    Reviewed-by: default avatarAlexander Graf <agraf@suse.de>
    Acked-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    782a985d