aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorAndi Kleen <andi@firstfloor.org>2009-09-16 05:50:03 -0400
committerAndi Kleen <ak@linux.intel.com>2009-09-16 05:50:03 -0400
commitd466f2fcb32cd97fd586bfa33f5dba3ac78aadb0 (patch)
tree3e8d7f89f08e6b2340adebb4ebdbfb7329902607 /include
parent0cb583fd2862f19ea88b02eb307d11c09e51e2f8 (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.h17
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)
263PAGEFLAG_FALSE(Uncached) 269PAGEFLAG_FALSE(Uncached)
264#endif 270#endif
265 271
272#ifdef CONFIG_MEMORY_FAILURE
273PAGEFLAG(HWPoison, hwpoison)
274TESTSETFLAG(HWPoison, hwpoison)
275#define __PG_HWPOISON (1UL << PG_hwpoison)
276#else
277PAGEFLAG_FALSE(HWPoison)
278#define __PG_HWPOISON 0
279#endif
280
266static inline int PageUptodate(struct page *page) 281static 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.