lkml.org 
[lkml]   [2011]   [Jan]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2] mlock: set VM_WRITE in case we don't have read permission.
    Date
    From: Tao Ma <boyu.mt@taobao.com>

    In 5ecfda0, we do some optimization in mlock, but it causes
    a very basic test case(attached below) of mlock to fail. So
    this patch add another check that if we don't have read permission,
    still set FOLL_WRITE flag. Thank KOSAKI for the suggestion.
    The test program is attached below.

    #include <sys/mman.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <errno.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <sys/types.h>

    int main()
    {
    char *buf, *testfile = "test_mmap";
    int fd, file_len = 40960, ret = -1;

    fd = open(testfile, O_RDWR);
    if (fd < 0) {
    perror("open");
    return -1;
    }

    if (ftruncate(fd, file_len) < 0) {
    perror("ftruncate");
    goto out;
    }

    buf = mmap(NULL, file_len, PROT_WRITE, MAP_SHARED, fd, 0);
    if (buf == MAP_FAILED) {
    perror("mmap");
    goto out;
    }

    if (mlock(buf, file_len) < 0) {
    perror("mlock");
    goto out;
    }

    munlock(buf, file_len);
    munmap(buf, file_len);
    ret = 0;
    out:
    close(fd);
    return ret;
    }

    Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Cc: Michel Lespinasse <walken@google.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Tao Ma <boyu.mt@taobao.com>
    ---
    mm/mlock.c | 7 +++++++
    1 files changed, 7 insertions(+), 0 deletions(-)

    diff --git a/mm/mlock.c b/mm/mlock.c
    index 13e81ee..8508c5a 100644
    --- a/mm/mlock.c
    +++ b/mm/mlock.c
    @@ -178,6 +178,13 @@ static long __mlock_vma_pages_range(struct vm_area_struct *vma,
    if ((vma->vm_flags & (VM_WRITE | VM_SHARED)) == VM_WRITE)
    gup_flags |= FOLL_WRITE;

    + /*
    + * We don't have readable permission. Therefore we can't use read
    + * operation even though it's faster.
    + */
    + if ((vma->vm_flags & (VM_READ|VM_WRITE)) == VM_WRITE)
    + gup_flags |= FOLL_WRITE;
    +
    if (vma->vm_flags & VM_LOCKED)
    gup_flags |= FOLL_MLOCK;

    --
    1.6.3.GIT


    \
     
     \ /
      Last update: 2011-01-31 16:43    [W:0.047 / U:125.536 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site