|
@@ -954,6 +954,25 @@ static void mark_nosave_pages(struct memory_bitmap *bm)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static bool is_nosave_page(unsigned long pfn)
|
|
|
+{
|
|
|
+ struct nosave_region *region;
|
|
|
+
|
|
|
+ list_for_each_entry(region, &nosave_regions, list) {
|
|
|
+ if (pfn >= region->start_pfn && pfn < region->end_pfn) {
|
|
|
+ pr_err("PM: %#010llx in e820 nosave region: "
|
|
|
+ "[mem %#010llx-%#010llx]\n",
|
|
|
+ (unsigned long long) pfn << PAGE_SHIFT,
|
|
|
+ (unsigned long long) region->start_pfn << PAGE_SHIFT,
|
|
|
+ ((unsigned long long) region->end_pfn << PAGE_SHIFT)
|
|
|
+ - 1);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* create_basic_memory_bitmaps - create bitmaps needed for marking page
|
|
|
* 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)
|
|
|
do {
|
|
|
pfn = memory_bm_next_pfn(bm);
|
|
|
if (likely(pfn != BM_END_OF_MAP)) {
|
|
|
- if (likely(pfn_valid(pfn)))
|
|
|
+ if (likely(pfn_valid(pfn)) && !is_nosave_page(pfn))
|
|
|
swsusp_set_page_free(pfn_to_page(pfn));
|
|
|
else
|
|
|
return -EFAULT;
|