diff --git a/runtest/syscalls b/runtest/syscalls index 5b3a0862fae..2e535abf634 100644 --- a/runtest/syscalls +++ b/runtest/syscalls @@ -879,6 +879,7 @@ open_tree02 open_tree02 mincore01 mincore01 mincore02 mincore02 +mincore03 mincore03 madvise01 madvise01 madvise02 madvise02 diff --git a/testcases/kernel/syscalls/mincore/.gitignore b/testcases/kernel/syscalls/mincore/.gitignore index fdb2070e98e..71c3e9864fe 100644 --- a/testcases/kernel/syscalls/mincore/.gitignore +++ b/testcases/kernel/syscalls/mincore/.gitignore @@ -1,2 +1,3 @@ /mincore01 /mincore02 +/mincore03 diff --git a/testcases/kernel/syscalls/mincore/mincore03.c b/testcases/kernel/syscalls/mincore/mincore03.c new file mode 100644 index 00000000000..774fce98b98 --- /dev/null +++ b/testcases/kernel/syscalls/mincore/mincore03.c @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) Zilogic Systems Pvt. Ltd., 2020 + * Email: code@zilogic.com + */ + +/* + * mincore03 + * Testcase 1: Test shows that pages mapped as anonymous and + * not faulted, are reported as not resident in memory by mincore(). + * Testcase 2: Test shows that pages mapped as anonymous and faulted, + * are reported as resident in memory by mincore(). + */ + +#include +#include +#include +#include "tst_test.h" + +#define NUM_PAGES 3 + +static struct tcase { + bool mlock; + int expected_pages; + char *desc; +} tcases[] = { + { false, 0, "untouched pages are not resident"}, + { true, NUM_PAGES, "locked pages are resident"}, +}; + +static int size, page_size; +static void *ptr; + +static void cleanup(void) +{ + if (ptr) + SAFE_MUNMAP(ptr, size); +} + +static void setup(void) +{ + page_size = getpagesize(); + size = page_size * NUM_PAGES; +} + +static void test_mincore(unsigned int test_nr) +{ + const struct tcase *tc = &tcases[test_nr]; + unsigned char vec[NUM_PAGES]; + int locked_pages; + int count, mincore_ret; + + ptr = SAFE_MMAP(NULL, size, PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); + if (tc->mlock) + SAFE_MLOCK(ptr, size); + + mincore_ret = mincore(ptr, size, vec); + if (mincore_ret == -1) + tst_brk(TBROK | TERRNO, "mincore failed"); + locked_pages = 0; + for (count = 0; count < NUM_PAGES; count++) + if (vec[count] & 1) + locked_pages++; + + if (locked_pages == tc->expected_pages) + tst_res(TPASS, "mincore() reports %s", tc->desc); + else + tst_res(TFAIL, "mincore reports resident pages as %d, but expected %d", + locked_pages, tc->expected_pages); + + if (tc->mlock) + SAFE_MUNLOCK(ptr, size); + SAFE_MUNMAP(ptr, size); + ptr = NULL; +} + +static struct tst_test test = { + .tcnt = ARRAY_SIZE(tcases), + .setup = setup, + .cleanup = cleanup, + .test = test_mincore, +}; +