Message ID | a55a3417634ae3ab546121d77af083cbf4fcdc3f.camel@kylinos.cn |
---|---|
State | New |
Headers | show |
Series | [v3] hibernate: pageoffline may be first judged | expand |
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 > > > >
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 --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;