mmap: allow MAP_HUGETLB for hugetlbfs files v2
It is counterintuitive at best that mmap'ing a hugetlbfs file with MAP_HUGETLB fails, while mmap'ing it without will a) succeed and b) return huge pages. v2: use is_file_hugepages(), as suggested by Jianguo Signed-off-by: Joern Engel <joern@logfs.org> Cc: Jianguo Wu <wujianguo@huawei.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
918fc718c5
commit
493af57804
@ -1358,13 +1358,14 @@ SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,
|
|||||||
|
|
||||||
if (!(flags & MAP_ANONYMOUS)) {
|
if (!(flags & MAP_ANONYMOUS)) {
|
||||||
audit_mmap_fd(fd, flags);
|
audit_mmap_fd(fd, flags);
|
||||||
if (unlikely(flags & MAP_HUGETLB))
|
|
||||||
return -EINVAL;
|
|
||||||
file = fget(fd);
|
file = fget(fd);
|
||||||
if (!file)
|
if (!file)
|
||||||
goto out;
|
goto out;
|
||||||
if (is_file_hugepages(file))
|
if (is_file_hugepages(file))
|
||||||
len = ALIGN(len, huge_page_size(hstate_file(file)));
|
len = ALIGN(len, huge_page_size(hstate_file(file)));
|
||||||
|
retval = -EINVAL;
|
||||||
|
if (unlikely(flags & MAP_HUGETLB && !is_file_hugepages(file)))
|
||||||
|
goto out_fput;
|
||||||
} else if (flags & MAP_HUGETLB) {
|
} else if (flags & MAP_HUGETLB) {
|
||||||
struct user_struct *user = NULL;
|
struct user_struct *user = NULL;
|
||||||
struct hstate *hs = hstate_sizelog((flags >> MAP_HUGE_SHIFT) &
|
struct hstate *hs = hstate_sizelog((flags >> MAP_HUGE_SHIFT) &
|
||||||
@ -1391,6 +1392,7 @@ SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,
|
|||||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||||
|
|
||||||
retval = vm_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
retval = vm_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||||
|
out_fput:
|
||||||
if (file)
|
if (file)
|
||||||
fput(file);
|
fput(file);
|
||||||
out:
|
out:
|
||||||
|
Loading…
Reference in New Issue
Block a user