lkml.org 
[lkml]   [2017]   [Dec]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.4 083/101] PCI: Detach driver before procfs & sysfs teardown on device remove
    Date
    From: Alex Williamson <alex.williamson@redhat.com>

    [ Upstream commit 16b6c8bb687cc3bec914de09061fcb8411951fda ]

    When removing a device, for example a VF being removed due to SR-IOV
    teardown, a "soft" hot-unplug via 'echo 1 > remove' in sysfs, or an actual
    hot-unplug, we first remove the procfs and sysfs attributes for the device
    before attempting to release the device from any driver bound to it.
    Unbinding the driver from the device can take time. The device might need
    to write out data or it might be actively in use. If it's in use by
    userspace through a vfio driver, the unbind might block until the user
    releases the device. This leads to a potentially non-trivial amount of
    time where the device exists, but we've torn down the interfaces that
    userspace uses to examine devices, for instance lspci might generate this
    sort of error:

    pcilib: Cannot open /sys/bus/pci/devices/0000:01:0a.3/config
    lspci: Unable to read the standard configuration space header of device 0000:01:0a.3

    We don't seem to have any dependence on this teardown ordering in the
    kernel, so let's unbind the driver first, which is also more symmetric with
    the instantiation of the device in pci_bus_add_device().

    Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
    ---
    drivers/pci/remove.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c
    index 8a280e9c2ad1..7e67af2bb366 100644
    --- a/drivers/pci/remove.c
    +++ b/drivers/pci/remove.c
    @@ -20,9 +20,9 @@ static void pci_stop_dev(struct pci_dev *dev)
    pci_pme_active(dev, false);

    if (dev->is_added) {
    + device_release_driver(&dev->dev);
    pci_proc_detach_device(dev);
    pci_remove_sysfs_dev_files(dev);
    - device_release_driver(&dev->dev);
    dev->is_added = 0;
    }

    --
    2.11.0
    \
     
     \ /
      Last update: 2017-12-07 17:39    [W:6.306 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site