Commit 67203f3f authored by Pedro Falcato's avatar Pedro Falcato Committed by Andrew Morton
Browse files

selftests/mm: add mseal test for no-discard madvise

Add an mseal test for madvise() operations that aren't considered
"discard" (e.g purely advisory ops such as MADV_RANDOM).

[pedro.falcato@gmail.com: adjust the mseal test's plan]
  Link: https://lkml.kernel.org/r/20240807203724.2686144-1-pedro.falcato@gmail.com
Link: https://lkml.kernel.org/r/20240807173336.2523757-3-pedro.falcato@gmail.com


Signed-off-by: default avatarPedro Falcato <pedro.falcato@gmail.com>
Tested-by: default avatarJeff Xu <jeffxu@chromium.org>
Reviewed-by: default avatarJeff Xu <jeffxu@chromium.org>
Cc: Kees Cook <kees@kernel.org>
Cc: Liam R. Howlett <Liam.Howlett@oracle.com>
Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent cc0a0f98
Loading
Loading
Loading
Loading
+35 −1
Original line number Diff line number Diff line
@@ -1731,6 +1731,38 @@ static void test_seal_discard_ro_anon(bool seal)
	REPORT_TEST_PASS();
}

static void test_seal_madvise_nodiscard(bool seal)
{
	void *ptr;
	unsigned long page_size = getpagesize();
	unsigned long size = 4 * page_size;
	int ret;

	setup_single_address(size, &ptr);
	FAIL_TEST_IF_FALSE(ptr != (void *)-1);

	if (seal) {
		ret = seal_single_address(ptr, size);
		FAIL_TEST_IF_FALSE(!ret);
	}

	/*
	 * Test a random madvise flag like MADV_RANDOM that does not touch page
	 * contents (and thus should work for msealed VMAs). RANDOM also happens to
	 * share bits with other discard-ish flags like REMOVE.
	 */
	ret = sys_madvise(ptr, size, MADV_RANDOM);
	FAIL_TEST_IF_FALSE(!ret);

	ret = sys_munmap(ptr, size);
	if (seal)
		FAIL_TEST_IF_FALSE(ret < 0);
	else
		FAIL_TEST_IF_FALSE(!ret);

	REPORT_TEST_PASS();
}

int main(int argc, char **argv)
{
	bool test_seal = seal_support();
@@ -1743,7 +1775,7 @@ int main(int argc, char **argv)
	if (!pkey_supported())
		ksft_print_msg("PKEY not supported\n");

	ksft_set_plan(80);
	ksft_set_plan(82);

	test_seal_addseal();
	test_seal_unmapped_start();
@@ -1822,6 +1854,8 @@ int main(int argc, char **argv)
	test_seal_mremap_move_fixed_zero(true);
	test_seal_mremap_move_dontunmap_anyaddr(false);
	test_seal_mremap_move_dontunmap_anyaddr(true);
	test_seal_madvise_nodiscard(false);
	test_seal_madvise_nodiscard(true);
	test_seal_discard_ro_anon(false);
	test_seal_discard_ro_anon(true);
	test_seal_discard_ro_anon_on_rw(false);