On Fri, Jul 4, 2025 at 12:14 PM Samuel Zhang <guoqing.zh...@amd.com> wrote: > > When hibernate with data center dGPUs, huge number of VRAM data will be > moved to shmem during dev_pm_ops.prepare(). These shmem pages take a lot > of system memory so that there's no enough free memory for creating the > hibernation image. This will cause hibernation fail and abort. > > After dev_pm_ops.prepare(), call shrink_all_memory() to force move shmem > pages to swap disk and reclaim the pages, so that there's enough system > memory for hibernation image and less pages needed to copy to the image. > > This patch can only flush and free about half shmem pages. It will be > better to flush and free more pages, even all of shmem pages, so that > there're less pages to be copied to the hibernation image and the overall > hibernation time can be reduced. > > Signed-off-by: Samuel Zhang <guoqing.zh...@amd.com>
No fundamental objections from me, so Acked-by: Rafael J. Wysocki <raf...@kernel.org> > --- > kernel/power/hibernate.c | 26 ++++++++++++++++++++++++++ > 1 file changed, 26 insertions(+) > > diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c > index 10a01af63a80..7ae9d9a7aa1d 100644 > --- a/kernel/power/hibernate.c > +++ b/kernel/power/hibernate.c > @@ -370,6 +370,23 @@ static int create_image(int platform_mode) > return error; > } > > +static void shrink_shmem_memory(void) > +{ > + struct sysinfo info; > + unsigned long nr_shmem_pages, nr_freed_pages; > + > + si_meminfo(&info); > + nr_shmem_pages = info.sharedram; /* current page count used for shmem > */ > + /* > + * The intent is to reclaim all shmem pages. Though > shrink_all_memory() can > + * only reclaim about half of them, it's enough for creating the > hibernation > + * image. > + */ > + nr_freed_pages = shrink_all_memory(nr_shmem_pages); > + pr_debug("requested to reclaim %lu shmem pages, actually freed %lu > pages\n", > + nr_shmem_pages, nr_freed_pages); > +} > + > /** > * hibernation_snapshot - Quiesce devices and create a hibernation image. > * @platform_mode: If set, use platform driver to prepare for the transition. > @@ -411,6 +428,15 @@ int hibernation_snapshot(int platform_mode) > goto Thaw; > } > > + /* > + * Device drivers may move lots of data to shmem in dpm_prepare(). > The shmem > + * pages will use lots of system memory, causing hibernation image > creation > + * fail due to insufficient free memory. > + * This call is to force flush the shmem pages to swap disk and > reclaim > + * the system memory so that image creation can succeed. > + */ > + shrink_shmem_memory(); > + > suspend_console(); > pm_restrict_gfp_mask(); > > -- > 2.43.5 >