mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Mario Limonciello <superm1@kernel.org>
To: flo@geekplace.eu, "Rafael J. Wysocki" <rafael@kernel.org>,
	Pavel Machek <pavel@kernel.org>, Len Brown <lenb@kernel.org>,
	Matthew Leach <matthew.leach@collabora.com>
Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>,
	linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] PM: hibernate: Freeze kernel threads after image preallocation
Date: Mon, 21 Sep 2026 14:19:11 -0500	[thread overview]
Message-ID: <7feb56df-15d4-4821-99c7-b8c96ce66b81@kernel.org> (raw)
In-Reply-To: <20260920-fix-hibernation-v1-1-f9940c2d7d7f@geekplace.eu>

On 9/20/26 09:35, Florian Schmaus via B4 Relay wrote:
> From: Florian Schmaus <flo@geekplace.eu>
> 
> Commit 783c81098445 ("PM: hibernate: call preallocate_image() after freeze
> prepare") moved hibernate_preallocate_memory() after dpm_prepare() so
> that device drivers have the opportunity to release pinned/unswappable
> memory during their ->prepare() callback before memory is preallocated
> for the snapshot image.
> 
> However, that commit also placed hibernate_preallocate_memory() after
> freeze_kernel_threads(). While it was assumed during review that swap
> I/O submitted via submit_bio() is synchronous and would not depend on
> frozen kernel threads, this does not hold in practice. Calling
> hibernate_preallocate_memory() with kernel threads frozen leads to
> intermittent deadlocks during hibernation.
> 
> Inside hibernate_preallocate_memory(), shrink_all_memory() is invoked with
> .may_writepage = 1 and .may_swap = 1 to aggressively reclaim and swap out
> pages. Any writeback or swap I/O that relies on freezable kernel threads,
> block device helpers, or WQ_FREEZABLE workqueues (such as those in storage
> drivers, device mapper, or filesystems) deadlocks waiting on tasks that
> are stuck in the refrigerator.
> 
> Fix this by reordering hibernation_snapshot():
> 1. Call dpm_prepare(PMSG_FREEZE) first, allowing device drivers to release
>     pinned resources while kernel threads are still active.
> 2. Call hibernate_preallocate_memory() second, performing page reclaim and
>     swapout while storage layers, workqueues, and kernel threads are alive.
> 3. Call freeze_kernel_threads() third, only after all memory preallocation
>     and swap I/O have completed.
> 
> Additionally, restore the call to swsusp_free() in the cleanup path so
> that preallocated image memory is properly freed if freeze_kernel_threads()
> fails or if TEST_FREEZER is enabled.
> 
> Fixes: 783c81098445 ("PM: hibernate: call preallocate_image() after freeze prepare")
> Signed-off-by: Florian Schmaus <flo@geekplace.eu>
> ---
> During the review of commit 783c81098445 ("PM: hibernate: call
> preallocate_image() after freeze prepare") [1], concerns were raised
> regarding whether memory reclaim and swap I/O could deadlock if kernel
> threads were already frozen.
> 
> At the time, it was thought that pageout to swap would not depend on
> frozen threads. However, on Linux 7.2, I ran into reliable issues with
> suspend-to-disk hanging during hibernation. Reordering the sequence so
> that kernel threads are frozen after image preallocation (as done in
> this patch) fixes the issue for me.
> 
> This patch restores the ordering where kernel threads are frozen only after
> memory preallocation and swap I/O have completed, while keeping the
> benefit of calling dpm_prepare() beforehand so drivers can release pinned
> pages.
> 
> [1] https://patch.msgid.link/20260403-hibernation-fixes-v3-1-31bc9fa3ba2d@collabora.com
> ---
>   kernel/power/hibernate.c | 26 ++++++++++++++------------
>   1 file changed, 14 insertions(+), 12 deletions(-)
> 
> diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c
> index d2479c69d71a..c13f68ab7f6e 100644
> --- a/kernel/power/hibernate.c
> +++ b/kernel/power/hibernate.c
> @@ -408,9 +408,18 @@ int hibernation_snapshot(int platform_mode)
>   	if (error)
>   		goto Close;
>   
> +	error = dpm_prepare(PMSG_FREEZE);
> +	if (error)
> +		goto Complete;
> +
> +	/* Preallocate image memory before freezing kernel threads and shutting down devices. */
> +	error = hibernate_preallocate_memory();
> +	if (error)
> +		goto Complete;
> +
>   	error = freeze_kernel_threads();
>   	if (error)
> -		goto Close;
> +		goto Cleanup;
>   
>   	if (hibernation_test(TEST_FREEZER)) {
>   
> @@ -422,15 +431,6 @@ int hibernation_snapshot(int platform_mode)
>   		goto Thaw;
>   	}
>   
> -	error = dpm_prepare(PMSG_FREEZE);
> -	if (error)
> -		goto Complete;
> -
> -	/* Preallocate image memory before shutting down devices. */
> -	error = hibernate_preallocate_memory();
> -	if (error)
> -		goto Complete;
> -
>   	console_suspend_all();
>   	pm_restrict_gfp_mask();
>   
> @@ -464,10 +464,12 @@ int hibernation_snapshot(int platform_mode)
>   	platform_end(platform_mode);
>   	return error;
>   
> - Complete:
> -	dpm_complete(PMSG_RECOVER);
>    Thaw:
>   	thaw_kernel_threads();
> + Cleanup:
> +	swsusp_free();
> + Complete:
> +	dpm_complete(PMSG_RECOVER);
>   	goto Close;
>   }
>   
> 
> ---
> base-commit: 40288c9206c17eb66a603262e06a58d300d0f279
> change-id: 20260915-fix-hibernation-aad94ce17506
> 
> Best regards,
> --
> Florian Schmaus <flo@geekplace.eu>

Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org>

  reply	other threads:[~2026-09-21 19:19 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-20 14:35 Florian Schmaus via B4 Relay
2026-09-21 19:19 ` Mario Limonciello [this message]
2026-09-22  5:10 ` Thorsten Leemhuis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7feb56df-15d4-4821-99c7-b8c96ce66b81@kernel.org \
    --to=superm1@kernel.org \
    --cc=flo@geekplace.eu \
    --cc=lenb@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=matthew.leach@collabora.com \
    --cc=pavel@kernel.org \
    --cc=rafael.j.wysocki@intel.com \
    --cc=rafael@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®