[LTP] [PATCH 09/13] Hugetlb: Migrating libhugetlbfs private
Tarun Sahu
tsahu@linux.ibm.com
Sun Dec 25 16:42:09 CET 2022
Migrating the libhugetlbfs/testcases/private.c test
Test Description: The test do mmap() with shared mapping and write.
It matches the data with private mmap() and then change it with other
data. It checks shared mapping data if data is not contaiminated by
private mapping.
Signed-off-by: Tarun Sahu <tsahu@linux.ibm.com>
---
runtest/hugetlb | 1 +
testcases/kernel/mem/.gitignore | 1 +
.../kernel/mem/hugetlb/hugemmap/hugemmap29.c | 115 ++++++++++++++++++
3 files changed, 117 insertions(+)
create mode 100644 testcases/kernel/mem/hugetlb/hugemmap/hugemmap29.c
diff --git a/runtest/hugetlb b/runtest/hugetlb
index 95afe009e..6ec8d1018 100644
--- a/runtest/hugetlb
+++ b/runtest/hugetlb
@@ -29,6 +29,7 @@ hugemmap25 hugemmap25
hugemmap26 hugemmap26
hugemmap27 hugemmap27
hugemmap28 hugemmap28
+hugemmap29 hugemmap29
hugemmap05_1 hugemmap05 -m
hugemmap05_2 hugemmap05 -s
hugemmap05_3 hugemmap05 -s -m
diff --git a/testcases/kernel/mem/.gitignore b/testcases/kernel/mem/.gitignore
index 2f8ed0df0..fef0a76d6 100644
--- a/testcases/kernel/mem/.gitignore
+++ b/testcases/kernel/mem/.gitignore
@@ -28,6 +28,7 @@
/hugetlb/hugemmap/hugemmap26
/hugetlb/hugemmap/hugemmap27
/hugetlb/hugemmap/hugemmap28
+/hugetlb/hugemmap/hugemmap29
/hugetlb/hugeshmat/hugeshmat01
/hugetlb/hugeshmat/hugeshmat02
/hugetlb/hugeshmat/hugeshmat03
diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap29.c b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap29.c
new file mode 100644
index 000000000..2d921e169
--- /dev/null
+++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap29.c
@@ -0,0 +1,115 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/*
+ * Copyright (C) 2005-2006 IBM Corporation.
+ * Author: David Gibson & Adam Litke
+ */
+
+/*\
+ * [Description]
+ *
+ * The test do mmap() with shared mapping and write. It matches the data
+ * with private mmap() and then change it with other data. It checks
+ * shared mapping data if data is not contaiminated by private mapping.
+ * Similiarly checks for private data if it is not contaminated by changing
+ * shared mmap data.
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <sys/mount.h>
+#include <limits.h>
+#include <sys/param.h>
+#include <setjmp.h>
+#include <sys/types.h>
+
+#include "hugetlb.h"
+
+#define C1 0x1234ABCD
+#define C2 0xFEDC9876
+
+#define MNTPOINT "hugetlbfs/"
+static unsigned long hpage_size;
+static int fd = -1;
+
+static void run_test(void)
+{
+ void *p, *q;
+ unsigned int *pl, *ql;
+ unsigned long i;
+
+ fd = tst_creat_unlinked(MNTPOINT, 0);
+ p = SAFE_MMAP(NULL, hpage_size, PROT_READ|PROT_WRITE, MAP_SHARED,
+ fd, 0);
+
+ pl = p;
+ for (i = 0; i < (hpage_size / sizeof(*pl)); i++)
+ pl[i] = C1 ^ i;
+
+ q = SAFE_MMAP(NULL, hpage_size, PROT_READ|PROT_WRITE, MAP_PRIVATE,
+ fd, 0);
+
+ ql = q;
+ for (i = 0; i < (hpage_size / sizeof(*ql)); i++) {
+ if (ql[i] != (C1 ^ i)) {
+ tst_res(TFAIL, "Mismatch at offset %lu, got: %u, expected: %lu",
+ i, ql[i], C1 ^ i);
+ goto cleanup;
+ }
+ }
+
+ for (i = 0; i < (hpage_size / sizeof(*ql)); i++)
+ ql[i] = C2 ^ i;
+
+ for (i = 0; i < (hpage_size / sizeof(*ql)); i++) {
+ if (ql[i] != (C2 ^ i)) {
+ tst_res(TFAIL, "PRIVATE mismatch at offset %lu, got: %u, expected: %lu",
+ i, ql[i], C2 ^ i);
+ goto cleanup;
+ }
+ }
+
+ for (i = 0; i < (hpage_size / sizeof(*pl)); i++) {
+ if (pl[i] != (C1 ^ i)) {
+ tst_res(TFAIL, "SHARED map contaminated at offset %lu, "
+ "got: %u, expected: %lu", i, pl[i], C1 ^ i);
+ goto cleanup;
+ }
+ }
+
+ memset(p, 0, hpage_size);
+
+ for (i = 0; i < (hpage_size / sizeof(*ql)); i++) {
+ if (ql[i] != (C2 ^ i)) {
+ tst_res(TFAIL, "PRIVATE map contaminated at offset %lu, "
+ "got: %u, expected: %lu", i, ql[i], C2 ^ i);
+ goto cleanup;
+ }
+ }
+ tst_res(TPASS, "Successfully tested shared/private mmaping and its data");
+cleanup:
+ SAFE_MUNMAP(p, hpage_size);
+ SAFE_MUNMAP(q, hpage_size);
+ SAFE_CLOSE(fd);
+}
+
+static void setup(void)
+{
+ hpage_size = SAFE_READ_MEMINFO(MEMINFO_HPAGE_SIZE)*1024;
+}
+
+static void cleanup(void)
+{
+ if (fd >= 0)
+ SAFE_CLOSE(fd);
+}
+
+static struct tst_test test = {
+ .needs_root = 1,
+ .mntpoint = MNTPOINT,
+ .needs_hugetlbfs = 1,
+ .needs_tmpdir = 1,
+ .setup = setup,
+ .cleanup = cleanup,
+ .test_all = run_test,
+ .hugepages = {2, TST_NEEDS},
+};
--
2.31.1
More information about the ltp
mailing list