lkml.org 
[lkml]   [2009]   [Jun]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 01/22] HWPOISON: Add page flag for poisoned pages
    From: Andi Kleen <ak@linux.intel.com>

    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)
    v3: Define TestSetHWPoison on !CONFIG_MEMORY_FAILURE (Fengguang)

    Acked-by: Christoph Lameter <cl@linux.com>
    Reviewed-by: Wu Fengguang <fengguang.wu@intel.com>
    Signed-off-by: Andi Kleen <ak@linux.intel.com>

    ---
    include/linux/page-flags.h | 21 ++++++++++++++++++++-
    1 file changed, 20 insertions(+), 1 deletion(-)

    --- sound-2.6.orig/include/linux/page-flags.h
    +++ sound-2.6/include/linux/page-flags.h
    @@ -51,6 +51,9 @@
    * PG_buddy is set to indicate that the page is free and in the buddy system
    * (see mm/page_alloc.c).
    *
    + * PG_hwpoison indicates that a page got corrupted in hardware and contains
    + * data with incorrect ECC bits that triggered a machine check. Accessing is
    + * not safe since it may cause another machine check. Don't touch!
    */

    /*
    @@ -102,6 +105,9 @@ enum pageflags {
    #ifdef CONFIG_IA64_UNCACHED_ALLOCATOR
    PG_uncached, /* Page has been mapped as uncached */
    #endif
    +#ifdef CONFIG_MEMORY_FAILURE
    + PG_hwpoison, /* hardware poisoned page. Don't touch */
    +#endif
    __NR_PAGEFLAGS,

    /* Filesystems */
    @@ -182,6 +188,9 @@ static inline void ClearPage##uname(stru
    #define __CLEARPAGEFLAG_NOOP(uname) \
    static inline void __ClearPage##uname(struct page *page) { }

    +#define TESTSETFLAG_FALSE(uname) \
    +static inline int TestSetPage##uname(struct page *page) { return 0; }
    +
    #define TESTCLEARFLAG_FALSE(uname) \
    static inline int TestClearPage##uname(struct page *page) { return 0; }

    @@ -265,6 +274,16 @@ PAGEFLAG(Uncached, uncached)
    PAGEFLAG_FALSE(Uncached)
    #endif

    +#ifdef CONFIG_MEMORY_FAILURE
    +PAGEFLAG(HWPoison, hwpoison)
    +TESTSETFLAG(HWPoison, hwpoison)
    +#define __PG_HWPOISON (1UL << PG_hwpoison)
    +#else
    +PAGEFLAG_FALSE(HWPoison)
    +TESTSETFLAG_FALSE(HWPoison)
    +#define __PG_HWPOISON 0
    +#endif
    +
    static inline int PageUptodate(struct page *page)
    {
    int ret = test_bit(PG_uptodate, &(page)->flags);
    @@ -389,7 +408,7 @@ static inline void __ClearPageTail(struc
    1 << PG_private | 1 << PG_private_2 | \
    1 << PG_buddy | 1 << PG_writeback | 1 << PG_reserved | \
    1 << PG_slab | 1 << PG_swapcache | 1 << PG_active | \
    - 1 << PG_unevictable | __PG_MLOCKED)
    + 1 << PG_unevictable | __PG_MLOCKED | __PG_HWPOISON)

    /*
    * Flags checked when a page is prepped for return by the page allocator.
    --



    \
     
     \ /
      Last update: 2009-06-15 05:19    [W:0.051 / U:0.700 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site