Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 215ba781 authored by David Rientjes's avatar David Rientjes Committed by Linus Torvalds
Browse files

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: default avatarDavid 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: default avatarMichael Ellerman <mpe@ellerman.id.au>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 80d6b94b
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -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,
+3 −1
Original line number Diff line number Diff line
@@ -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");
+5 −1
Original line number Diff line number Diff line
@@ -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;
}