]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
PM: ACPI/PCI: Resume all devices during hibernation
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 1 Jul 2019 10:44:25 +0000 (12:44 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 27 Jan 2020 13:50:59 +0000 (14:50 +0100)
[ Upstream commit 501debd4aa5edc755037c39ea5a8fba23b41e580 ]

Both the PCI bus type and the ACPI PM domain avoid resuming
runtime-suspended devices with DPM_FLAG_SMART_SUSPEND set during
hibernation (before creating the snapshot image of system memory),
but that turns out to be a mistake.  It leads to functional issues
and adds complexity that's hard to justify.

For this reason, resume all runtime-suspended PCI devices and all
devices in the ACPI PM domains before creating a snapshot image of
system memory during hibernation.

Fixes: 05087360fd7a (ACPI / PM: Take SMART_SUSPEND driver flag into account)
Fixes: c4b65157aeef (PCI / PM: Take SMART_SUSPEND driver flag into account)
Link: https://lore.kernel.org/linux-acpi/917d4399-2e22-67b1-9d54-808561f9083f@uwyo.edu/T/#maf065fe6e4974f2a9d79f332ab99dfaba635f64c
Reported-by: Robert R. Howell <RHowell@uwyo.edu>
Tested-by: Robert R. Howell <RHowell@uwyo.edu>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/acpi/device_pm.c
drivers/pci/pci-driver.c

index e0927c5fd282188a4ca3d04a874401c0b86c3a8c..11b7a1632e5aae33e3cbe4c1a7c93e012aae0247 100644 (file)
@@ -1116,13 +1116,14 @@ EXPORT_SYMBOL_GPL(acpi_subsys_resume_early);
 int acpi_subsys_freeze(struct device *dev)
 {
        /*
-        * This used to be done in acpi_subsys_prepare() for all devices and
-        * some drivers may depend on it, so do it here.  Ideally, however,
-        * runtime-suspended devices should not be touched during freeze/thaw
-        * transitions.
+        * Resume all runtime-suspended devices before creating a snapshot
+        * image of system memory, because the restore kernel generally cannot
+        * be expected to always handle them consistently and they need to be
+        * put into the runtime-active metastate during system resume anyway,
+        * so it is better to ensure that the state saved in the image will be
+        * always consistent with that.
         */
-       if (!dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_SUSPEND))
-               pm_runtime_resume(dev);
+       pm_runtime_resume(dev);
 
        return pm_generic_freeze(dev);
 }
index bc1ff41ce3d35f94fbc5d9d201af1f0d2a0436a9..78ae1cab9af70c756f40b2c2f7a057e0f64babc8 100644 (file)
@@ -959,15 +959,15 @@ static int pci_pm_freeze(struct device *dev)
        }
 
        /*
-        * This used to be done in pci_pm_prepare() for all devices and some
-        * drivers may depend on it, so do it here.  Ideally, runtime-suspended
-        * devices should not be touched during freeze/thaw transitions,
-        * however.
+        * Resume all runtime-suspended devices before creating a snapshot
+        * image of system memory, because the restore kernel generally cannot
+        * be expected to always handle them consistently and they need to be
+        * put into the runtime-active metastate during system resume anyway,
+        * so it is better to ensure that the state saved in the image will be
+        * always consistent with that.
         */
-       if (!dev_pm_smart_suspend_and_suspended(dev)) {
-               pm_runtime_resume(dev);
-               pci_dev->state_saved = false;
-       }
+       pm_runtime_resume(dev);
+       pci_dev->state_saved = false;
 
        if (pm->freeze) {
                int error;