• Joonsoo Kim's avatar
    mm, hugetlb: do not use a page in page cache for cow optimization · 37a2140d
    Joonsoo Kim authored
    Currently, we use a page with mapped count 1 in page cache for cow
    optimization.  If we find this condition, we don't allocate a new page and
    copy contents.  Instead, we map this page directly.  This may introduce a
    problem that writting to private mapping overwrite hugetlb file directly.
    You can find this situation with following code.
    
            size = 20 * MB;
            flag = MAP_SHARED;
            p = mmap(NULL, size, PROT_READ|PROT_WRITE, flag, fd, 0);
            if (p == MAP_FAILED) {
                    fprintf(stderr, "mmap() failed: %s\n", strerror(errno));
                    return -1;
            }
            p[0] = 's';
            fprintf(stdout, "BEFORE STEAL PRIVATE WRITE: %c\n", p[0]);
            munmap(p, size);
    
            flag = MAP_PRIVATE;
            p = mmap(NULL, size, PROT_READ|PROT_WRITE, flag, fd, 0);
            if (p == MAP_FAILED) {
                    fprintf(stderr, "mmap() failed: %s\n", strerror(errno));
            }
            p[0] = 'c';
            munmap(p, size);
    
            flag = MAP_SHARED;
            p = mmap(NULL, size, PROT_READ|PROT_WRITE, flag, fd, 0);
            if (p == MAP_FAILED) {
                    fprintf(stderr, "mmap() failed: %s\n", strerror(errno));
                    return -1;
            }
            fprintf(stdout, "AFTER STEAL PRIVATE WRITE: %c\n", p[0]);
            munmap(p, size);
    
    We can see that "AFTER STEAL PRIVATE WRITE: c", not "AFTER STEAL PRIVATE
    WRITE: s".  If we turn off this optimization to a page in page cache, the
    problem is disappeared.
    
    So, I change the trigger condition of optimization.  If this page is not
    AnonPage, we don't do optimization.  This makes this optimization turning
    off for a page cache.
    Signed-off-by: default avatarJoonsoo Kim <iamjoonsoo.kim@lge.com>
    Acked-by: default avatarMichal Hocko <mhocko@suse.cz>
    Reviewed-by: default avatarWanpeng Li <liwanp@linux.vnet.ibm.com>
    Reviewed-by: default avatarNaoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Cc: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
    Acked-by: default avatarHillf Danton <dhillf@gmail.com>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
    Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Davidlohr Bueso <davidlohr.bueso@hp.com>
    Cc: David Gibson <david@gibson.dropbear.id.au>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    37a2140d
hugetlb.c 88.3 KB