Commit 7be9823491ecbaf9700d7d3502cb4b4dd0ed868a
Committed by
Linus Torvalds
1 parent
433ecb4ab3
Exists in
master
and in
20 other branches
swsusp: use inline functions for changing page flags
Replace direct invocations of SetPageNosave(), SetPageNosaveFree() etc. with calls to inline functions that can be changed in subsequent patches without modifying the code calling them. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Acked-by: Pavel Machek <pavel@ucw.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 3 changed files with 61 additions and 26 deletions Side-by-side Diff
include/linux/suspend.h
... | ... | @@ -8,6 +8,7 @@ |
8 | 8 | #include <linux/notifier.h> |
9 | 9 | #include <linux/init.h> |
10 | 10 | #include <linux/pm.h> |
11 | +#include <linux/mm.h> | |
11 | 12 | |
12 | 13 | /* struct pbe is used for creating lists of pages that should be restored |
13 | 14 | * atomically during the resume from disk, because the page frames they have |
... | ... | @@ -48,6 +49,38 @@ |
48 | 49 | void __save_processor_state(struct saved_context *ctxt); |
49 | 50 | void __restore_processor_state(struct saved_context *ctxt); |
50 | 51 | unsigned long get_safe_page(gfp_t gfp_mask); |
52 | + | |
53 | +/* Page management functions for the software suspend (swsusp) */ | |
54 | + | |
55 | +static inline void swsusp_set_page_forbidden(struct page *page) | |
56 | +{ | |
57 | + SetPageNosave(page); | |
58 | +} | |
59 | + | |
60 | +static inline int swsusp_page_is_forbidden(struct page *page) | |
61 | +{ | |
62 | + return PageNosave(page); | |
63 | +} | |
64 | + | |
65 | +static inline void swsusp_unset_page_forbidden(struct page *page) | |
66 | +{ | |
67 | + ClearPageNosave(page); | |
68 | +} | |
69 | + | |
70 | +static inline void swsusp_set_page_free(struct page *page) | |
71 | +{ | |
72 | + SetPageNosaveFree(page); | |
73 | +} | |
74 | + | |
75 | +static inline int swsusp_page_is_free(struct page *page) | |
76 | +{ | |
77 | + return PageNosaveFree(page); | |
78 | +} | |
79 | + | |
80 | +static inline void swsusp_unset_page_free(struct page *page) | |
81 | +{ | |
82 | + ClearPageNosaveFree(page); | |
83 | +} | |
51 | 84 | |
52 | 85 | /* |
53 | 86 | * XXX: We try to keep some more pages free so that I/O operations succeed |
kernel/power/snapshot.c
... | ... | @@ -67,15 +67,15 @@ |
67 | 67 | |
68 | 68 | res = (void *)get_zeroed_page(gfp_mask); |
69 | 69 | if (safe_needed) |
70 | - while (res && PageNosaveFree(virt_to_page(res))) { | |
70 | + while (res && swsusp_page_is_free(virt_to_page(res))) { | |
71 | 71 | /* The page is unsafe, mark it for swsusp_free() */ |
72 | - SetPageNosave(virt_to_page(res)); | |
72 | + swsusp_set_page_forbidden(virt_to_page(res)); | |
73 | 73 | allocated_unsafe_pages++; |
74 | 74 | res = (void *)get_zeroed_page(gfp_mask); |
75 | 75 | } |
76 | 76 | if (res) { |
77 | - SetPageNosave(virt_to_page(res)); | |
78 | - SetPageNosaveFree(virt_to_page(res)); | |
77 | + swsusp_set_page_forbidden(virt_to_page(res)); | |
78 | + swsusp_set_page_free(virt_to_page(res)); | |
79 | 79 | } |
80 | 80 | return res; |
81 | 81 | } |
... | ... | @@ -91,8 +91,8 @@ |
91 | 91 | |
92 | 92 | page = alloc_page(gfp_mask); |
93 | 93 | if (page) { |
94 | - SetPageNosave(page); | |
95 | - SetPageNosaveFree(page); | |
94 | + swsusp_set_page_forbidden(page); | |
95 | + swsusp_set_page_free(page); | |
96 | 96 | } |
97 | 97 | return page; |
98 | 98 | } |
99 | 99 | |
... | ... | @@ -110,9 +110,9 @@ |
110 | 110 | |
111 | 111 | page = virt_to_page(addr); |
112 | 112 | |
113 | - ClearPageNosave(page); | |
113 | + swsusp_unset_page_forbidden(page); | |
114 | 114 | if (clear_nosave_free) |
115 | - ClearPageNosaveFree(page); | |
115 | + swsusp_unset_page_free(page); | |
116 | 116 | |
117 | 117 | __free_page(page); |
118 | 118 | } |
... | ... | @@ -615,7 +615,8 @@ |
615 | 615 | |
616 | 616 | BUG_ON(!PageHighMem(page)); |
617 | 617 | |
618 | - if (PageNosave(page) || PageReserved(page) || PageNosaveFree(page)) | |
618 | + if (swsusp_page_is_forbidden(page) || swsusp_page_is_free(page) || | |
619 | + PageReserved(page)) | |
619 | 620 | return NULL; |
620 | 621 | |
621 | 622 | return page; |
... | ... | @@ -670,7 +671,7 @@ |
670 | 671 | |
671 | 672 | BUG_ON(PageHighMem(page)); |
672 | 673 | |
673 | - if (PageNosave(page) || PageNosaveFree(page)) | |
674 | + if (swsusp_page_is_forbidden(page) || swsusp_page_is_free(page)) | |
674 | 675 | return NULL; |
675 | 676 | |
676 | 677 | if (PageReserved(page) && pfn_is_nosave(pfn)) |
... | ... | @@ -810,9 +811,10 @@ |
810 | 811 | if (pfn_valid(pfn)) { |
811 | 812 | struct page *page = pfn_to_page(pfn); |
812 | 813 | |
813 | - if (PageNosave(page) && PageNosaveFree(page)) { | |
814 | - ClearPageNosave(page); | |
815 | - ClearPageNosaveFree(page); | |
814 | + if (swsusp_page_is_forbidden(page) && | |
815 | + swsusp_page_is_free(page)) { | |
816 | + swsusp_unset_page_forbidden(page); | |
817 | + swsusp_unset_page_free(page); | |
816 | 818 | __free_page(page); |
817 | 819 | } |
818 | 820 | } |
... | ... | @@ -1135,7 +1137,7 @@ |
1135 | 1137 | max_zone_pfn = zone->zone_start_pfn + zone->spanned_pages; |
1136 | 1138 | for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++) |
1137 | 1139 | if (pfn_valid(pfn)) |
1138 | - ClearPageNosaveFree(pfn_to_page(pfn)); | |
1140 | + swsusp_unset_page_free(pfn_to_page(pfn)); | |
1139 | 1141 | } |
1140 | 1142 | |
1141 | 1143 | /* Mark pages that correspond to the "original" pfns as "unsafe" */ |
... | ... | @@ -1144,7 +1146,7 @@ |
1144 | 1146 | pfn = memory_bm_next_pfn(bm); |
1145 | 1147 | if (likely(pfn != BM_END_OF_MAP)) { |
1146 | 1148 | if (likely(pfn_valid(pfn))) |
1147 | - SetPageNosaveFree(pfn_to_page(pfn)); | |
1149 | + swsusp_set_page_free(pfn_to_page(pfn)); | |
1148 | 1150 | else |
1149 | 1151 | return -EFAULT; |
1150 | 1152 | } |
1151 | 1153 | |
... | ... | @@ -1310,14 +1312,14 @@ |
1310 | 1312 | struct page *page; |
1311 | 1313 | |
1312 | 1314 | page = alloc_page(__GFP_HIGHMEM); |
1313 | - if (!PageNosaveFree(page)) { | |
1315 | + if (!swsusp_page_is_free(page)) { | |
1314 | 1316 | /* The page is "safe", set its bit the bitmap */ |
1315 | 1317 | memory_bm_set_bit(bm, page_to_pfn(page)); |
1316 | 1318 | safe_highmem_pages++; |
1317 | 1319 | } |
1318 | 1320 | /* Mark the page as allocated */ |
1319 | - SetPageNosave(page); | |
1320 | - SetPageNosaveFree(page); | |
1321 | + swsusp_set_page_forbidden(page); | |
1322 | + swsusp_set_page_free(page); | |
1321 | 1323 | } |
1322 | 1324 | memory_bm_position_reset(bm); |
1323 | 1325 | safe_highmem_bm = bm; |
... | ... | @@ -1349,7 +1351,7 @@ |
1349 | 1351 | struct highmem_pbe *pbe; |
1350 | 1352 | void *kaddr; |
1351 | 1353 | |
1352 | - if (PageNosave(page) && PageNosaveFree(page)) { | |
1354 | + if (swsusp_page_is_forbidden(page) && swsusp_page_is_free(page)) { | |
1353 | 1355 | /* We have allocated the "original" page frame and we can |
1354 | 1356 | * use it directly to store the loaded page. |
1355 | 1357 | */ |
1356 | 1358 | |
... | ... | @@ -1511,14 +1513,14 @@ |
1511 | 1513 | error = -ENOMEM; |
1512 | 1514 | goto Free; |
1513 | 1515 | } |
1514 | - if (!PageNosaveFree(virt_to_page(lp))) { | |
1516 | + if (!swsusp_page_is_free(virt_to_page(lp))) { | |
1515 | 1517 | /* The page is "safe", add it to the list */ |
1516 | 1518 | lp->next = safe_pages_list; |
1517 | 1519 | safe_pages_list = lp; |
1518 | 1520 | } |
1519 | 1521 | /* Mark the page as allocated */ |
1520 | - SetPageNosave(virt_to_page(lp)); | |
1521 | - SetPageNosaveFree(virt_to_page(lp)); | |
1522 | + swsusp_set_page_forbidden(virt_to_page(lp)); | |
1523 | + swsusp_set_page_free(virt_to_page(lp)); | |
1522 | 1524 | nr_pages--; |
1523 | 1525 | } |
1524 | 1526 | /* Free the reserved safe pages so that chain_alloc() can use them */ |
... | ... | @@ -1547,7 +1549,7 @@ |
1547 | 1549 | if (PageHighMem(page)) |
1548 | 1550 | return get_highmem_page_buffer(page, ca); |
1549 | 1551 | |
1550 | - if (PageNosave(page) && PageNosaveFree(page)) | |
1552 | + if (swsusp_page_is_forbidden(page) && swsusp_page_is_free(page)) | |
1551 | 1553 | /* We have allocated the "original" page frame and we can |
1552 | 1554 | * use it directly to store the loaded page. |
1553 | 1555 | */ |
mm/page_alloc.c
... | ... | @@ -775,8 +775,8 @@ |
775 | 775 | if (pfn_valid(pfn)) { |
776 | 776 | struct page *page = pfn_to_page(pfn); |
777 | 777 | |
778 | - if (!PageNosave(page)) | |
779 | - ClearPageNosaveFree(page); | |
778 | + if (!swsusp_page_is_forbidden(page)) | |
779 | + swsusp_unset_page_free(page); | |
780 | 780 | } |
781 | 781 | |
782 | 782 | for (order = MAX_ORDER - 1; order >= 0; --order) |
... | ... | @@ -785,7 +785,7 @@ |
785 | 785 | |
786 | 786 | pfn = page_to_pfn(list_entry(curr, struct page, lru)); |
787 | 787 | for (i = 0; i < (1UL << order); i++) |
788 | - SetPageNosaveFree(pfn_to_page(pfn + i)); | |
788 | + swsusp_set_page_free(pfn_to_page(pfn + i)); | |
789 | 789 | } |
790 | 790 | |
791 | 791 | spin_unlock_irqrestore(&zone->lock, flags); |