aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/power
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2006-06-23 05:03:18 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-06-23 10:42:48 -0400
commitd6277db4ab271862ed599da08d78961c70f00002 (patch)
treef11b2f82200c95d17e10779b44a6da37bc03965f /kernel/power
parent7a7c381d25067b9a2bfe025dfcb16459daec0373 (diff)
[PATCH] swsusp: rework memory shrinker
Rework the swsusp's memory shrinker in the following way: - Simplify balance_pgdat() by removing all of the swsusp-related code from it. - Make shrink_all_memory() use shrink_slab() and a new function shrink_all_zones() which calls shrink_active_list() and shrink_inactive_list() directly for each zone in a way that's optimized for suspend. In shrink_all_memory() we try to free exactly as many pages as the caller asks for, preferably in one shot, starting from easier targets.  If slab caches are huge, they are most likely to have enough pages to reclaim.  The inactive lists are next (the zones with more inactive pages go first) etc. Each time shrink_all_memory() attempts to shrink the active and inactive lists for each zone in 5 passes.  In the first pass, only the inactive lists are taken into consideration.  In the next two passes the active lists are also shrunk, but mapped pages are not reclaimed.  In the last two passes the active and inactive lists are shrunk and mapped pages are reclaimed as well. The aim of this is to alter the reclaim logic to choose the best pages to keep on resume and improve the responsiveness of the resumed system. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Signed-off-by: Con Kolivas <kernel@kolivas.org> Signed-off-by: Adrian Bunk <bunk@stusta.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/power')
-rw-r--r--kernel/power/swsusp.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/kernel/power/swsusp.c b/kernel/power/swsusp.c
index c4016cbbd3e0..f9238faf76e4 100644
--- a/kernel/power/swsusp.c
+++ b/kernel/power/swsusp.c
@@ -175,6 +175,12 @@ void free_all_swap_pages(int swap, struct bitmap_page *bitmap)
175 */ 175 */
176 176
177#define SHRINK_BITE 10000 177#define SHRINK_BITE 10000
178static inline unsigned long __shrink_memory(long tmp)
179{
180 if (tmp > SHRINK_BITE)
181 tmp = SHRINK_BITE;
182 return shrink_all_memory(tmp);
183}
178 184
179int swsusp_shrink_memory(void) 185int swsusp_shrink_memory(void)
180{ 186{
@@ -195,12 +201,12 @@ int swsusp_shrink_memory(void)
195 if (!is_highmem(zone)) 201 if (!is_highmem(zone))
196 tmp -= zone->free_pages; 202 tmp -= zone->free_pages;
197 if (tmp > 0) { 203 if (tmp > 0) {
198 tmp = shrink_all_memory(SHRINK_BITE); 204 tmp = __shrink_memory(tmp);
199 if (!tmp) 205 if (!tmp)
200 return -ENOMEM; 206 return -ENOMEM;
201 pages += tmp; 207 pages += tmp;
202 } else if (size > image_size / PAGE_SIZE) { 208 } else if (size > image_size / PAGE_SIZE) {
203 tmp = shrink_all_memory(SHRINK_BITE); 209 tmp = __shrink_memory(size - (image_size / PAGE_SIZE));
204 pages += tmp; 210 pages += tmp;
205 } 211 }
206 printk("\b%c", p[i++%4]); 212 printk("\b%c", p[i++%4]);