lkml.org 
[lkml]   [2020]   [Jan]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.19 447/671] PM: ACPI/PCI: Resume all devices during hibernation
    Date
    From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>

    [ 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 | 13 +++++++------
    drivers/pci/pci-driver.c | 16 ++++++++--------
    2 files changed, 15 insertions(+), 14 deletions(-)

    diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c
    index e0927c5fd282..11b7a1632e5a 100644
    --- a/drivers/acpi/device_pm.c
    +++ b/drivers/acpi/device_pm.c
    @@ -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);
    }
    diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
    index e69af9b8361d..5def4b74d54a 100644
    --- a/drivers/pci/pci-driver.c
    +++ b/drivers/pci/pci-driver.c
    @@ -996,15 +996,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;
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-01-16 18:10    [W:4.205 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site