aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/power/snapshot.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c
index b4a923e59bc5..72787f925630 100644
--- a/kernel/power/snapshot.c
+++ b/kernel/power/snapshot.c
@@ -33,7 +33,6 @@
33 33
34#include "power.h" 34#include "power.h"
35 35
36
37#ifdef CONFIG_HIGHMEM 36#ifdef CONFIG_HIGHMEM
38struct highmem_page { 37struct highmem_page {
39 char *data; 38 char *data;
@@ -88,12 +87,10 @@ static int save_highmem_zone(struct zone *zone)
88 } 87 }
89 return 0; 88 return 0;
90} 89}
91#endif /* CONFIG_HIGHMEM */
92 90
93 91
94static int save_highmem(void) 92static int save_highmem(void)
95{ 93{
96#ifdef CONFIG_HIGHMEM
97 struct zone *zone; 94 struct zone *zone;
98 int res = 0; 95 int res = 0;
99 96
@@ -104,13 +101,11 @@ static int save_highmem(void)
104 if (res) 101 if (res)
105 return res; 102 return res;
106 } 103 }
107#endif
108 return 0; 104 return 0;
109} 105}
110 106
111int restore_highmem(void) 107int restore_highmem(void)
112{ 108{
113#ifdef CONFIG_HIGHMEM
114 printk("swsusp: Restoring Highmem\n"); 109 printk("swsusp: Restoring Highmem\n");
115 while (highmem_copy) { 110 while (highmem_copy) {
116 struct highmem_page *save = highmem_copy; 111 struct highmem_page *save = highmem_copy;
@@ -123,9 +118,12 @@ int restore_highmem(void)
123 free_page((long) save->data); 118 free_page((long) save->data);
124 kfree(save); 119 kfree(save);
125 } 120 }
126#endif
127 return 0; 121 return 0;
128} 122}
123#else
124static int save_highmem(void) { return 0; }
125int restore_highmem(void) { return 0; }
126#endif /* CONFIG_HIGHMEM */
129 127
130 128
131static int pfn_is_nosave(unsigned long pfn) 129static int pfn_is_nosave(unsigned long pfn)
@@ -144,10 +142,10 @@ static int pfn_is_nosave(unsigned long pfn)
144 * isn't part of a free chunk of pages. 142 * isn't part of a free chunk of pages.
145 */ 143 */
146 144
147static int saveable(struct zone * zone, unsigned long * zone_pfn) 145static int saveable(struct zone *zone, unsigned long *zone_pfn)
148{ 146{
149 unsigned long pfn = *zone_pfn + zone->zone_start_pfn; 147 unsigned long pfn = *zone_pfn + zone->zone_start_pfn;
150 struct page * page; 148 struct page *page;
151 149
152 if (!pfn_valid(pfn)) 150 if (!pfn_valid(pfn))
153 return 0; 151 return 0;
@@ -201,7 +199,7 @@ static void copy_data_pages(struct pbe *pblist)
201 SetPageNosaveFree(virt_to_page(p->address)); 199 SetPageNosaveFree(virt_to_page(p->address));
202 for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) { 200 for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) {
203 if (saveable(zone, &zone_pfn)) { 201 if (saveable(zone, &zone_pfn)) {
204 struct page * page; 202 struct page *page;
205 page = pfn_to_page(zone_pfn + zone->zone_start_pfn); 203 page = pfn_to_page(zone_pfn + zone->zone_start_pfn);
206 BUG_ON(!pbe); 204 BUG_ON(!pbe);
207 pbe->orig_address = (unsigned long)page_address(page); 205 pbe->orig_address = (unsigned long)page_address(page);
@@ -295,7 +293,7 @@ static void *alloc_image_page(void)
295 * On each page we set up a list of struct_pbe elements. 293 * On each page we set up a list of struct_pbe elements.
296 */ 294 */
297 295
298struct pbe * alloc_pagedir(unsigned nr_pages) 296struct pbe *alloc_pagedir(unsigned nr_pages)
299{ 297{
300 unsigned num; 298 unsigned num;
301 struct pbe *pblist, *pbe; 299 struct pbe *pblist, *pbe;
@@ -304,12 +302,12 @@ struct pbe * alloc_pagedir(unsigned nr_pages)
304 return NULL; 302 return NULL;
305 303
306 pr_debug("alloc_pagedir(): nr_pages = %d\n", nr_pages); 304 pr_debug("alloc_pagedir(): nr_pages = %d\n", nr_pages);
307 pblist = (struct pbe *)alloc_image_page(); 305 pblist = alloc_image_page();
308 /* FIXME: rewrite this ugly loop */ 306 /* FIXME: rewrite this ugly loop */
309 for (pbe = pblist, num = PBES_PER_PAGE; pbe && num < nr_pages; 307 for (pbe = pblist, num = PBES_PER_PAGE; pbe && num < nr_pages;
310 pbe = pbe->next, num += PBES_PER_PAGE) { 308 pbe = pbe->next, num += PBES_PER_PAGE) {
311 pbe += PB_PAGE_SKIP; 309 pbe += PB_PAGE_SKIP;
312 pbe->next = (struct pbe *)alloc_image_page(); 310 pbe->next = alloc_image_page();
313 } 311 }
314 if (!pbe) { /* get_zeroed_page() failed */ 312 if (!pbe) { /* get_zeroed_page() failed */
315 free_pagedir(pblist); 313 free_pagedir(pblist);