• Hans de Goede's avatar
    efi: Fix efi_power_off() not being run before acpi_power_off() when necessary · d40908f2
    Hans de Goede authored
    Commit 98f30d0e ("ACPI: power: Switch to sys-off handler API")
    switched the ACPI sleep code from directly setting the old global
    pm_power_off handler to using the new register_sys_off_handler()
    mechanism with a priority of SYS_OFF_PRIO_FIRMWARE.
    
    This is a problem when the old global pm_power_off handler would later
    be overwritten, such as done by the late_initcall(efi_shutdown_init):
    
    	if (efi_poweroff_required())
    		pm_power_off = efi_power_off;
    
    The old global pm_power_off handler gets run with a priority of
    SYS_OFF_PRIO_DEFAULT which is lower then SYS_OFF_PRIO_FIRMWARE, causing
    acpi_power_off() to run first, changing the behavior from before
    the ACPI sleep code switched to the new register_sys_off_handler().
    
    Switch the registering of efi_power_off over to register_sys_off_handler()
    with a priority of SYS_OFF_PRIO_FIRMWARE + 1 so that it will run before
    acpi_power_off() as before.
    
    Note since the new sys-off-handler code will try all handlers in
    priority order, there is no more need for the EFI code to store and
    call the original pm_power_off handler.
    
    Fixes: 98f30d0e ("ACPI: power: Switch to sys-off handler API")
    Cc: Dmitry Osipenko <dmitry.osipenko@collabora.com>
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Acked-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Link: https://lore.kernel.org/r/20220708131412.81078-3-hdegoede@redhat.com
    d40908f2
reboot.c 1.87 KB