lkml.org 
[lkml]   [2009]   [Oct]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/3] Fix memory leak of never putback pages in mbind()
    Date

    if mbind() receive invalid address, do_mbind makes leaked page.
    following test program detect its leak.

    This patch fixes it.


    migrate_efault.c
    ============================================
    #include <numaif.h>
    #include <numa.h>
    #include <sys/mman.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>

    static unsigned long pagesize;

    static void* make_hole_mapping(void)
    {

    void* addr;

    addr = mmap(NULL, pagesize*3, PROT_READ|PROT_WRITE,
    MAP_ANON|MAP_PRIVATE, 0, 0);
    if (addr == MAP_FAILED)
    return NULL;

    /* make page populate */
    memset(addr, 0, pagesize*3);

    /* make memory hole */
    munmap(addr+pagesize, pagesize);

    return addr;
    }

    int main(int argc, char** argv)
    {
    void* addr;
    int ch;
    int node;
    struct bitmask *nmask = numa_allocate_nodemask();
    int err;
    int node_set = 0;

    while ((ch = getopt(argc, argv, "n:")) != -1){
    switch (ch){
    case 'n':
    node = strtol(optarg, NULL, 0);
    numa_bitmask_setbit(nmask, node);
    node_set = 1;
    break;
    default:
    ;
    }
    }
    argc -= optind;
    argv += optind;

    if (!node_set)
    numa_bitmask_setbit(nmask, 0);

    pagesize = getpagesize();

    addr = make_hole_mapping();

    err = mbind(addr, pagesize*3, MPOL_BIND, nmask->maskp, nmask->size, MPOL_MF_MOVE_ALL);
    if (err)
    perror("mbind ");

    return 0;
    }
    ============================================

    Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    ---
    mm/mempolicy.c | 2 ++
    1 files changed, 2 insertions(+), 0 deletions(-)

    diff --git a/mm/mempolicy.c b/mm/mempolicy.c
    index 473f888..824abf3 100644
    --- a/mm/mempolicy.c
    +++ b/mm/mempolicy.c
    @@ -1061,6 +1061,8 @@ static long do_mbind(unsigned long start, unsigned long len,

    if (!err && nr_failed && (flags & MPOL_MF_STRICT))
    err = -EIO;
    + } else {
    + putback_lru_pages(&pagelist);
    }

    up_write(&mm->mmap_sem);
    --
    1.6.0.GIT




    \
     
     \ /
      Last update: 2009-10-09 03:15    [W:2.650 / U:0.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site