aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/power/snapshot.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/power/snapshot.c')
-rw-r--r--kernel/power/snapshot.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c
index 1d276b3ae152..d0d691f976d8 100644
--- a/kernel/power/snapshot.c
+++ b/kernel/power/snapshot.c
@@ -167,6 +167,11 @@ static inline int restore_highmem(void) {return 0;}
167 * and we count them using unsafe_pages 167 * and we count them using unsafe_pages
168 */ 168 */
169 169
170#define PG_ANY 0
171#define PG_SAFE 1
172#define PG_UNSAFE_CLEAR 1
173#define PG_UNSAFE_KEEP 0
174
170static unsigned int unsafe_pages; 175static unsigned int unsafe_pages;
171 176
172static void *alloc_image_page(gfp_t gfp_mask, int safe_needed) 177static void *alloc_image_page(gfp_t gfp_mask, int safe_needed)
@@ -190,7 +195,7 @@ static void *alloc_image_page(gfp_t gfp_mask, int safe_needed)
190 195
191unsigned long get_safe_page(gfp_t gfp_mask) 196unsigned long get_safe_page(gfp_t gfp_mask)
192{ 197{
193 return (unsigned long)alloc_image_page(gfp_mask, 1); 198 return (unsigned long)alloc_image_page(gfp_mask, PG_SAFE);
194} 199}
195 200
196/** 201/**
@@ -381,7 +386,7 @@ static struct pbe *alloc_pagedir(unsigned int nr_pages, gfp_t gfp_mask,
381 pbe = pblist; 386 pbe = pblist;
382 for (num = PBES_PER_PAGE; num < nr_pages; num += PBES_PER_PAGE) { 387 for (num = PBES_PER_PAGE; num < nr_pages; num += PBES_PER_PAGE) {
383 if (!pbe) { 388 if (!pbe) {
384 free_pagedir(pblist, 1); 389 free_pagedir(pblist, PG_UNSAFE_CLEAR);
385 return NULL; 390 return NULL;
386 } 391 }
387 pbe += PB_PAGE_SKIP; 392 pbe += PB_PAGE_SKIP;
@@ -458,12 +463,13 @@ static struct pbe *swsusp_alloc(unsigned int nr_pages)
458{ 463{
459 struct pbe *pblist; 464 struct pbe *pblist;
460 465
461 if (!(pblist = alloc_pagedir(nr_pages, GFP_ATOMIC | __GFP_COLD, 0))) { 466 pblist = alloc_pagedir(nr_pages, GFP_ATOMIC | __GFP_COLD, PG_ANY);
467 if (!pblist) {
462 printk(KERN_ERR "suspend: Allocating pagedir failed.\n"); 468 printk(KERN_ERR "suspend: Allocating pagedir failed.\n");
463 return NULL; 469 return NULL;
464 } 470 }
465 471
466 if (alloc_data_pages(pblist, GFP_ATOMIC | __GFP_COLD, 0)) { 472 if (alloc_data_pages(pblist, GFP_ATOMIC | __GFP_COLD, PG_ANY)) {
467 printk(KERN_ERR "suspend: Allocating image pages failed.\n"); 473 printk(KERN_ERR "suspend: Allocating image pages failed.\n");
468 swsusp_free(); 474 swsusp_free();
469 return NULL; 475 return NULL;
@@ -575,7 +581,7 @@ int snapshot_read_next(struct snapshot_handle *handle, size_t count)
575 return 0; 581 return 0;
576 if (!buffer) { 582 if (!buffer) {
577 /* This makes the buffer be freed by swsusp_free() */ 583 /* This makes the buffer be freed by swsusp_free() */
578 buffer = alloc_image_page(GFP_ATOMIC, 0); 584 buffer = alloc_image_page(GFP_ATOMIC, PG_ANY);
579 if (!buffer) 585 if (!buffer)
580 return -ENOMEM; 586 return -ENOMEM;
581 } 587 }
@@ -688,7 +694,7 @@ static int load_header(struct snapshot_handle *handle,
688 694
689 error = check_header(info); 695 error = check_header(info);
690 if (!error) { 696 if (!error) {
691 pblist = alloc_pagedir(info->image_pages, GFP_ATOMIC, 0); 697 pblist = alloc_pagedir(info->image_pages, GFP_ATOMIC, PG_ANY);
692 if (!pblist) 698 if (!pblist)
693 return -ENOMEM; 699 return -ENOMEM;
694 restore_pblist = pblist; 700 restore_pblist = pblist;
@@ -746,10 +752,10 @@ static int prepare_image(struct snapshot_handle *handle)
746 p = restore_pblist; 752 p = restore_pblist;
747 error = mark_unsafe_pages(p); 753 error = mark_unsafe_pages(p);
748 if (!error) { 754 if (!error) {
749 pblist = alloc_pagedir(nr_pages, GFP_ATOMIC, 1); 755 pblist = alloc_pagedir(nr_pages, GFP_ATOMIC, PG_SAFE);
750 if (pblist) 756 if (pblist)
751 copy_page_backup_list(pblist, p); 757 copy_page_backup_list(pblist, p);
752 free_pagedir(p, 0); 758 free_pagedir(p, PG_UNSAFE_KEEP);
753 if (!pblist) 759 if (!pblist)
754 error = -ENOMEM; 760 error = -ENOMEM;
755 } 761 }
@@ -840,7 +846,7 @@ int snapshot_write_next(struct snapshot_handle *handle, size_t count)
840 return 0; 846 return 0;
841 if (!buffer) { 847 if (!buffer) {
842 /* This makes the buffer be freed by swsusp_free() */ 848 /* This makes the buffer be freed by swsusp_free() */
843 buffer = alloc_image_page(GFP_ATOMIC, 0); 849 buffer = alloc_image_page(GFP_ATOMIC, PG_ANY);
844 if (!buffer) 850 if (!buffer)
845 return -ENOMEM; 851 return -ENOMEM;
846 } 852 }