public inbox for linux-pm@vger.kernel.org
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Linux PM List <linux-pm@lists.linux-foundation.org>
Cc: Sergio Luis <sergio@larces.uece.br>,
	Lauro Salmito <laurosalmito@gmail.com>,
	Greg Kroah-Hartman <gregkh@suse.de>,
	Heiko Carstens <heiko.carstens@de.ibm.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Magnus Damm <damm@igel.co.jp>, Ingo Molnar <mingo@elte.hu>,
	Wu Fengguang <fengguang.wu@intel.com>,
	Jaswinder Singh Rajput <jaswinder@kernel.org>
Subject: [PATCH 13/19] PM/Hibernate: Move memory shrinking to snapshot.c (rev. 2)
Date: Thu, 11 Jun 2009 22:49:10 +0000 (UTC)
Date: Thu Jun 11 23:25:58 CEST 2009	[thread overview]
Message-ID: <S4AoGnG.A.EH.7gYMKB@chimera> (raw)
In-Reply-To: <0615007ad8090a890586d530b5d3bb98da566014.1244752872.git.rjw@sisk.pl>

From: Rafael J. Wysocki <rjw@sisk.pl>

A future patch is going to modify the memory shrinking code so that
it will make memory allocations to free memory instead of using an
artificial memory shrinking mechanism for that.  For this purpose it
is convenient to move swsusp_shrink_memory() from
kernel/power/swsusp.c to kernel/power/snapshot.c, because the new
memory-shrinking code is going to use things that are local to
kernel/power/snapshot.c .

[rev. 2: Make some functions static and remove their headers from
 kernel/power/power.h]

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Acked-by: Pavel Machek <pavel@ucw.cz>
Acked-by: Wu Fengguang <fengguang.wu@intel.com>
---
 kernel/power/power.h    |    4 +--
 kernel/power/snapshot.c |   80 +++++++++++++++++++++++++++++++++++++++++++++-
 kernel/power/swsusp.c   |   76 --------------------------------------------
 3 files changed, 79 insertions(+), 81 deletions(-)

diff --git a/kernel/power/power.h b/kernel/power/power.h
index 46b5ec7..ec4dbdf 100644
--- a/kernel/power/power.h
+++ b/kernel/power/power.h
@@ -74,7 +74,7 @@ extern asmlinkage int swsusp_arch_resume(void);
 
 extern int create_basic_memory_bitmaps(void);
 extern void free_basic_memory_bitmaps(void);
-extern unsigned int count_data_pages(void);
+extern int swsusp_shrink_memory(void);
 
 /**
  *	Auxiliary structure used for reading the snapshot image data and
@@ -149,7 +149,6 @@ extern int swsusp_swap_in_use(void);
 
 /* kernel/power/disk.c */
 extern int swsusp_check(void);
-extern int swsusp_shrink_memory(void);
 extern void swsusp_free(void);
 extern int swsusp_read(unsigned int *flags_p);
 extern int swsusp_write(unsigned int flags);
@@ -176,7 +175,6 @@ extern int pm_notifier_call_chain(unsigned long val);
 #endif
 
 #ifdef CONFIG_HIGHMEM
-unsigned int count_highmem_pages(void);
 int restore_highmem(void);
 #else
 static inline unsigned int count_highmem_pages(void) { return 0; }
diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c
index 33e2e4a..523a451 100644
--- a/kernel/power/snapshot.c
+++ b/kernel/power/snapshot.c
@@ -39,6 +39,14 @@ static int swsusp_page_is_free(struct page *);
 static void swsusp_set_page_forbidden(struct page *);
 static void swsusp_unset_page_forbidden(struct page *);
 
+/*
+ * Preferred image size in bytes (tunable via /sys/power/image_size).
+ * When it is set to N, swsusp will do its best to ensure the image
+ * size will not exceed N bytes, but if that is impossible, it will
+ * try to create the smallest image possible.
+ */
+unsigned long image_size = 500 * 1024 * 1024;
+
 /* List of PBEs needed for restoring the pages that were allocated before
  * the suspend and included in the suspend image, but have also been
  * allocated by the "resume" kernel, so their contents cannot be written
@@ -840,7 +848,7 @@ static struct page *saveable_highmem_page(struct zone *zone, unsigned long pfn)
  *	pages.
  */
 
-unsigned int count_highmem_pages(void)
+static unsigned int count_highmem_pages(void)
 {
 	struct zone *zone;
 	unsigned int n = 0;
@@ -902,7 +910,7 @@ static struct page *saveable_page(struct zone *zone, unsigned long pfn)
  *	pages.
  */
 
-unsigned int count_data_pages(void)
+static unsigned int count_data_pages(void)
 {
 	struct zone *zone;
 	unsigned long pfn, max_zone_pfn;
@@ -1058,6 +1066,74 @@ void swsusp_free(void)
 	buffer = NULL;
 }
 
+/**
+ *	swsusp_shrink_memory -  Try to free as much memory as needed
+ *
+ *	... but do not OOM-kill anyone
+ *
+ *	Notice: all userland should be stopped before it is called, or
+ *	livelock is possible.
+ */
+
+#define SHRINK_BITE	10000
+static inline unsigned long __shrink_memory(long tmp)
+{
+	if (tmp > SHRINK_BITE)
+		tmp = SHRINK_BITE;
+	return shrink_all_memory(tmp);
+}
+
+int swsusp_shrink_memory(void)
+{
+	long tmp;
+	struct zone *zone;
+	unsigned long pages = 0;
+	unsigned int i = 0;
+	char *p = "-\\|/";
+	struct timeval start, stop;
+
+	printk(KERN_INFO "PM: Shrinking memory...  ");
+	do_gettimeofday(&start);
+	do {
+		long size, highmem_size;
+
+		highmem_size = count_highmem_pages();
+		size = count_data_pages() + PAGES_FOR_IO + SPARE_PAGES;
+		tmp = size;
+		size += highmem_size;
+		for_each_populated_zone(zone) {
+			tmp += snapshot_additional_pages(zone);
+			if (is_highmem(zone)) {
+				highmem_size -=
+					zone_page_state(zone, NR_FREE_PAGES);
+			} else {
+				tmp -= zone_page_state(zone, NR_FREE_PAGES);
+				tmp += zone->lowmem_reserve[ZONE_NORMAL];
+			}
+		}
+
+		if (highmem_size < 0)
+			highmem_size = 0;
+
+		tmp += highmem_size;
+		if (tmp > 0) {
+			tmp = __shrink_memory(tmp);
+			if (!tmp)
+				return -ENOMEM;
+			pages += tmp;
+		} else if (size > image_size / PAGE_SIZE) {
+			tmp = __shrink_memory(size - (image_size / PAGE_SIZE));
+			pages += tmp;
+		}
+		printk("\b%c", p[i++%4]);
+	} while (tmp > 0);
+	do_gettimeofday(&stop);
+	printk("\bdone (%lu pages freed)\n", pages);
+	swsusp_show_speed(&start, &stop, pages, "Freed");
+
+	return 0;
+}
+
 #ifdef CONFIG_HIGHMEM
 /**
   *	count_pages_for_highmem - compute the number of non-highmem pages
diff --git a/kernel/power/swsusp.c b/kernel/power/swsusp.c
index 78c3504..87b901c 100644
--- a/kernel/power/swsusp.c
+++ b/kernel/power/swsusp.c
@@ -55,14 +55,6 @@
 
 #include "power.h"
 
-/*
- * Preferred image size in bytes (tunable via /sys/power/image_size).
- * When it is set to N, swsusp will do its best to ensure the image
- * size will not exceed N bytes, but if that is impossible, it will
- * try to create the smallest image possible.
- */
-unsigned long image_size = 500 * 1024 * 1024;
-
 int in_suspend __nosavedata = 0;
 
 /**
@@ -195,74 +187,6 @@ void swsusp_show_speed(struct timeval *start, struct timeval *stop,
 			kps / 1000, (kps % 1000) / 10);
 }
 
-/**
- *	swsusp_shrink_memory -  Try to free as much memory as needed
- *
- *	... but do not OOM-kill anyone
- *
- *	Notice: all userland should be stopped before it is called, or
- *	livelock is possible.
- */
-
-#define SHRINK_BITE	10000
-static inline unsigned long __shrink_memory(long tmp)
-{
-	if (tmp > SHRINK_BITE)
-		tmp = SHRINK_BITE;
-	return shrink_all_memory(tmp);
-}
-
-int swsusp_shrink_memory(void)
-{
-	long tmp;
-	struct zone *zone;
-	unsigned long pages = 0;
-	unsigned int i = 0;
-	char *p = "-\\|/";
-	struct timeval start, stop;
-
-	printk(KERN_INFO "PM: Shrinking memory...  ");
-	do_gettimeofday(&start);
-	do {
-		long size, highmem_size;
-
-		highmem_size = count_highmem_pages();
-		size = count_data_pages() + PAGES_FOR_IO + SPARE_PAGES;
-		tmp = size;
-		size += highmem_size;
-		for_each_populated_zone(zone) {
-			tmp += snapshot_additional_pages(zone);
-			if (is_highmem(zone)) {
-				highmem_size -=
-					zone_page_state(zone, NR_FREE_PAGES);
-			} else {
-				tmp -= zone_page_state(zone, NR_FREE_PAGES);
-				tmp += zone->lowmem_reserve[ZONE_NORMAL];
-			}
-		}
-
-		if (highmem_size < 0)
-			highmem_size = 0;
-
-		tmp += highmem_size;
-		if (tmp > 0) {
-			tmp = __shrink_memory(tmp);
-			if (!tmp)
-				return -ENOMEM;
-			pages += tmp;
-		} else if (size > image_size / PAGE_SIZE) {
-			tmp = __shrink_memory(size - (image_size / PAGE_SIZE));
-			pages += tmp;
-		}
-		printk("\b%c", p[i++%4]);
-	} while (tmp > 0);
-	do_gettimeofday(&stop);
-	printk("\bdone (%lu pages freed)\n", pages);
-	swsusp_show_speed(&start, &stop, pages, "Freed");
-
-	return 0;
-}
-
 /*
  * Platforms, like ACPI, may want us to save some memory used by them during
  * hibernation and to restore the contents of this memory during the subsequent
-- 
1.5.2.4

  parent reply	other threads:[~2009-06-11 22:49 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-11 21:42 [PATCH 00/19] What's in the suspend tree for 2.6.31 Rafael J. Wysocki
2009-06-11 21:42 ` [PATCH 01/19] PM: Warn if interrupts are enabled during suspend-resume of sysdevs Rafael J. Wysocki
2009-06-12 10:37   ` Pavel Machek
2009-06-12 10:37   ` Pavel Machek
2009-06-11 21:48 ` [PATCH 03/19] x86: unify power/cpu_(32|64) global variables Rafael J. Wysocki
2009-06-11 21:48 ` [PATCH 05/19] x86: unify power/cpu_(32|64) regarding restoring processor state Rafael J. Wysocki
2009-06-11 21:48 ` [PATCH 02/19] x86: unify power/cpu_(32|64) headers Rafael J. Wysocki
2009-06-11 21:48 ` [PATCH 04/19] x86: unify power/cpu_(32|64) regarding saving processor state Rafael J. Wysocki
2009-06-11 21:48 ` [PATCH 08/19] PM: Remove unused asm/suspend.h Rafael J. Wysocki
2009-06-11 21:48 ` [PATCH 07/19] x86: unify power/cpu_(32|64).c Rafael J. Wysocki
2009-06-11 21:53 ` [PATCH 12/19] PM/Suspend: Do not shrink memory before suspend Rafael J. Wysocki
2009-06-11 21:56 ` [PATCH 11/19] PM: Remove bus_type suspend_late()/resume_early() V2 Rafael J. Wysocki
2009-06-11 21:59 ` [PATCH 14/19] PM: Remove device_type suspend()/resume() Rafael J. Wysocki
2009-06-11 22:00 ` [PATCH 15/19] Driver Core: Rework platform suspend/resume, print warning Rafael J. Wysocki
2009-06-11 22:00 ` [PATCH 13/19] PM/Hibernate: Move memory shrinking to snapshot.c (rev. 2) Rafael J. Wysocki
2009-06-11 22:01 ` [PATCH 09/19] PM: Rename device_power_down/up() Rafael J. Wysocki
2009-06-11 22:01 ` [PATCH 16/19] PM: Separate suspend to RAM functionality from core Rafael J. Wysocki
2009-06-11 22:02 ` [PATCH 10/19] PM core: rename suspend and resume functions Rafael J. Wysocki
2009-06-11 22:03 ` Rafael J. Wysocki
2009-06-11 22:06 ` [PATCH 00/19] What's in the suspend tree for 2.6.31 Pavel Machek
2009-06-11 22:09 ` [PATCH 10/19] PM core: rename suspend and resume functions Rafael J. Wysocki
2009-06-11 22:12 ` [PATCH 18/19] PM/Hibernate: Move NVS routines into a seperate file (v2) Rafael J. Wysocki
2009-06-11 22:21 ` [PATCH 02/19] x86: unify power/cpu_(32|64) headers Rafael J. Wysocki
2009-06-11 22:21 ` [PATCH 19/19] PM: Add empty suspend/resume device irq functions Rafael J. Wysocki
2009-06-11 22:22 ` [PATCH 17/19] PM/Hibernate: Rename disk.c to hibernate.c Rafael J. Wysocki
     [not found] ` <20090611220652.GA18682@elf.ucw.cz>
2009-06-11 22:24   ` [PATCH 00/19] What's in the suspend tree for 2.6.31 Rafael J. Wysocki
2009-06-11 22:26 ` [PATCH 18/19] PM/Hibernate: Move NVS routines into a seperate file (v2) Rafael J. Wysocki
2009-06-11 22:29 ` [PATCH 02/19] x86: unify power/cpu_(32|64) headers Rafael J. Wysocki
2009-06-12 10:37   ` Pavel Machek
2009-06-12 10:37   ` Pavel Machek
2009-06-11 22:34 ` [PATCH 03/19] x86: unify power/cpu_(32|64) global variables Rafael J. Wysocki
2009-06-12 10:44   ` Pavel Machek
2009-06-11 22:36 ` [PATCH 04/19] x86: unify power/cpu_(32|64) regarding saving processor state Rafael J. Wysocki
2009-06-11 22:39 ` [PATCH 05/19] x86: unify power/cpu_(32|64) regarding restoring " Rafael J. Wysocki
2009-06-11 22:47 ` [PATCH 07/19] x86: unify power/cpu_(32|64).c Rafael J. Wysocki
2009-06-12 10:50   ` Pavel Machek
2009-06-11 22:48 ` [PATCH 09/19] PM: Rename device_power_down/up() Rafael J. Wysocki
2009-06-12 10:51   ` Pavel Machek
2009-06-11 22:48 ` [PATCH 10/19] PM core: rename suspend and resume functions Rafael J. Wysocki
2009-06-12 10:55   ` Pavel Machek
2009-06-11 22:48 ` [PATCH 11/19] PM: Remove bus_type suspend_late()/resume_early() V2 Rafael J. Wysocki
2009-06-11 22:48 ` [PATCH 12/19] PM/Suspend: Do not shrink memory before suspend Rafael J. Wysocki
2009-06-12 11:02   ` Pavel Machek
     [not found]   ` <20090612110235.GL18682@elf.ucw.cz>
2009-06-12 19:04     ` Rafael J. Wysocki
2009-06-11 22:49 ` Rafael J. Wysocki [this message]
2009-06-11 22:49 ` [PATCH 14/19] PM: Remove device_type suspend()/resume() Rafael J. Wysocki
2009-06-12 11:03   ` Pavel Machek
2009-06-11 22:49 ` [PATCH 15/19] Driver Core: Rework platform suspend/resume, print warning Rafael J. Wysocki
2009-06-12 11:10   ` Pavel Machek
2009-06-11 22:49 ` [PATCH 16/19] PM: Separate suspend to RAM functionality from core Rafael J. Wysocki
2009-06-11 22:49 ` [PATCH 17/19] PM/Hibernate: Rename disk.c to hibernate.c Rafael J. Wysocki
2009-06-11 22:50 ` [PATCH 18/19] PM/Hibernate: Move NVS routines into a seperate file (v2) Rafael J. Wysocki
2009-06-11 22:50 ` [PATCH 19/19] PM: Add empty suspend/resume device irq functions Rafael J. Wysocki
2009-06-12 11:13   ` Pavel Machek
     [not found]   ` <20090612111317.GP18682@elf.ucw.cz>
2009-06-12 11:32     ` Heiko Carstens
     [not found]     ` <20090612113218.GB6355@osiris.boeblingen.de.ibm.com>
2009-06-12 11:36       ` Pavel Machek
2009-06-11 23:04 ` [PATCH 08/19] PM: Remove unused asm/suspend.h Rafael J. Wysocki

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=S4AoGnG.A.EH.7gYMKB@chimera \
    --to=rjw@sisk.pl \
    --cc=damm@igel.co.jp \
    --cc=fengguang.wu@intel.com \
    --cc=gregkh@suse.de \
    --cc=heiko.carstens@de.ibm.com \
    --cc=jaswinder@kernel.org \
    --cc=laurosalmito@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@lists.linux-foundation.org \
    --cc=mingo@elte.hu \
    --cc=sergio@larces.uece.br \
    /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