mirror of
https://github.com/torvalds/linux.git
synced 2024-12-05 02:23:16 +00:00
PM: ACPI/PCI: Resume all devices during hibernation
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:05087360fd
(ACPI / PM: Take SMART_SUSPEND driver flag into account) Fixes:c4b65157ae
(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>
This commit is contained in:
parent
2f02a7ecd5
commit
501debd4aa
@ -1112,13 +1112,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);
|
||||
}
|
||||
|
@ -972,15 +972,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;
|
||||
|
Loading…
Reference in New Issue
Block a user