Merge remote-tracking branches 'asoc/fix/atmel', 'asoc/fix/compress', 'asoc/fix/core...
[firefly-linux-kernel-4.4.55.git] / kernel / power / snapshot.c
index 4fc5c32422b39db0e509ea35e675b3852db895eb..c4b8093c80b3bad9b6f9cd56a086df5a4c159508 100644 (file)
@@ -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;