|
@@ -86,25 +86,38 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file,
|
|
|
info.flags = 0;
|
|
|
info.length = len;
|
|
|
info.low_limit = get_mmap_base(1);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If hint address is above DEFAULT_MAP_WINDOW, look for unmapped area
|
|
|
+ * in the full address space.
|
|
|
+ */
|
|
|
info.high_limit = in_compat_syscall() ?
|
|
|
- task_size_32bit() : task_size_64bit();
|
|
|
+ task_size_32bit() : task_size_64bit(addr > DEFAULT_MAP_WINDOW);
|
|
|
+
|
|
|
info.align_mask = PAGE_MASK & ~huge_page_mask(h);
|
|
|
info.align_offset = 0;
|
|
|
return vm_unmapped_area(&info);
|
|
|
}
|
|
|
|
|
|
static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file,
|
|
|
- unsigned long addr0, unsigned long len,
|
|
|
+ unsigned long addr, unsigned long len,
|
|
|
unsigned long pgoff, unsigned long flags)
|
|
|
{
|
|
|
struct hstate *h = hstate_file(file);
|
|
|
struct vm_unmapped_area_info info;
|
|
|
- unsigned long addr;
|
|
|
|
|
|
info.flags = VM_UNMAPPED_AREA_TOPDOWN;
|
|
|
info.length = len;
|
|
|
info.low_limit = PAGE_SIZE;
|
|
|
info.high_limit = get_mmap_base(0);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If hint address is above DEFAULT_MAP_WINDOW, look for unmapped area
|
|
|
+ * in the full address space.
|
|
|
+ */
|
|
|
+ if (addr > DEFAULT_MAP_WINDOW && !in_compat_syscall())
|
|
|
+ info.high_limit += TASK_SIZE_MAX - DEFAULT_MAP_WINDOW;
|
|
|
+
|
|
|
info.align_mask = PAGE_MASK & ~huge_page_mask(h);
|
|
|
info.align_offset = 0;
|
|
|
addr = vm_unmapped_area(&info);
|
|
@@ -119,7 +132,7 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file,
|
|
|
VM_BUG_ON(addr != -ENOMEM);
|
|
|
info.flags = 0;
|
|
|
info.low_limit = TASK_UNMAPPED_BASE;
|
|
|
- info.high_limit = TASK_SIZE;
|
|
|
+ info.high_limit = TASK_SIZE_LOW;
|
|
|
addr = vm_unmapped_area(&info);
|
|
|
}
|
|
|
|