diff options
Diffstat (limited to 'kernel/power/swsusp.c')
-rw-r--r-- | kernel/power/swsusp.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/kernel/power/swsusp.c b/kernel/power/swsusp.c index c4016cbbd3e0..17f669c83012 100644 --- a/kernel/power/swsusp.c +++ b/kernel/power/swsusp.c | |||
@@ -67,9 +67,9 @@ unsigned int count_highmem_pages(void); | |||
67 | int save_highmem(void); | 67 | int save_highmem(void); |
68 | int restore_highmem(void); | 68 | int restore_highmem(void); |
69 | #else | 69 | #else |
70 | static int save_highmem(void) { return 0; } | 70 | static inline int save_highmem(void) { return 0; } |
71 | static int restore_highmem(void) { return 0; } | 71 | static inline int restore_highmem(void) { return 0; } |
72 | static unsigned int count_highmem_pages(void) { return 0; } | 72 | static inline unsigned int count_highmem_pages(void) { return 0; } |
73 | #endif | 73 | #endif |
74 | 74 | ||
75 | /** | 75 | /** |
@@ -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 |
178 | static 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 | ||
179 | int swsusp_shrink_memory(void) | 185 | int swsusp_shrink_memory(void) |
180 | { | 186 | { |
@@ -192,15 +198,17 @@ int swsusp_shrink_memory(void) | |||
192 | PAGES_FOR_IO; | 198 | PAGES_FOR_IO; |
193 | tmp = size; | 199 | tmp = size; |
194 | for_each_zone (zone) | 200 | for_each_zone (zone) |
195 | if (!is_highmem(zone)) | 201 | if (!is_highmem(zone) && populated_zone(zone)) { |
196 | tmp -= zone->free_pages; | 202 | tmp -= zone->free_pages; |
203 | tmp += zone->lowmem_reserve[ZONE_NORMAL]; | ||
204 | } | ||
197 | if (tmp > 0) { | 205 | if (tmp > 0) { |
198 | tmp = shrink_all_memory(SHRINK_BITE); | 206 | tmp = __shrink_memory(tmp); |
199 | if (!tmp) | 207 | if (!tmp) |
200 | return -ENOMEM; | 208 | return -ENOMEM; |
201 | pages += tmp; | 209 | pages += tmp; |
202 | } else if (size > image_size / PAGE_SIZE) { | 210 | } else if (size > image_size / PAGE_SIZE) { |
203 | tmp = shrink_all_memory(SHRINK_BITE); | 211 | tmp = __shrink_memory(size - (image_size / PAGE_SIZE)); |
204 | pages += tmp; | 212 | pages += tmp; |
205 | } | 213 | } |
206 | printk("\b%c", p[i++%4]); | 214 | printk("\b%c", p[i++%4]); |