Re: [PATCH v7 11/12] PM: Use hibernate flows for system power off

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Sep 09, 2025 at 02:16:18PM -0500, Mario Limonciello (AMD) wrote:
> When the system is powered off the kernel will call device_shutdown()
> which will issue callbacks into PCI core to wake up a device and call
> it's shutdown() callback.  This will leave devices in ACPI D0 which can
> cause some devices to misbehave with spurious wakeups and also leave some
> devices on which will consume power needlessly.

The connection between this change and spurious wakeups seems pretty
tenuous.  If we don't want wakeups, powering off the device seems like
a sledgehammer approach.

s/it's/its/

> The issue won't happen if the device is in D3 before system shutdown, so
> putting device to low power state before shutdown solves the issue.
> 
> ACPI Spec 6.5, "7.4.2.5 System \_S4 State" says "Devices states are
> compatible with the current Power Resource states. In other words, all
> devices are in the D3 state when the system state is S4."

Re patch 05/12, also interesting that this section mentions "devices
that are enabled to wake the system and that can do so from their
device state in S4 can initiate a hardware event that transitions the
system state to S0."

So it looks like wakeup from S4 should work in at least some cases.

> The following "7.4.2.6 System \_S5 State (Soft Off)" states "The S5
> state is similar to the S4 state except that OSPM does not save any
> context." so it's safe to assume devices should be at D3 for S5.
> 
> To accomplish this, use the PMSG_POWEROFF event to call all the device
> hibernate callbacks when the kernel is compiled with hibernate support.
> If compiled without hibernate support or hibernate fails fall back into
> the previous shutdown flow.
> 
> Cc: AceLan Kao <acelan.kao@xxxxxxxxxxxxx>
> Cc: Kai-Heng Feng <kaihengf@xxxxxxxxxx>
> Cc: Mark Pearson <mpearson-lenovo@xxxxxxxxx>
> Cc: Merthan Karakaş <m3rthn.k@xxxxxxxxx>
> Tested-by: Eric Naim <dnaim@xxxxxxxxxxx>
> Tested-by: Denis Benato <benato.denis96@xxxxxxxxx>
> Link: https://lore.kernel.org/linux-pci/20231213182656.6165-1-mario.limonciello@xxxxxxx/
> Link: https://lore.kernel.org/linux-pci/20250506041934.1409302-1-superm1@xxxxxxxxxx/
> Signed-off-by: Mario Limonciello (AMD) <superm1@xxxxxxxxxx>
> ---
> v5:
>  * split to multiple commits, re-order
> v4:
>  * https://lore.kernel.org/linux-pci/20250616175019.3471583-1-superm1@xxxxxxxxxx/
> v3:
>  * Add new PMSG_POWEROFF and PM_EVENT_POWEROFF which alias to poweroff
>    callbacks
>  * Don't try to cleanup on dpm_suspend_start() or dpm_suspend_end() failures
>    Jump right into normal shutdown flow instead.
>  * https://lore.kernel.org/linux-pm/20250609024619.407257-1-superm1@xxxxxxxxxx/T/#me6db0fb946e3d604a8f3d455128844ed802c82bb
> ---
>  kernel/reboot.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/kernel/reboot.c b/kernel/reboot.c
> index ec087827c85cd..c8835f8e5f271 100644
> --- a/kernel/reboot.c
> +++ b/kernel/reboot.c
> @@ -13,6 +13,7 @@
>  #include <linux/kexec.h>
>  #include <linux/kmod.h>
>  #include <linux/kmsg_dump.h>
> +#include <linux/pm.h>
>  #include <linux/reboot.h>
>  #include <linux/suspend.h>
>  #include <linux/syscalls.h>
> @@ -305,6 +306,11 @@ static void kernel_shutdown_prepare(enum system_states state)
>  		(state == SYSTEM_HALT) ? SYS_HALT : SYS_POWER_OFF, NULL);
>  	system_state = state;
>  	usermodehelper_disable();
> +#ifdef CONFIG_HIBERNATE_CALLBACKS
> +	if (!dpm_suspend_start(PMSG_POWEROFF) && !dpm_suspend_end(PMSG_POWEROFF))
> +		return;
> +	pr_emerg("Failed to power off devices, using shutdown instead.\n");
> +#endif
>  	device_shutdown();
>  }
>  /**
> -- 
> 2.43.0
> 




[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux