lkml.org 
[lkml]   [2010]   [Aug]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[093/111] HWPOISON: abort on failed unmap
    2.6.32-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Wu Fengguang <fengguang.wu@intel.com>

    commit 1668bfd5be9d8a52536c4865000fbbe065a3613b upstream.

    Don't try to isolate a still mapped page. Otherwise we will hit the
    BUG_ON(page_mapped(page)) in __remove_from_page_cache().

    Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
    Signed-off-by: Andi Kleen <ak@linux.intel.com>
    Signed-off-by: Thomas Renninger <trenn@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    mm/memory-failure.c | 20 +++++++++++++++-----
    1 file changed, 15 insertions(+), 5 deletions(-)

    --- a/mm/memory-failure.c
    +++ b/mm/memory-failure.c
    @@ -637,7 +637,7 @@ static int page_action(struct page_state
    * Do all that is necessary to remove user space mappings. Unmap
    * the pages and send SIGBUS to the processes if the data was dirty.
    */
    -static void hwpoison_user_mappings(struct page *p, unsigned long pfn,
    +static int hwpoison_user_mappings(struct page *p, unsigned long pfn,
    int trapno)
    {
    enum ttu_flags ttu = TTU_UNMAP | TTU_IGNORE_MLOCK | TTU_IGNORE_ACCESS;
    @@ -647,15 +647,18 @@ static void hwpoison_user_mappings(struc
    int i;
    int kill = 1;

    - if (PageReserved(p) || PageCompound(p) || PageSlab(p) || PageKsm(p))
    - return;
    + if (PageReserved(p) || PageSlab(p))
    + return SWAP_SUCCESS;

    /*
    * This check implies we don't kill processes if their pages
    * are in the swap cache early. Those are always late kills.
    */
    if (!page_mapped(p))
    - return;
    + return SWAP_SUCCESS;
    +
    + if (PageCompound(p) || PageKsm(p))
    + return SWAP_FAIL;

    if (PageSwapCache(p)) {
    printk(KERN_ERR
    @@ -717,6 +720,8 @@ static void hwpoison_user_mappings(struc
    */
    kill_procs_ao(&tokill, !!PageDirty(p), trapno,
    ret != SWAP_SUCCESS, pfn);
    +
    + return ret;
    }

    int __memory_failure(unsigned long pfn, int trapno, int ref)
    @@ -786,8 +791,13 @@ int __memory_failure(unsigned long pfn,

    /*
    * Now take care of user space mappings.
    + * Abort on fail: __remove_from_page_cache() assumes unmapped page.
    */
    - hwpoison_user_mappings(p, pfn, trapno);
    + if (hwpoison_user_mappings(p, pfn, trapno) != SWAP_SUCCESS) {
    + printk(KERN_ERR "MCE %#lx: cannot unmap page, give up\n", pfn);
    + res = -EBUSY;
    + goto out;
    + }

    /*
    * Torn down by someone else?



    \
     
     \ /
      Last update: 2010-08-12 02:03    [W:0.020 / U:0.880 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site