1. 03 5月, 2016 2 次提交
    • L
      PCI: Do not treat EPROBE_DEFER as device attach failure · 9a2a5a63
      Lukas Wunner 提交于
      Linux 4.5 introduced a behavioral change in device probing during the
      suspend process with commit 013c074f ("PM / sleep: prohibit devices
      probing during suspend/hibernation"): It defers device probing during the
      entire suspend process, starting from the prepare phase and ending with the
      complete phase.  A rule existed before that "we rely on subsystems not to
      do any probing once a device is suspended" but it is enforced only now
      (Alan Stern, https://lkml.org/lkml/2015/9/15/908).
      
      This resulted in a WARN splat if a PCI device (e.g., Thunderbolt) is
      plugged in while the system is asleep: Upon waking up, pciehp_resume()
      discovers new devices in the resume phase and immediately tries to bind
      them to a driver.  Since probing is now deferred, device_attach() returns
      -EPROBE_DEFER, which provoked a WARN in pci_bus_add_device().
      
      Linux 4.6-rc1 aggravates the situation with commit ab1a187b ("PCI:
      Check device_attach() return value always"): If device_attach() returns a
      negative value, pci_bus_add_device() now removes the sysfs and procfs
      entries for the device and pci_bus_add_devices() subsequently locks up with
      a BUG.  Even with the BUG fixed we're still in trouble because the device
      remains on the deferred probing list even though its sysfs and procfs
      entries are gone and its children won't be added.
      
      Fix by not interpreting -EPROBE_DEFER as failure.  The device will be
      probed eventually (through device_unblock_probing() in dpm_complete()) and
      there is proper locking in place to avoid races (e.g., if devices are
      unplugged again und thus deleted from the system before deferred probing
      happens, I have tested this).  Also, those functions which dereference
      dev->driver (e.g. pci_pm_*()) do contain proper NULL pointer checks.  So it
      seems safe to ignore -EPROBE_DEFER.
      
      Fixes: ab1a187b ("PCI: Check device_attach() return value always")
      Signed-off-by: NLukas Wunner <lukas@wunner.de>
      Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
      Acked-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Cc: Grygorii Strashko <grygorii.strashko@ti.com>
      Cc: Alan Stern <stern@rowland.harvard.edu>
      9a2a5a63
    • L
      PCI: Fix BUG on device attach failure · 1e398eae
      Lukas Wunner 提交于
      Previously when pci_bus_add_device() called device_attach() and it returned
      a negative value, we emitted a WARN but carried on.
      
      Commit ab1a187b ("PCI: Check device_attach() return value always"),
      introduced in Linux 4.6-rc1, changed this to unwind all steps preceding
      device_attach() and to not set dev->is_added = 1.
      
      The latter leads to a BUG if pci_bus_add_device() was called from
      pci_bus_add_devices().  Fix by not recursing to a child bus if
      device_attach() failed for the bridge leading to it.
      
      This can be triggered by plugging in a PCI device (e.g. Thunderbolt) while
      the system is asleep.  The system locks up when woken because
      device_attach() returns -EPROBE_DEFER.
      
      Fixes: ab1a187b ("PCI: Check device_attach() return value always")
      Signed-off-by: NLukas Wunner <lukas@wunner.de>
      Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
      Acked-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      1e398eae
  2. 16 4月, 2016 2 次提交
  3. 06 4月, 2016 1 次提交
  4. 03 4月, 2016 9 次提交
  5. 02 4月, 2016 26 次提交