[LTP] [PATCH v2] Add mincore() test for anonymous mappings
Shwetha Subramanian
shwetha@zilogic.com
Mon Jul 6 07:08:28 CEST 2020
Changes from v1:
1.Changed testcase description.
2.Checked ptr before executing SAFE_MUNMAP() in cleanup().
3.Added a setup() fuction.
4.Fixed formatting issues.
5.Changed TPASS and TFAIL messages.
6.Changed syntax for conditional statements.
References: #461
Signed-off-by: Shwetha Subramanian. <shwetha@zilogic.com>
Reviewed-by: Vijay Kumar B. <vijaykumar@zilogic.com>
---
runtest/syscalls | 1 +
testcases/kernel/syscalls/mincore/.gitignore | 1 +
testcases/kernel/syscalls/mincore/mincore03.c | 83 +++++++++++++++++++
3 files changed, 85 insertions(+)
create mode 100644 testcases/kernel/syscalls/mincore/mincore03.c
diff --git a/runtest/syscalls b/runtest/syscalls
index b4d523319..e0fe9f87e 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 fdb2070e9..fcbe27eac 100644
--- a/testcases/kernel/syscalls/mincore/.gitignore
+++ b/testcases/kernel/syscalls/mincore/.gitignore
@@ -1,2 +1,3 @@
/mincore01
/mincore02
+/mincore03
\ No newline at end of file
diff --git a/testcases/kernel/syscalls/mincore/mincore03.c b/testcases/kernel/syscalls/mincore/mincore03.c
new file mode 100644
index 000000000..774fce98b
--- /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 <stdbool.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#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,
+};
+
--
2.20.1
More information about the ltp
mailing list