diff options
| author | Andi Kleen <andi@firstfloor.org> | 2009-09-16 05:50:03 -0400 |
|---|---|---|
| committer | Andi Kleen <ak@linux.intel.com> | 2009-09-16 05:50:03 -0400 |
| commit | d466f2fcb32cd97fd586bfa33f5dba3ac78aadb0 (patch) | |
| tree | 3e8d7f89f08e6b2340adebb4ebdbfb7329902607 /include | |
| parent | 0cb583fd2862f19ea88b02eb307d11c09e51e2f8 (diff) | |
HWPOISON: Add page flag for poisoned pages
Hardware poisoned pages need special handling in the VM and shouldn't be
touched again. This requires a new page flag. Define it here.
The page flags wars seem to be over, so it shouldn't be a problem
to get a new one.
v2: Add TestSetHWPoison (suggested by Johannes Weiner)
Acked-by: Christoph Lameter <cl@linux.com>
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/page-flags.h | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 2b87acfc5f87..9bc5fd9fdbf6 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h | |||
| @@ -51,6 +51,9 @@ | |||
| 51 | * PG_buddy is set to indicate that the page is free and in the buddy system | 51 | * PG_buddy is set to indicate that the page is free and in the buddy system |
| 52 | * (see mm/page_alloc.c). | 52 | * (see mm/page_alloc.c). |
| 53 | * | 53 | * |
| 54 | * PG_hwpoison indicates that a page got corrupted in hardware and contains | ||
| 55 | * data with incorrect ECC bits that triggered a machine check. Accessing is | ||
| 56 | * not safe since it may cause another machine check. Don't touch! | ||
| 54 | */ | 57 | */ |
| 55 | 58 | ||
| 56 | /* | 59 | /* |
| @@ -102,6 +105,9 @@ enum pageflags { | |||
| 102 | #ifdef CONFIG_ARCH_USES_PG_UNCACHED | 105 | #ifdef CONFIG_ARCH_USES_PG_UNCACHED |
| 103 | PG_uncached, /* Page has been mapped as uncached */ | 106 | PG_uncached, /* Page has been mapped as uncached */ |
| 104 | #endif | 107 | #endif |
| 108 | #ifdef CONFIG_MEMORY_FAILURE | ||
| 109 | PG_hwpoison, /* hardware poisoned page. Don't touch */ | ||
| 110 | #endif | ||
| 105 | __NR_PAGEFLAGS, | 111 | __NR_PAGEFLAGS, |
| 106 | 112 | ||
| 107 | /* Filesystems */ | 113 | /* Filesystems */ |
| @@ -263,6 +269,15 @@ PAGEFLAG(Uncached, uncached) | |||
| 263 | PAGEFLAG_FALSE(Uncached) | 269 | PAGEFLAG_FALSE(Uncached) |
| 264 | #endif | 270 | #endif |
| 265 | 271 | ||
| 272 | #ifdef CONFIG_MEMORY_FAILURE | ||
| 273 | PAGEFLAG(HWPoison, hwpoison) | ||
| 274 | TESTSETFLAG(HWPoison, hwpoison) | ||
| 275 | #define __PG_HWPOISON (1UL << PG_hwpoison) | ||
| 276 | #else | ||
| 277 | PAGEFLAG_FALSE(HWPoison) | ||
| 278 | #define __PG_HWPOISON 0 | ||
| 279 | #endif | ||
| 280 | |||
| 266 | static inline int PageUptodate(struct page *page) | 281 | static inline int PageUptodate(struct page *page) |
| 267 | { | 282 | { |
| 268 | int ret = test_bit(PG_uptodate, &(page)->flags); | 283 | int ret = test_bit(PG_uptodate, &(page)->flags); |
| @@ -387,7 +402,7 @@ static inline void __ClearPageTail(struct page *page) | |||
| 387 | 1 << PG_private | 1 << PG_private_2 | \ | 402 | 1 << PG_private | 1 << PG_private_2 | \ |
| 388 | 1 << PG_buddy | 1 << PG_writeback | 1 << PG_reserved | \ | 403 | 1 << PG_buddy | 1 << PG_writeback | 1 << PG_reserved | \ |
| 389 | 1 << PG_slab | 1 << PG_swapcache | 1 << PG_active | \ | 404 | 1 << PG_slab | 1 << PG_swapcache | 1 << PG_active | \ |
| 390 | 1 << PG_unevictable | __PG_MLOCKED) | 405 | 1 << PG_unevictable | __PG_MLOCKED | __PG_HWPOISON) |
| 391 | 406 | ||
| 392 | /* | 407 | /* |
| 393 | * Flags checked when a page is prepped for return by the page allocator. | 408 | * Flags checked when a page is prepped for return by the page allocator. |
