diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/power/snapshot.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c index 4fc5c32422b3..c4b8093c80b3 100644 --- a/kernel/power/snapshot.c +++ b/kernel/power/snapshot.c | |||
@@ -954,6 +954,25 @@ static void mark_nosave_pages(struct memory_bitmap *bm) | |||
954 | } | 954 | } |
955 | } | 955 | } |
956 | 956 | ||
957 | static bool is_nosave_page(unsigned long pfn) | ||
958 | { | ||
959 | struct nosave_region *region; | ||
960 | |||
961 | list_for_each_entry(region, &nosave_regions, list) { | ||
962 | if (pfn >= region->start_pfn && pfn < region->end_pfn) { | ||
963 | pr_err("PM: %#010llx in e820 nosave region: " | ||
964 | "[mem %#010llx-%#010llx]\n", | ||
965 | (unsigned long long) pfn << PAGE_SHIFT, | ||
966 | (unsigned long long) region->start_pfn << PAGE_SHIFT, | ||
967 | ((unsigned long long) region->end_pfn << PAGE_SHIFT) | ||
968 | - 1); | ||
969 | return true; | ||
970 | } | ||
971 | } | ||
972 | |||
973 | return false; | ||
974 | } | ||
975 | |||
957 | /** | 976 | /** |
958 | * create_basic_memory_bitmaps - create bitmaps needed for marking page | 977 | * create_basic_memory_bitmaps - create bitmaps needed for marking page |
959 | * frames that should not be saved and free page frames. The pointers | 978 | * frames that should not be saved and free page frames. The pointers |
@@ -2015,7 +2034,7 @@ static int mark_unsafe_pages(struct memory_bitmap *bm) | |||
2015 | do { | 2034 | do { |
2016 | pfn = memory_bm_next_pfn(bm); | 2035 | pfn = memory_bm_next_pfn(bm); |
2017 | if (likely(pfn != BM_END_OF_MAP)) { | 2036 | if (likely(pfn != BM_END_OF_MAP)) { |
2018 | if (likely(pfn_valid(pfn))) | 2037 | if (likely(pfn_valid(pfn)) && !is_nosave_page(pfn)) |
2019 | swsusp_set_page_free(pfn_to_page(pfn)); | 2038 | swsusp_set_page_free(pfn_to_page(pfn)); |
2020 | else | 2039 | else |
2021 | return -EFAULT; | 2040 | return -EFAULT; |