Re: [PATCH] PCI: Always allow probing with driver_override

Bjorn Helgaas
2019-06-13T21:50:12Z

On Thu, May 09, 2019 at 01:27:22PM -0600, Alex Williamson wrote:
> Commit 0e7df22401a3 ("PCI: Add sysfs sriov_drivers_autoprobe to control
> VF driver binding") introduced the sriov_drivers_autoprobe attribute
> which allows users to prevent the kernel from automatically probing a
> driver for new VFs as they are created. This allows VFs to be spawned
> without automatically binding the new device to a host driver, such as
> in cases where the user intends to use the device only with a meta
> driver like vfio-pci. However, the current implementation prevents any
> use of drivers_probe with the VF while sriov_drivers_autoprobe=0. This
> blocks the now current general practice of setting driver_override
> followed by using drivers_probe to bind a device to a specified driver.
>
> The kernel never automatically sets a driver_override therefore it seems
> we can assume a driver_override reflects the intent of the user. Also,
> probing a device using a driver_override match seems outside the scope
> of the 'auto' part of sriov_drivers_autoprobe. Therefore, let's allow
> driver_override matches regardless of sriov_drivers_autoprobe, which we
> can do by simply testing if a driver_override is set for a device as a
> 'can probe' condition.
>
> Fixes: 0e7df22401a3 ("PCI: Add sysfs sriov_drivers_autoprobe to control VF driver binding")
> Link: https://lore.kernel.org/linux-pci/155672991496.20698.4279330795743262888.stgit@gimli.home/T/#u
> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>

Applied to pci/enumeration for v5.3, thanks!

> ---
>
> drivers/pci/pci-driver.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
> index da7b82e56c83..9b9e9c63cde8 100644
> --- a/drivers/pci/pci-driver.c
> +++ b/drivers/pci/pci-driver.c
> @@ -399,7 +399,8 @@ void __weak pcibios_free_irq(struct pci_dev *dev)
> #ifdef CONFIG_PCI_IOV
> static inline bool pci_device_can_probe(struct pci_dev *pdev)
> {
> - return (!pdev->is_virtfn || pdev->physfn->sriov->drivers_autoprobe);
> + return (!pdev->is_virtfn || pdev->physfn->sriov->drivers_autoprobe ||
> + pdev->driver_override);
> }
> #else
> static inline bool pci_device_can_probe(struct pci_dev *pdev)
>