lkml.org 
[lkml]   [2009]   [Aug]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] [14/15] HWPOISON: Add madvise() based injector for hardware poisoned pages v3
    Date

    Impact: optional, useful for debugging

    Add a new madvice sub command to inject poison for some
    pages in a process' address space. This is useful for
    testing the poison page handling.

    Open issues:

    - This patch allows root to tie up arbitary amounts of memory.
    Should this be disabled inside containers?
    - There's a small race window between getting the page and injecting.
    The patch drops the ref count because otherwise memory_failure
    complains about dangling references. In theory with a multi threaded
    injector one could inject poison for a process foreign page this way.
    Not a serious issue right now.

    v2: Use write flag for get_user_pages to make sure to always get
    a fresh page
    v3: Don't request write mapping (Fengguang Wu)

    Signed-off-by: Andi Kleen <ak@linux.intel.com>

    ---
    include/asm-generic/mman-common.h | 1 +
    mm/madvise.c | 36 ++++++++++++++++++++++++++++++++++++
    2 files changed, 37 insertions(+)

    Index: linux/mm/madvise.c
    ===================================================================
    --- linux.orig/mm/madvise.c
    +++ linux/mm/madvise.c
    @@ -207,6 +207,38 @@ static long madvise_remove(struct vm_are
    return error;
    }

    +#ifdef CONFIG_MEMORY_FAILURE
    +/*
    + * Error injection support for memory error handling.
    + */
    +static int madvise_hwpoison(unsigned long start, unsigned long end)
    +{
    + /*
    + * RED-PEN
    + * This allows to tie up arbitary amounts of memory.
    + * Might be a good idea to disable it inside containers even for root.
    + */
    + if (!capable(CAP_SYS_ADMIN))
    + return -EPERM;
    + for (; start < end; start += PAGE_SIZE) {
    + struct page *p;
    + int ret = get_user_pages(current, current->mm, start, 1,
    + 0, 0, &p, NULL);
    + if (ret != 1)
    + return ret;
    + put_page(p);
    + /*
    + * RED-PEN page can be reused in a short window, but otherwise
    + * we'll have to fight with the reference count.
    + */
    + printk(KERN_INFO "Injecting memory failure for page %lx at %lx\n",
    + page_to_pfn(p), start);
    + memory_failure(page_to_pfn(p), 0);
    + }
    + return 0;
    +}
    +#endif
    +
    static long
    madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev,
    unsigned long start, unsigned long end, int behavior)
    @@ -307,6 +339,10 @@ SYSCALL_DEFINE3(madvise, unsigned long,
    int write;
    size_t len;

    +#ifdef CONFIG_MEMORY_FAILURE
    + if (behavior == MADV_HWPOISON)
    + return madvise_hwpoison(start, start+len_in);
    +#endif
    if (!madvise_behavior_valid(behavior))
    return error;

    Index: linux/include/asm-generic/mman-common.h
    ===================================================================
    --- linux.orig/include/asm-generic/mman-common.h
    +++ linux/include/asm-generic/mman-common.h
    @@ -34,6 +34,7 @@
    #define MADV_REMOVE 9 /* remove these pages & resources */
    #define MADV_DONTFORK 10 /* don't inherit across fork */
    #define MADV_DOFORK 11 /* do inherit across fork */
    +#define MADV_HWPOISON 12 /* poison a page for testing */

    /* compatibility flags */
    #define MAP_FILE 0

    \
     
     \ /
      Last update: 2009-08-04 23:59    [W:0.023 / U:58.284 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site