• Shijie Hu's avatar
    hugetlbfs: get unmapped area below TASK_UNMAPPED_BASE for hugetlbfs · 88590253
    Shijie Hu authored
    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: default avatarkbuild test robot <lkp@intel.com>
    Signed-off-by: default avatarShijie Hu <hushijie3@huawei.com>
    Signed-off-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
    Signed-off-by: default avatarAndrew 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: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    88590253
inode.c 40.6 KB