• S
    hugetlbfs: get unmapped area below TASK_UNMAPPED_BASE for hugetlbfs · 88590253
    Shijie Hu 提交于
    In a 32-bit program, running on arm64 architecture.  When the address
    space below mmap base is completely exhausted, shmat() for huge pages will
    return ENOMEM, but shmat() for normal pages can still success on no-legacy
    mode.  This seems not fair.
    
    For normal pages, the calling trace of get_unmapped_area() is:
    
    	=> mm->get_unmapped_area()
    	if on legacy mode,
    		=> arch_get_unmapped_area()
    			=> vm_unmapped_area()
    	if on no-legacy mode,
    		=> arch_get_unmapped_area_topdown()
    			=> vm_unmapped_area()
    
    For huge pages, the calling trace of get_unmapped_area() is:
    
    	=> file->f_op->get_unmapped_area()
    		=> hugetlb_get_unmapped_area()
    			=> vm_unmapped_area()
    
    To solve this issue, we only need to make hugetlb_get_unmapped_area() take
    the same way as mm->get_unmapped_area().  Add *bottomup() and *topdown()
    for hugetlbfs, and check current mm->get_unmapped_area() to decide which
    one to use.  If mm->get_unmapped_area is equal to
    arch_get_unmapped_area_topdown(), hugetlb_get_unmapped_area() calls
    topdown routine, otherwise calls bottomup routine.
    Reported-by: Nkbuild test robot <lkp@intel.com>
    Signed-off-by: NShijie Hu <hushijie3@huawei.com>
    Signed-off-by: NMike Kravetz <mike.kravetz@oracle.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Cc: Will Deacon <will@kernel.org>
    Cc: Xiaoming Ni <nixiaoming@huawei.com>
    Cc: Kefeng Wang <wangkefeng.wang@huawei.com>
    Cc: yangerkun <yangerkun@huawei.com>
    Cc: ChenGang <cg.chen@huawei.com>
    Cc: Chen Jie <chenjie6@huawei.com>
    Link: http://lkml.kernel.org/r/20200518065338.113664-1-hushijie3@huawei.comSigned-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    88590253
inode.c 40.6 KB