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/linux/page-flags.h | |
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/linux/page-flags.h')
-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. |