do_mmap: give addr argument a chance even if not MAP_FIXED

hugectl relies on that to check if a range is free

Change-Id: I97963eef15c866f642e884b063b5caf5d827c776
This commit is contained in:
Dominique Martinet
2018-09-20 13:10:17 +09:00
committed by Dominique Martinet
parent 9a0eb915fb
commit f17c30da07
2 changed files with 19 additions and 3 deletions

View File

@ -1702,13 +1702,18 @@ SYSCALL_DECLARE(mmap)
}
#define VALID_DUMMY_ADDR ((region->user_start + PTL3_SIZE - 1) & ~(PTL3_SIZE - 1))
addr = (flags & MAP_FIXED)? addr0: VALID_DUMMY_ADDR;
addr = addr0;
len = (len0 + pgsize - 1) & ~(pgsize - 1);
recheck:
if ((addr & (pgsize - 1))
|| (len == 0)
|| !(flags & (MAP_SHARED | MAP_PRIVATE))
|| ((flags & MAP_SHARED) && (flags & MAP_PRIVATE))
|| (off0 & (pgsize - 1))) {
if (!(flags & MAP_FIXED) && addr != VALID_DUMMY_ADDR) {
addr = VALID_DUMMY_ADDR;
goto recheck;
}
ekprintf("sys_mmap(%lx,%lx,%x,%x,%x,%lx):EINVAL\n",
addr0, len0, prot, flags0, fd, off0);
error = -EINVAL;
@ -1718,6 +1723,10 @@ SYSCALL_DECLARE(mmap)
if (addr < region->user_start
|| region->user_end <= addr
|| len > (region->user_end - region->user_start)) {
if (!(flags & MAP_FIXED) && addr != VALID_DUMMY_ADDR) {
addr = VALID_DUMMY_ADDR;
goto recheck;
}
ekprintf("sys_mmap(%lx,%lx,%x,%x,%x,%lx):ENOMEM\n",
addr0, len0, prot, flags0, fd, off0);
error = -ENOMEM;