pager_req_map(): do not take mmap_sem if not needed
This commit is contained in:
@ -1673,20 +1673,22 @@ static int pager_req_map(ihk_os_t os, int fd, size_t len, off_t off,
|
|||||||
maxprot |= PROT_EXEC;
|
maxprot |= PROT_EXEC;
|
||||||
}
|
}
|
||||||
|
|
||||||
down_write(¤t->mm->mmap_sem);
|
prot_and_flags = MAP_SHARED |
|
||||||
|
(prot_and_flags & (MAP_POPULATE | MAP_LOCKED));
|
||||||
|
|
||||||
#define ANY_WHERE 0
|
#define ANY_WHERE 0
|
||||||
if (prot_and_flags & MAP_LOCKED) prot_and_flags |= MAP_POPULATE;
|
if (prot_and_flags & MAP_LOCKED) prot_and_flags |= MAP_POPULATE;
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0)
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0)
|
||||||
|
down_write(¤t->mm->mmap_sem);
|
||||||
|
|
||||||
va = do_mmap_pgoff(file, ANY_WHERE, len, maxprot,
|
va = do_mmap_pgoff(file, ANY_WHERE, len, maxprot,
|
||||||
MAP_SHARED | (prot_and_flags & (MAP_POPULATE | MAP_LOCKED)), pgoff);
|
prot_and_flags, pgoff);
|
||||||
#endif
|
|
||||||
|
|
||||||
up_write(¤t->mm->mmap_sem);
|
up_write(¤t->mm->mmap_sem);
|
||||||
|
#else
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
|
va = vm_mmap(file, ANY_WHERE, len, maxprot,
|
||||||
va = vm_mmap(file, ANY_WHERE, len, maxprot, MAP_SHARED |
|
prot_and_flags, pgoff << PAGE_SHIFT);
|
||||||
(prot_and_flags & (MAP_POPULATE | MAP_LOCKED)), pgoff << PAGE_SHIFT);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (IS_ERR_VALUE(va)) {
|
if (IS_ERR_VALUE(va)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user