aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2006-01-06 03:15:56 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-01-06 11:33:42 -0500
commitca0aec0f7a94bf9f07fefa8bfd23282d4e8ceb8a (patch)
tree5f31f11eba908545d5e02698fe9c163a8612dd26
parentb3a93a255ec33a04776ec50efb30b7a99168dda2 (diff)
[PATCH] swsusp: make image size limit tunable
Make the suspend image size limit tunable via /sys/power/image_size. It is necessary for systems on which there is a limited amount of swap available for suspend. It can also be useful for optimizing performance of swsusp on systems with 1 GB of RAM or more. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Acked-by: Pavel Machek <pavel@ucw.cz> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--Documentation/power/interface.txt11
-rw-r--r--Documentation/power/swsusp.txt5
-rw-r--r--kernel/power/disk.c20
-rw-r--r--kernel/power/power.h7
-rw-r--r--kernel/power/swsusp.c10
5 files changed, 47 insertions, 6 deletions
diff --git a/Documentation/power/interface.txt b/Documentation/power/interface.txt
index f5ebda5f4276..bd4ffb5bd49a 100644
--- a/Documentation/power/interface.txt
+++ b/Documentation/power/interface.txt
@@ -41,3 +41,14 @@ to. Writing to this file will accept one of
41It will only change to 'firmware' or 'platform' if the system supports 41It will only change to 'firmware' or 'platform' if the system supports
42it. 42it.
43 43
44/sys/power/image_size controls the size of the image created by
45the suspend-to-disk mechanism. It can be written a string
46representing a non-negative integer that will be used as an upper
47limit of the image size, in megabytes. The suspend-to-disk mechanism will
48do its best to ensure the image size will not exceed that number. However,
49if this turns out to be impossible, it will try to suspend anyway using the
50smallest image possible. In particular, if "0" is written to this file, the
51suspend image will be as small as possible.
52
53Reading from this file will display the current image size limit, which
54is set to 500 MB by default.
diff --git a/Documentation/power/swsusp.txt b/Documentation/power/swsusp.txt
index b0d50840788e..cd0fcd89a6f0 100644
--- a/Documentation/power/swsusp.txt
+++ b/Documentation/power/swsusp.txt
@@ -27,6 +27,11 @@ echo shutdown > /sys/power/disk; echo disk > /sys/power/state
27 27
28echo platform > /sys/power/disk; echo disk > /sys/power/state 28echo platform > /sys/power/disk; echo disk > /sys/power/state
29 29
30If you want to limit the suspend image size to N megabytes, do
31
32echo N > /sys/power/image_size
33
34before suspend (it is limited to 500 MB by default).
30 35
31Encrypted suspend image: 36Encrypted suspend image:
32------------------------ 37------------------------
diff --git a/kernel/power/disk.c b/kernel/power/disk.c
index 9e51cdf7b78d..e24446f8d8cd 100644
--- a/kernel/power/disk.c
+++ b/kernel/power/disk.c
@@ -365,9 +365,29 @@ out:
365 365
366power_attr(resume); 366power_attr(resume);
367 367
368static ssize_t image_size_show(struct subsystem * subsys, char *buf)
369{
370 return sprintf(buf, "%u\n", image_size);
371}
372
373static ssize_t image_size_store(struct subsystem * subsys, const char * buf, size_t n)
374{
375 unsigned int size;
376
377 if (sscanf(buf, "%u", &size) == 1) {
378 image_size = size;
379 return n;
380 }
381
382 return -EINVAL;
383}
384
385power_attr(image_size);
386
368static struct attribute * g[] = { 387static struct attribute * g[] = {
369 &disk_attr.attr, 388 &disk_attr.attr,
370 &resume_attr.attr, 389 &resume_attr.attr,
390 &image_size_attr.attr,
371 NULL, 391 NULL,
372}; 392};
373 393
diff --git a/kernel/power/power.h b/kernel/power/power.h
index 9b0459903613..273a5b1d70be 100644
--- a/kernel/power/power.h
+++ b/kernel/power/power.h
@@ -52,11 +52,8 @@ extern const void __nosave_begin, __nosave_end;
52extern unsigned int nr_copy_pages; 52extern unsigned int nr_copy_pages;
53extern struct pbe *pagedir_nosave; 53extern struct pbe *pagedir_nosave;
54 54
55/* 55/* Preferred image size in MB (default 500) */
56 * Preferred image size in MB (set it to zero to get the smallest 56extern unsigned int image_size;
57 * image possible)
58 */
59#define IMAGE_SIZE 500
60 57
61extern asmlinkage int swsusp_arch_suspend(void); 58extern asmlinkage int swsusp_arch_suspend(void);
62extern asmlinkage int swsusp_arch_resume(void); 59extern asmlinkage int swsusp_arch_resume(void);
diff --git a/kernel/power/swsusp.c b/kernel/power/swsusp.c
index 6d5ceaf4c364..d760a6a719f0 100644
--- a/kernel/power/swsusp.c
+++ b/kernel/power/swsusp.c
@@ -69,6 +69,14 @@
69 69
70#include "power.h" 70#include "power.h"
71 71
72/*
73 * Preferred image size in MB (tunable via /sys/power/image_size).
74 * When it is set to N, swsusp will do its best to ensure the image
75 * size will not exceed N MB, but if that is impossible, it will
76 * try to create the smallest image possible.
77 */
78unsigned int image_size = 500;
79
72#ifdef CONFIG_HIGHMEM 80#ifdef CONFIG_HIGHMEM
73unsigned int count_highmem_pages(void); 81unsigned int count_highmem_pages(void);
74int save_highmem(void); 82int save_highmem(void);
@@ -647,7 +655,7 @@ int swsusp_shrink_memory(void)
647 if (!tmp) 655 if (!tmp)
648 return -ENOMEM; 656 return -ENOMEM;
649 pages += tmp; 657 pages += tmp;
650 } else if (size > (IMAGE_SIZE * 1024 * 1024) / PAGE_SIZE) { 658 } else if (size > (image_size * 1024 * 1024) / PAGE_SIZE) {
651 tmp = shrink_all_memory(SHRINK_BITE); 659 tmp = shrink_all_memory(SHRINK_BITE);
652 pages += tmp; 660 pages += tmp;
653 } 661 }