aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2006-01-06 03:15:22 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-01-06 11:33:42 -0500
commitb3a93a255ec33a04776ec50efb30b7a99168dda2 (patch)
tree9cfd05925ce0548bec68ca1544f25173e2fb177b /kernel
parentc050ca78705592d440c22055865bf4de40fe2a4c (diff)
[PATCH] swsusp: limit image size
Limit the size of the suspend image to approx. 500 MB, which should improve the overall performance of swsusp on systems with more than 1 GB of RAM. It introduces the constant IMAGE_SIZE that can be set to the preferred size of the image (in MB) and modifies the memory-shrinking part of swsusp to take this constant into account (500 is the default value of IMAGE_SIZE). 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>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/power/power.h8
-rw-r--r--kernel/power/swsusp.c17
2 files changed, 11 insertions, 14 deletions
diff --git a/kernel/power/power.h b/kernel/power/power.h
index e521e61e0d95..9b0459903613 100644
--- a/kernel/power/power.h
+++ b/kernel/power/power.h
@@ -53,12 +53,10 @@ extern unsigned int nr_copy_pages;
53extern struct pbe *pagedir_nosave; 53extern struct pbe *pagedir_nosave;
54 54
55/* 55/*
56 * This compilation switch determines the way in which memory will be freed 56 * Preferred image size in MB (set it to zero to get the smallest
57 * during suspend. If defined, only as much memory will be freed as needed 57 * image possible)
58 * to complete the suspend, which will make it go faster. Otherwise, the
59 * largest possible amount of memory will be freed.
60 */ 58 */
61#define FAST_FREE 1 59#define IMAGE_SIZE 500
62 60
63extern asmlinkage int swsusp_arch_suspend(void); 61extern asmlinkage int swsusp_arch_suspend(void);
64extern asmlinkage int swsusp_arch_resume(void); 62extern asmlinkage int swsusp_arch_resume(void);
diff --git a/kernel/power/swsusp.c b/kernel/power/swsusp.c
index f77f9397a364..6d5ceaf4c364 100644
--- a/kernel/power/swsusp.c
+++ b/kernel/power/swsusp.c
@@ -626,7 +626,7 @@ int swsusp_write(struct pbe *pblist, unsigned int nr_pages)
626 626
627int swsusp_shrink_memory(void) 627int swsusp_shrink_memory(void)
628{ 628{
629 long tmp; 629 long size, tmp;
630 struct zone *zone; 630 struct zone *zone;
631 unsigned long pages = 0; 631 unsigned long pages = 0;
632 unsigned int i = 0; 632 unsigned int i = 0;
@@ -634,11 +634,11 @@ int swsusp_shrink_memory(void)
634 634
635 printk("Shrinking memory... "); 635 printk("Shrinking memory... ");
636 do { 636 do {
637#ifdef FAST_FREE 637 size = 2 * count_highmem_pages();
638 tmp = 2 * count_highmem_pages(); 638 size += size / 50 + count_data_pages();
639 tmp += tmp / 50 + count_data_pages(); 639 size += (size + PBES_PER_PAGE - 1) / PBES_PER_PAGE +
640 tmp += (tmp + PBES_PER_PAGE - 1) / PBES_PER_PAGE +
641 PAGES_FOR_IO; 640 PAGES_FOR_IO;
641 tmp = size;
642 for_each_zone (zone) 642 for_each_zone (zone)
643 if (!is_highmem(zone)) 643 if (!is_highmem(zone))
644 tmp -= zone->free_pages; 644 tmp -= zone->free_pages;
@@ -647,11 +647,10 @@ int swsusp_shrink_memory(void)
647 if (!tmp) 647 if (!tmp)
648 return -ENOMEM; 648 return -ENOMEM;
649 pages += tmp; 649 pages += tmp;
650 } else if (size > (IMAGE_SIZE * 1024 * 1024) / PAGE_SIZE) {
651 tmp = shrink_all_memory(SHRINK_BITE);
652 pages += tmp;
650 } 653 }
651#else
652 tmp = shrink_all_memory(SHRINK_BITE);
653 pages += tmp;
654#endif
655 printk("\b%c", p[i++%4]); 654 printk("\b%c", p[i++%4]);
656 } while (tmp > 0); 655 } while (tmp > 0);
657 printk("\bdone (%lu pages freed)\n", pages); 656 printk("\bdone (%lu pages freed)\n", pages);