Merge branch 'hwpoison' of git://git.kernel.org/pub/scm/linux/kernel/git/ak/linux-mce-2.6
* 'hwpoison' of git://git.kernel.org/pub/scm/linux/kernel/git/ak/linux-mce-2.6: (21 commits) HWPOISON: Enable error_remove_page on btrfs HWPOISON: Add simple debugfs interface to inject hwpoison on arbitary PFNs HWPOISON: Add madvise() based injector for hardware poisoned pages v4 HWPOISON: Enable error_remove_page for NFS HWPOISON: Enable .remove_error_page for migration aware file systems HWPOISON: The high level memory error handler in the VM v7 HWPOISON: Add PR_MCE_KILL prctl to control early kill behaviour per process HWPOISON: shmem: call set_page_dirty() with locked page HWPOISON: Define a new error_remove_page address space op for async truncation HWPOISON: Add invalidate_inode_page HWPOISON: Refactor truncate to allow direct truncating of page v2 HWPOISON: check and isolate corrupted free pages v2 HWPOISON: Handle hardware poisoned pages in try_to_unmap HWPOISON: Use bitmask/action code for try_to_unmap behaviour HWPOISON: x86: Add VM_FAULT_HWPOISON handling to x86 page fault handler v2 HWPOISON: Add poison check to page fault handling HWPOISON: Add basic support for poisoned pages in fault handler v3 HWPOISON: Add new SIGBUS error codes for hardware poison signals HWPOISON: Add support for poison swap entries v2 HWPOISON: Export some rmap vma locking to outside world ...
This commit is contained in:
@@ -234,6 +234,12 @@ static void bad_page(struct page *page)
|
||||
static unsigned long nr_shown;
|
||||
static unsigned long nr_unshown;
|
||||
|
||||
/* Don't complain about poisoned pages */
|
||||
if (PageHWPoison(page)) {
|
||||
__ClearPageBuddy(page);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Allow a burst of 60 reports, then keep quiet for that minute;
|
||||
* or allow a steady drip of one report per second.
|
||||
@@ -666,7 +672,7 @@ static inline void expand(struct zone *zone, struct page *page,
|
||||
/*
|
||||
* This page is about to be returned from the page allocator
|
||||
*/
|
||||
static int prep_new_page(struct page *page, int order, gfp_t gfp_flags)
|
||||
static inline int check_new_page(struct page *page)
|
||||
{
|
||||
if (unlikely(page_mapcount(page) |
|
||||
(page->mapping != NULL) |
|
||||
@@ -675,6 +681,18 @@ static int prep_new_page(struct page *page, int order, gfp_t gfp_flags)
|
||||
bad_page(page);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int prep_new_page(struct page *page, int order, gfp_t gfp_flags)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < (1 << order); i++) {
|
||||
struct page *p = page + i;
|
||||
if (unlikely(check_new_page(p)))
|
||||
return 1;
|
||||
}
|
||||
|
||||
set_page_private(page, 0);
|
||||
set_page_refcounted(page);
|
||||
|
||||
Reference in New Issue
Block a user