diff mbox series

[v3] hibernate: pageoffline may be first judged

Message ID a55a3417634ae3ab546121d77af083cbf4fcdc3f.camel@kylinos.cn
State New
Headers show
Series [v3] hibernate: pageoffline may be first judged | expand

Commit Message

lijun April 3, 2025, 2:03 a.m. UTC
From: Li Jun <lijun01@kylinos.cn>                                      
                                                                       
                                                                       
                                                           
Date: Mon, 10 Feb 2025 10:40:58 +0800
Subject: [PATCH v3] hibernate: pageoffline may be first judged

'PageReserved' and 'PageOffline' have weights greater
than 'is_forbidden' and 'is_free'.so,PageReserved
and PageOffline should be first judged.
just as the page is free,but is reserved.

the ordering of checks in 'for_each_populated_zone(zone)'
It means that hundreds of thousands or even millions of
pages need to be judged, reducing the judgment of one
statement may save some time.

Signed-off-by: Li Jun <lijun01@kylinos.cn>
---
 kernel/power/snapshot.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

    if (page_is_guard(page))
@@ -1387,9 +1387,6 @@ static struct page *saveable_page(struct zone
*zone, unsigned long pfn)

    BUG_ON(PageHighMem(page));

-   if (swsusp_page_is_forbidden(page) || swsusp_page_is_free(page))
-       return NULL;
-
    if (PageOffline(page))
        return NULL;

@@ -1397,6 +1394,9 @@ static struct page *saveable_page(struct zone
*zone, unsigned long pfn)
        && (!kernel_page_present(page) || pfn_is_nosave(pfn)))
        return NULL;

+   if (swsusp_page_is_forbidden(page) || swsusp_page_is_free(page))
+       return NULL;
+
    if (page_is_guard(page))
        return NULL;

Comments

lijun April 7, 2025, 2:03 a.m. UTC | #1
yes, that is what i want to say.  I would like to seek your advice,
is it still possible that the page is not forbideen page and is
not free, but the page is  reserved or offline?.




> On Thu, Apr 3, 2025 at 4:03 AM lijun <
> lijun01@kylinos.cn
> > wrote:
> > From: Li Jun <
> > lijun01@kylinos.cn
> > >
> > 
> > 
> > 
> > Date: Mon, 10 Feb 2025 10:40:58 +0800
> > Subject: [PATCH v3] hibernate: pageoffline may be first judged
> > 
> > 'PageReserved' and 'PageOffline' have weights greater
> > than 'is_forbidden' and 'is_free'.so,PageReserved
> > and PageOffline should be first judged.
> > just as the page is free,but is reserved.
> > 
> > the ordering of checks in 'for_each_populated_zone(zone)'
> > It means that hundreds of thousands or even millions of
> > pages need to be judged, reducing the judgment of one
> > statement may save some time.
> 
> So this is regarded as a possible optimization.
> 
> My understanding of it is as follows:
> 
> Since PageReserved(page) and PageOffline(page) are simpler than the
> other checks in saveable_highmem_page(), checking them first is
> likely
> to reduce overhead somewhat, or at least it would not make a
> measurable difference.
> 
> Is this what you wanted to say?
> 
> > Signed-off-by: Li Jun <
> > lijun01@kylinos.cn
> > >
> > ---
> >  kernel/power/snapshot.c | 10 +++++-----
> >  1 file changed, 5 insertions(+), 5 deletions(-)
> > 
> > diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c
> > index c9fb559a6399..dfbccddb28f1 100644
> > --- a/kernel/power/snapshot.c
> > +++ b/kernel/power/snapshot.c
> > @@ -1328,10 +1328,10 @@ static struct page
> > *saveable_highmem_page(struct zone *zone, unsigned long pfn)
> > 
> >     BUG_ON(!PageHighMem(page));
> > 
> > -   if (swsusp_page_is_forbidden(page)
> > ||  swsusp_page_is_free(page))
> > +   if (PageReserved(page) || PageOffline(page))
> >         return NULL;
> > 
> > -   if (PageReserved(page) || PageOffline(page))
> > +   if (swsusp_page_is_forbidden(page)
> > ||  swsusp_page_is_free(page))
> >         return NULL;
> > 
> >     if (page_is_guard(page))
> > @@ -1387,9 +1387,6 @@ static struct page *saveable_page(struct zone
> > *zone, unsigned long pfn)
> > 
> >     BUG_ON(PageHighMem(page));
> > 
> > -   if (swsusp_page_is_forbidden(page) ||
> > swsusp_page_is_free(page))
> > -       return NULL;
> > -
> >     if (PageOffline(page))
> >         return NULL;
> > 
> > @@ -1397,6 +1394,9 @@ static struct page *saveable_page(struct zone
> > *zone, unsigned long pfn)
> >         && (!kernel_page_present(page) || pfn_is_nosave(pfn)))
> >         return NULL;
> > 
> > +   if (swsusp_page_is_forbidden(page) ||
> > swsusp_page_is_free(page))
> > +       return NULL;
> > +
> >     if (page_is_guard(page))
> >         return NULL;
> > 
> > --
> > 2.34.1
> > 
> >
Pavel Machek April 25, 2025, 6:41 a.m. UTC | #2
Hi!

> >From 73ea74f11c4e188b9642eae5ef2e47a9310e97bb Mon Sep 17 00:00:00 2001
> From: Li Jun <lijun01@kylinos.cn>
> Date: Fri, 25 Apr 2025 13:44:23 +0800
> Subject: [PATCH] hibernate: add minimum image size in hibernation
> 
> When I want to complete S4 in a shorter amount of time,
> so,add this config,and set the config to n,
> the image_size = 2/5 * totalram_pages,in hibernate_image_size_init
> PM: Allocated 2908160 kbytes in 0.10 seconds
> PM: Wrote 3000464 kbytes in 4.13 seconds
> PM: Read 3000464 kbytes in 5.67 seconds
> 
> and set the config to y:
> the image_size = 0,in hibernate_image_size_init,
> PM: Allocated 817872 kbytes in 1.76 seconds,
> PM: Wrote 908368 kbytes in 1.16 seconds,
> PM: Read 908368 kbytes in 1.82 seconds,
> 
> 0.10 + 4.13 + 5.76 = 9.99
> 1.76 + 1.16 + 1.82 = 4.74
> 
> Reduced time by 53%, the test is in 8G mem,if the mem is 16G or more,
> this config can reduce more time.
> 
> the image_size =0, just shrink more NR_SLAB_RECLAIMABLE,NR_ACTIVE_ANON,
> NR_INACTIVE_ANON,NR_ACTIVE_FILE,NR_INACTIVE_FILE pages,S4 is still
> normal,so add a shorter time option.

Patch is whitespace damaged.

Plus, this should be runtime option, not Kconfig.

BR,
								Pavel

> Signed-off-by: Li Jun <lijun01@kylinos.cn>
> ---
>  kernel/power/Kconfig | 10 ++++++++++
>  kernel/power/snapshot.c | 6 +++++-
>  2 files changed, 15 insertions(+), 1 deletion(-)
> 
> diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig
> index 54a623680019..fef014fc31b1 100644
> --- a/kernel/power/Kconfig
> +++ b/kernel/power/Kconfig
> @@ -80,6 +80,16 @@ config HIBERNATION
>  For more information take a look at
> <file:Documentation/power/swsusp.rst>.
> +config MINIMUM_HIBERNATION_IMAGE_SIZE
> + bool "Minimum Hibernation Image Size"
> + depends on HIBERNATION
> + default n
> + help
> + Enable create the smallest image in Hibernation
> + Set image_size = 0
> + shrink more temp memory
> + That may can reduces the s4 time.
> +
>  config HIBERNATION_SNAPSHOT_DEV
>  bool "Userspace snapshot device"
>  depends on HIBERNATION
> diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c
> index 4e6e24e8b854..dffd5645b875 100644
> --- a/kernel/power/snapshot.c
> +++ b/kernel/power/snapshot.c
> @@ -138,7 +138,11 @@ unsigned long image_size;
>  void __init hibernate_image_size_init(void)
>  {
> - image_size = ((totalram_pages() * 2) / 5) * PAGE_SIZE;
> + #ifdef CONFIG_MINIMUM_HIBERNATION_IMAGE_SIZE
> + image_size = 0;
> + #else
> + image_size = ((totalram_pages() * 2) / 5) * PAGE_SIZE;
> + #endif
>  }
>  /*
> --
> 2.34.1
> 
>
diff mbox series

Patch

diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c
index c9fb559a6399..dfbccddb28f1 100644
--- a/kernel/power/snapshot.c
+++ b/kernel/power/snapshot.c
@@ -1328,10 +1328,10 @@  static struct page
*saveable_highmem_page(struct zone *zone, unsigned long pfn)

    BUG_ON(!PageHighMem(page));

-   if (swsusp_page_is_forbidden(page) ||  swsusp_page_is_free(page))
+   if (PageReserved(page) || PageOffline(page))
        return NULL;

-   if (PageReserved(page) || PageOffline(page))
+   if (swsusp_page_is_forbidden(page) ||  swsusp_page_is_free(page))
        return NULL;