• H
    mm: merging memory blocks resets mempolicy · 1444f92c
    Hampson, Steven T 提交于
    Using mbind to change the mempolicy to MPOL_BIND on several adjacent
    mmapped blocks may result in a reset of the mempolicy to MPOL_DEFAULT in
    vma_adjust.
    
    Test code.  Correct result is three lines containing "OK".
    
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/mman.h>
    #include <numaif.h>
    #include <errno.h>
    
    /* gcc mbind_test.c -lnuma -o mbind_test -Wall */
    #define MAXNODE 4096
    
    void allocate()
    {
    	int ret;
    	int len;
    	int policy = -1;
    	unsigned char *p;
    	unsigned long mask[MAXNODE] = { 0 };
    	unsigned long retmask[MAXNODE] = { 0 };
    
    	len = getpagesize() * 0x2fc00;
    	p = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,
    		 -1, 0);
    	if (p == MAP_FAILED)
    		printf("mbind err: %d\n", errno);
    
    	mask[0] = 1;
    	ret = mbind(p, len, MPOL_BIND, mask, MAXNODE, 0);
    	if (ret < 0)
    		printf("mbind err: %d %d\n", ret, errno);
    	ret = get_mempolicy(&policy, retmask, MAXNODE, p, MPOL_F_ADDR);
    	if (ret < 0)
    		printf("get_mempolicy err: %d %d\n", ret, errno);
    
    	if (policy == MPOL_BIND)
    		printf("OK\n");
    	else
    		printf("ERROR: policy is %d\n", policy);
    }
    
    int main()
    {
    	allocate();
    	allocate();
    	allocate();
    	return 0;
    }
    Signed-off-by: NSteven T Hampson <steven.t.hampson@intel.com>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Andi Kleen <andi@firstfloor.org>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    1444f92c
mmap.c 81.8 KB