diff options
Diffstat (limited to 'kernel/power/snapshot.c')
-rw-r--r-- | kernel/power/snapshot.c | 24 |
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 | |||
170 | static unsigned int unsafe_pages; | 175 | static unsigned int unsafe_pages; |
171 | 176 | ||
172 | static void *alloc_image_page(gfp_t gfp_mask, int safe_needed) | 177 | static 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 | ||
191 | unsigned long get_safe_page(gfp_t gfp_mask) | 196 | unsigned 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 | } |