diff options
author | Rafael J. Wysocki <rjw@sisk.pl> | 2008-02-19 19:47:44 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2008-02-21 02:15:28 -0500 |
commit | 8a235efad548abd2ab5ebea45a9ffa750c814375 (patch) | |
tree | 9b8c6c1fa3d2e28d9bb198d7019cba8883d5299e /arch | |
parent | e80af3a8dbbbf431b2070cc760699f01c5a6ac69 (diff) |
Hibernation: Handle DEBUG_PAGEALLOC on x86
Make hibernation work with CONFIG_DEBUG_PAGEALLOC set on x86, by
checking if the pages to be copied are marked as present in the
kernel mapping and temporarily marking them as present if that's not
the case. No functional modifications are introduced if
CONFIG_DEBUG_PAGEALLOC is unset.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/mm/pageattr.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index e2a74ea11a53..464d8fc21ce6 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c | |||
@@ -899,7 +899,24 @@ void kernel_map_pages(struct page *page, int numpages, int enable) | |||
899 | */ | 899 | */ |
900 | cpa_fill_pool(); | 900 | cpa_fill_pool(); |
901 | } | 901 | } |
902 | #endif | 902 | |
903 | #ifdef CONFIG_HIBERNATION | ||
904 | |||
905 | bool kernel_page_present(struct page *page) | ||
906 | { | ||
907 | unsigned int level; | ||
908 | pte_t *pte; | ||
909 | |||
910 | if (PageHighMem(page)) | ||
911 | return false; | ||
912 | |||
913 | pte = lookup_address((unsigned long)page_address(page), &level); | ||
914 | return (pte_val(*pte) & _PAGE_PRESENT); | ||
915 | } | ||
916 | |||
917 | #endif /* CONFIG_HIBERNATION */ | ||
918 | |||
919 | #endif /* CONFIG_DEBUG_PAGEALLOC */ | ||
903 | 920 | ||
904 | /* | 921 | /* |
905 | * The testcases use internal knowledge of the implementation that shouldn't | 922 | * The testcases use internal knowledge of the implementation that shouldn't |