mm, selftests: test return value of munmap for MAP_HUGETLB memory
When MAP_HUGETLB memory is unmapped, the length must be hugepage aligned, otherwise it fails with -EINVAL. All tests currently behave correctly, but it's better to explcitly test the return value for completeness and document the requirement, especially if users copy map_hugetlb.c as a sample implementation. Signed-off-by: David Rientjes <rientjes@google.com> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Davide Libenzi <davidel@xmailserver.org> Cc: Luiz Capitulino <lcapitulino@redhat.com> Cc: Shuah Khan <shuahkh@osg.samsung.com> Cc: Hugh Dickins <hughd@google.com> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Joern Engel <joern@logfs.org> Cc: Jianguo Wu <wujianguo@huawei.com> Cc: Eric B Munson <emunson@akamai.com> Acked-by: Michael Ellerman <mpe@ellerman.id.au> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
80d6b94bd6
commit
215ba78115
3 changed files with 14 additions and 4 deletions
|
@ -21,9 +21,13 @@ static int test_body(void)
|
|||
* Typically the mmap will fail because no huge pages are
|
||||
* allocated on the system. But if there are huge pages
|
||||
* allocated the mmap will succeed. That's fine too, we just
|
||||
* munmap here before continuing.
|
||||
* munmap here before continuing. munmap() length of
|
||||
* MAP_HUGETLB memory must be hugepage aligned.
|
||||
*/
|
||||
munmap(addr, SIZE);
|
||||
if (munmap(addr, SIZE)) {
|
||||
perror("munmap");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
p = mmap(addr, SIZE, PROT_READ | PROT_WRITE,
|
||||
|
|
|
@ -34,6 +34,7 @@ static void do_mmap(int fd, int extra_flags, int unmap)
|
|||
int *p;
|
||||
int flags = MAP_PRIVATE | MAP_POPULATE | extra_flags;
|
||||
u64 before, after;
|
||||
int ret;
|
||||
|
||||
before = read_rss();
|
||||
p = mmap(NULL, length, PROT_READ | PROT_WRITE, flags, fd, 0);
|
||||
|
@ -44,7 +45,8 @@ static void do_mmap(int fd, int extra_flags, int unmap)
|
|||
!"rss didn't grow as expected");
|
||||
if (!unmap)
|
||||
return;
|
||||
munmap(p, length);
|
||||
ret = munmap(p, length);
|
||||
assert(!ret || !"munmap returned an unexpected error");
|
||||
after = read_rss();
|
||||
assert(llabs(after - before) < 0x40000 ||
|
||||
!"rss didn't shrink as expected");
|
||||
|
|
|
@ -73,7 +73,11 @@ int main(void)
|
|||
write_bytes(addr);
|
||||
ret = read_bytes(addr);
|
||||
|
||||
munmap(addr, LENGTH);
|
||||
/* munmap() length of MAP_HUGETLB memory must be hugepage aligned */
|
||||
if (munmap(addr, LENGTH)) {
|
||||
perror("munmap");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue