* [LTP] [PATCH v6 0/4] Hugetlb:Migrating the libhugetlbfs tests
@ 2022-11-03 5:43 Tarun Sahu
2022-11-03 5:43 ` [LTP] [PATCH v6 1/4] Hugetlb: Add new tst_test options for hugeltb test support Tarun Sahu
` (3 more replies)
0 siblings, 4 replies; 11+ messages in thread
From: Tarun Sahu @ 2022-11-03 5:43 UTC (permalink / raw)
To: ltp; +Cc: geetika, sbhat, aneesh.kumar, vaibhav, rpalethorpe
Hi,
Libhugetlbfs is not being maintained actively, and some distro is dropping
support for it. There are some tests that are good for testing hugetlb
functionality in kernel.
As per previous dicussion in RFC[1], Here, this patch series consists
of hugetlb tests taken from libhugetlbfs modified to work in ltp
environment.
Based on suggestion[2], I am reposting the patches again. Also, I added
suggested changes at [3].
ref:
1:https://lore.kernel.org/all/20220908173947.17956-1-tsahu@linux.ibm.com/
2:https://lore.kernel.org/all/87wn8xi61v.fsf@suse.de/
3:https://lore.kernel.org/all/20221016125731.249078-1-tsahu@linux.ibm.com/
v1 -> v2
1. In (brk near huge) test [PATCH 1/3] removed unused library
function test_addr_huge() and read_maps().
v2 -> v3
1. Added a new patch commit for two new flags "needs_hugetlbfs" &
"needs_unlinked_hugetlb_file" in tst_test and modified tests to use
these flags.
2. Added taint check in test [PATCH 1/3].
3. Removed redundant Hopt and nr_opt option.
4. Corrected pre-processor ARCH based conditional flags in test
[PATCH 1/3]
v3 -> v4
1. Removed the needs_unlinked_hugetlb_file option in PATCH[1/4].
2. Removed the redundant saved_oc_hugepages checks in PATCH[3/4].
3. Updated the mntpoint checks in PATCH[1/4].
v4 -> v5
1. Removed the needs_hugetlbfs check from needs_tmpdir function,
because mntpoint is now mandatory option with needs_hugetlbfs.
(PATCH[1/4])
v5 -> v6
1. Edited the comment for needs_hugetlbfs PATCH[1/4].
2. Changed TCID to tid and removed __func__ from tst_brk PATCH[1/4].
3. Removed SAFE_UMOUNT in do_cleanup PATCH[1/4].
4. Added the ARCH definition in Makefile PATCH[2/4].
5. Removed ALIGN and use LTP_ALIGN PATCH[2/4].
Tarun Sahu (4):
Hugetlb: Add new tst_test options for hugeltb test support
Hugetlb: Migrating libhugetlbfs brk_near_huge
Hugetlb: Migrating libhugetlbfs chunk-overcommit
Hugetlb: Migrating libhugetlbfs corrupt-by-cow-opt
include/tst_test.h | 10 ++
lib/tst_test.c | 32 +++-
runtest/hugetlb | 3 +
testcases/kernel/mem/.gitignore | 3 +
.../kernel/mem/hugetlb/hugemmap/Makefile | 6 +
.../kernel/mem/hugetlb/hugemmap/hugemmap07.c | 138 ++++++++++++++++
.../kernel/mem/hugetlb/hugemmap/hugemmap08.c | 148 ++++++++++++++++++
.../kernel/mem/hugetlb/hugemmap/hugemmap09.c | 80 ++++++++++
testcases/kernel/mem/hugetlb/lib/hugetlb.h | 2 +
9 files changed, 419 insertions(+), 3 deletions(-)
create mode 100644 testcases/kernel/mem/hugetlb/hugemmap/hugemmap07.c
create mode 100644 testcases/kernel/mem/hugetlb/hugemmap/hugemmap08.c
create mode 100644 testcases/kernel/mem/hugetlb/hugemmap/hugemmap09.c
--
2.31.1
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 11+ messages in thread
* [LTP] [PATCH v6 1/4] Hugetlb: Add new tst_test options for hugeltb test support
2022-11-03 5:43 [LTP] [PATCH v6 0/4] Hugetlb:Migrating the libhugetlbfs tests Tarun Sahu
@ 2022-11-03 5:43 ` Tarun Sahu
2022-11-03 6:08 ` Li Wang
2022-11-03 9:45 ` Cyril Hrubis
2022-11-03 5:43 ` [LTP] [PATCH v6 2/4] Hugetlb: Migrating libhugetlbfs brk_near_huge Tarun Sahu
` (2 subsequent siblings)
3 siblings, 2 replies; 11+ messages in thread
From: Tarun Sahu @ 2022-11-03 5:43 UTC (permalink / raw)
To: ltp; +Cc: geetika, sbhat, aneesh.kumar, vaibhav, rpalethorpe
Most of libhugetlbfs test require mounted hugetlbfs.
Here, this patch adds a new field in tst_test struct(include/tst_test.h)
which user can set if the test requires mounted hugetlbfs. Also, this
patch added support to create the unlinked file in the provided dirpath.
Signed-off-by: Tarun Sahu <tsahu@linux.ibm.com>
---
include/tst_test.h | 10 ++++++++++
lib/tst_test.c | 32 +++++++++++++++++++++++++++++---
2 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/include/tst_test.h b/include/tst_test.h
index a69965b95..acf2421de 100644
--- a/include/tst_test.h
+++ b/include/tst_test.h
@@ -176,6 +176,10 @@ struct tst_test {
int all_filesystems:1;
int skip_in_lockdown:1;
int skip_in_compat:1;
+ /*
+ * If set, the hugetlbfs will be mounted at .mntpoint.
+ */
+ int needs_hugetlbfs:1;
/*
* The skip_filesystems is a NULL terminated list of filesystems the
@@ -357,6 +361,12 @@ unsigned int tst_remaining_runtime(void);
*/
void tst_set_max_runtime(int max_runtime);
+/*
+ * Create and open a random file inside the given dir path.
+ * It unlinks the file after opening and return file descriptor.
+ */
+int tst_creat_unlinked(const char *path);
+
/*
* Returns path to the test temporary directory in a newly allocated buffer.
*/
diff --git a/lib/tst_test.c b/lib/tst_test.c
index 8ccde1629..b225ba082 100644
--- a/lib/tst_test.c
+++ b/lib/tst_test.c
@@ -1021,6 +1021,28 @@ static void prepare_and_mount_dev_fs(const char *mntpoint)
}
}
+static void prepare_and_mount_hugetlb_fs(void)
+{
+ SAFE_MOUNT("none", tst_test->mntpoint, "hugetlbfs", 0, NULL);
+ mntpoint_mounted = 1;
+}
+
+int tst_creat_unlinked(const char *path)
+{
+ char template[PATH_MAX];
+ int fd;
+
+ snprintf(template, PATH_MAX, "%s/ltp_%.3sXXXXXX",
+ path, tid);
+
+ fd = mkstemp(template);
+ if (fd < 0)
+ tst_brk(TBROK | TERRNO, "mkstemp(%s) failed", template);
+
+ SAFE_UNLINK(template);
+ return fd;
+}
+
static const char *limit_tmpfs_mount_size(const char *mnt_data,
char *buf, size_t buf_size, const char *fs_type)
{
@@ -1191,15 +1213,16 @@ static void do_setup(int argc, char *argv[])
SAFE_MKDIR(tst_test->mntpoint, 0777);
if ((tst_test->needs_devfs || tst_test->needs_rofs ||
- tst_test->mount_device || tst_test->all_filesystems) &&
+ tst_test->mount_device || tst_test->all_filesystems ||
+ tst_test->needs_hugetlbfs) &&
!tst_test->mntpoint) {
tst_brk(TBROK, "tst_test->mntpoint must be set!");
}
if (!!tst_test->needs_rofs + !!tst_test->needs_devfs +
- !!tst_test->needs_device > 1) {
+ !!tst_test->needs_device + !!tst_test->needs_hugetlbfs > 1) {
tst_brk(TBROK,
- "Two or more of needs_{rofs, devfs, device} are set");
+ "Two or more of needs_{rofs, devfs, device, hugetlbfs} are set");
}
if (tst_test->needs_devfs)
@@ -1217,6 +1240,9 @@ static void do_setup(int argc, char *argv[])
}
}
+ if (tst_test->needs_hugetlbfs)
+ prepare_and_mount_hugetlb_fs();
+
if (tst_test->needs_device && !mntpoint_mounted) {
tdev.dev = tst_acquire_device_(NULL, tst_test->dev_min_size);
--
2.31.1
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [LTP] [PATCH v6 2/4] Hugetlb: Migrating libhugetlbfs brk_near_huge
2022-11-03 5:43 [LTP] [PATCH v6 0/4] Hugetlb:Migrating the libhugetlbfs tests Tarun Sahu
2022-11-03 5:43 ` [LTP] [PATCH v6 1/4] Hugetlb: Add new tst_test options for hugeltb test support Tarun Sahu
@ 2022-11-03 5:43 ` Tarun Sahu
2022-11-03 9:55 ` Cyril Hrubis
2022-11-03 10:01 ` Cyril Hrubis
2022-11-03 5:43 ` [LTP] [PATCH v6 3/4] Hugetlb: Migrating libhugetlbfs chunk-overcommit Tarun Sahu
2022-11-03 5:43 ` [LTP] [PATCH v6 4/4] Hugetlb: Migrating libhugetlbfs corrupt-by-cow-opt Tarun Sahu
3 siblings, 2 replies; 11+ messages in thread
From: Tarun Sahu @ 2022-11-03 5:43 UTC (permalink / raw)
To: ltp; +Cc: geetika, sbhat, aneesh.kumar, vaibhav, rpalethorpe
Migrating the libhugetlbfs/testcases/brk_near_huge.c test
Test Description:
Certain kernels have a bug where brk() does not perform the same
checks that a MAP_FIXED mmap() will, allowing brk() to create a
normal page VMA in a hugepage only address region. This can lead
to oopses or other badness.
Signed-off-by: Tarun Sahu <tsahu@linux.ibm.com>
---
runtest/hugetlb | 1 +
testcases/kernel/mem/.gitignore | 1 +
.../kernel/mem/hugetlb/hugemmap/Makefile | 6 +
.../kernel/mem/hugetlb/hugemmap/hugemmap07.c | 138 ++++++++++++++++++
testcases/kernel/mem/hugetlb/lib/hugetlb.h | 2 +
5 files changed, 148 insertions(+)
create mode 100644 testcases/kernel/mem/hugetlb/hugemmap/hugemmap07.c
diff --git a/runtest/hugetlb b/runtest/hugetlb
index f719217ab..f7ff81cb3 100644
--- a/runtest/hugetlb
+++ b/runtest/hugetlb
@@ -3,6 +3,7 @@ hugemmap02 hugemmap02
hugemmap04 hugemmap04
hugemmap05 hugemmap05
hugemmap06 hugemmap06
+hugemmap07 hugemmap07
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 ff2910533..df5256ec8 100644
--- a/testcases/kernel/mem/.gitignore
+++ b/testcases/kernel/mem/.gitignore
@@ -4,6 +4,7 @@
/hugetlb/hugemmap/hugemmap04
/hugetlb/hugemmap/hugemmap05
/hugetlb/hugemmap/hugemmap06
+/hugetlb/hugemmap/hugemmap07
/hugetlb/hugeshmat/hugeshmat01
/hugetlb/hugeshmat/hugeshmat02
/hugetlb/hugeshmat/hugeshmat03
diff --git a/testcases/kernel/mem/hugetlb/hugemmap/Makefile b/testcases/kernel/mem/hugetlb/hugemmap/Makefile
index 2d651b4aa..0199f8446 100644
--- a/testcases/kernel/mem/hugetlb/hugemmap/Makefile
+++ b/testcases/kernel/mem/hugetlb/hugemmap/Makefile
@@ -9,3 +9,9 @@ include $(abs_srcdir)/../Makefile.inc
include $(top_srcdir)/include/mk/generic_leaf_target.mk
hugemmap06: CFLAGS+=-pthread
+
+ARCH ?= $(shell uname -m | sed -e s/i.86/i386/)
+hugemmap07:
+ifeq ($(ARCH),ppc)
+ CPPFLAGS += -DPPC_NO_SEGMENTS
+endif
diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap07.c b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap07.c
new file mode 100644
index 000000000..70e1fde86
--- /dev/null
+++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap07.c
@@ -0,0 +1,138 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/*
+ * Copyright (C) 2005-2006 David Gibson & Adam Litke, IBM Corporation.
+ * Author: David Gibson & Adam Litke
+ */
+
+/*\
+ *
+ * [Description]
+ *
+ * brk near hugepage:
+ * Certain kernels have a bug where brk() does not perform the same
+ * checks that a MAP_FIXED mmap() will, allowing brk() to create a
+ * normal page VMA in a hugepage only address region. This can lead
+ * to oopses or other badness.
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <sys/mount.h>
+#include <limits.h>
+#include <sys/param.h>
+#include <sys/types.h>
+
+#include "hugetlb.h"
+#include "tst_safe_stdio.h"
+
+#define MNTPOINT "hugetlbfs/"
+static long hpage_size;
+static int huge_fd = -1;
+
+#ifdef __powerpc64__
+static int arch_has_slice_support(void)
+{
+ char mmu_type[16];
+ FILE *fp;
+ int ret;
+
+ fp = SAFE_POPEN("cat /proc/cpuinfo | grep MMU | awk '{ print $3}'", "r");
+ ret = fscanf(fp, "%s", mmu_type);
+ pclose(fp);
+
+ if (ret < 0)
+ tst_brk(TBROK, "Failed to determine MMU type");
+
+ return strcmp(mmu_type, "Hash") == 0;
+}
+
+static void *next_chunk(void *addr)
+{
+ if (!arch_has_slice_support())
+ return PALIGN(addr, hpage_size);
+
+ if ((unsigned long)addr < 0x100000000UL)
+ /* 256M segments below 4G */
+ return PALIGN(addr, 0x10000000UL);
+ /* 1TB segments above */
+ return PALIGN(addr, 0x10000000000UL);
+}
+#elif defined(__powerpc__) && !defined(PPC_NO_SEGMENTS)
+static void *next_chunk(void *addr)
+{
+ return PALIGN(addr, 0x10000000UL);
+}
+#elif defined(__ia64__)
+static void *next_chunk(void *addr)
+{
+ return PALIGN(addr, 0x8000000000000000UL);
+}
+#else
+static void *next_chunk(void *addr)
+{
+ return PALIGN(addr, hpage_size);
+}
+#endif
+
+static void run_test(void)
+{
+ void *brk0, *hugemap_addr, *newbrk;
+ char *p;
+ int err;
+
+ brk0 = sbrk(0);
+ tst_res(TINFO, "Initial break at %p", brk0);
+
+ hugemap_addr = next_chunk(brk0) + hpage_size;
+
+ p = SAFE_MMAP(hugemap_addr, hpage_size, PROT_READ|PROT_WRITE,
+ MAP_PRIVATE|MAP_FIXED, huge_fd, 0);
+ if (p != hugemap_addr) {
+ tst_res(TFAIL, "mmap() at unexpected address %p instead of %p\n", p,
+ hugemap_addr);
+ goto cleanup;
+ }
+
+ newbrk = next_chunk(brk0) + getpagesize();
+ err = brk((void *)newbrk);
+ if (err == -1) {
+ /* Failing the brk() is an acceptable kernel response */
+ tst_res(TPASS, "Failing the brk is an acceptable response");
+ } else {
+ /* Suceeding the brk() is acceptable if the new memory is
+ * properly accesible and we don't have a kernel blow up when
+ * we touch it.
+ */
+ tst_res(TINFO, "New break at %p", newbrk);
+ memset(brk0, 0, newbrk-brk0);
+ tst_res(TPASS, "memory is accessible, hence successful brk() is "
+ "an acceptable response");
+ }
+cleanup:
+ SAFE_MUNMAP(p, hpage_size);
+ err = brk(brk0);
+ if (err == -1)
+ tst_brk(TBROK, "Failed to set break at the original position");
+}
+
+static void setup(void)
+{
+ hpage_size = SAFE_READ_MEMINFO("Hugepagesize:")*1024;
+ huge_fd = tst_creat_unlinked(MNTPOINT);
+}
+
+static void cleanup(void)
+{
+ SAFE_CLOSE(huge_fd);
+}
+
+static struct tst_test test = {
+ .needs_root = 1,
+ .mntpoint = MNTPOINT,
+ .needs_hugetlbfs = 1,
+ .taint_check = TST_TAINT_D | TST_TAINT_W,
+ .setup = setup,
+ .cleanup = cleanup,
+ .test_all = run_test,
+ .hugepages = {1, TST_NEEDS},
+};
diff --git a/testcases/kernel/mem/hugetlb/lib/hugetlb.h b/testcases/kernel/mem/hugetlb/lib/hugetlb.h
index f75109f3e..a4300f40f 100644
--- a/testcases/kernel/mem/hugetlb/lib/hugetlb.h
+++ b/testcases/kernel/mem/hugetlb/lib/hugetlb.h
@@ -20,6 +20,8 @@
#include "old_tmpdir.h"
#include "mem.h"
+#define PALIGN(p, a) ((void *)LTP_ALIGN((unsigned long)(p), (a)))
+
#define SHM_RD 0400
#define SHM_WR 0200
#define SHM_RW (SHM_RD|SHM_WR)
--
2.31.1
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [LTP] [PATCH v6 3/4] Hugetlb: Migrating libhugetlbfs chunk-overcommit
2022-11-03 5:43 [LTP] [PATCH v6 0/4] Hugetlb:Migrating the libhugetlbfs tests Tarun Sahu
2022-11-03 5:43 ` [LTP] [PATCH v6 1/4] Hugetlb: Add new tst_test options for hugeltb test support Tarun Sahu
2022-11-03 5:43 ` [LTP] [PATCH v6 2/4] Hugetlb: Migrating libhugetlbfs brk_near_huge Tarun Sahu
@ 2022-11-03 5:43 ` Tarun Sahu
2022-11-03 5:43 ` [LTP] [PATCH v6 4/4] Hugetlb: Migrating libhugetlbfs corrupt-by-cow-opt Tarun Sahu
3 siblings, 0 replies; 11+ messages in thread
From: Tarun Sahu @ 2022-11-03 5:43 UTC (permalink / raw)
To: ltp; +Cc: geetika, sbhat, aneesh.kumar, vaibhav, rpalethorpe
Migrating the libhugetlbfs/testcases/chunk-overcommit.c test
Test Description: Some kernel versions after hugepage demand allocation was
added used a dubious heuristic to check if there was enough hugepage space
available for a given mapping. The number of not-already-instantiated
pages in the mapping was compared against the total hugepage free pool. It
was very easy to confuse this heuristic into overcommitting by allocating
hugepage memory in chunks, each less than the total available pool size but
together more than available. This would generally lead to OOM SIGKILLs of
one process or another when it tried to instantiate pages beyond the
available pool.
Signed-off-by: Tarun Sahu <tsahu@linux.ibm.com>
---
runtest/hugetlb | 1 +
testcases/kernel/mem/.gitignore | 1 +
.../kernel/mem/hugetlb/hugemmap/hugemmap08.c | 148 ++++++++++++++++++
3 files changed, 150 insertions(+)
create mode 100644 testcases/kernel/mem/hugetlb/hugemmap/hugemmap08.c
diff --git a/runtest/hugetlb b/runtest/hugetlb
index f7ff81cb3..664f18827 100644
--- a/runtest/hugetlb
+++ b/runtest/hugetlb
@@ -4,6 +4,7 @@ hugemmap04 hugemmap04
hugemmap05 hugemmap05
hugemmap06 hugemmap06
hugemmap07 hugemmap07
+hugemmap08 hugemmap08
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 df5256ec8..003ce422b 100644
--- a/testcases/kernel/mem/.gitignore
+++ b/testcases/kernel/mem/.gitignore
@@ -5,6 +5,7 @@
/hugetlb/hugemmap/hugemmap05
/hugetlb/hugemmap/hugemmap06
/hugetlb/hugemmap/hugemmap07
+/hugetlb/hugemmap/hugemmap08
/hugetlb/hugeshmat/hugeshmat01
/hugetlb/hugeshmat/hugeshmat02
/hugetlb/hugeshmat/hugeshmat03
diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap08.c b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap08.c
new file mode 100644
index 000000000..026433561
--- /dev/null
+++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap08.c
@@ -0,0 +1,148 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/*
+ * Copyright (C) 2005-2006 David Gibson & Adam Litke, IBM Corporation.
+ * Author: David Gibson & Adam Litke
+ */
+
+/*\
+ * [Description]
+ *
+ * Chunk Overcommit:
+ * Some kernel versions after hugepage demand allocation was added used a
+ * dubious heuristic to check if there was enough hugepage space available
+ * for a given mapping. The number of not-already-instantiated pages in
+ * the mapping was compared against the total hugepage free pool. It was
+ * very easy to confuse this heuristic into overcommitting by allocating
+ * hugepage memory in chunks, each less than the total available pool size
+ * but together more than available. This would generally lead to OOM
+ * SIGKILLs of one process or another when it tried to instantiate pages
+ * beyond the available pool.
+ *
+ * HISTORY
+ *
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/mount.h>
+#include <limits.h>
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <signal.h>
+
+#include "hugetlb.h"
+
+#define MNTPOINT "hugetlbfs/"
+#define PROC_OVERCOMMIT "/proc/sys/vm/nr_overcommit_hugepages"
+#define WITH_OVERCOMMIT 0
+#define WITHOUT_OVERCOMMIT 1
+
+static long hpage_size;
+static int huge_fd = -1;
+
+static void test_chunk_overcommit(void)
+{
+ unsigned long totpages, chunk1, chunk2;
+ void *p, *q;
+ pid_t child;
+ int status;
+
+ totpages = SAFE_READ_MEMINFO("HugePages_Free:");
+
+ chunk1 = (totpages / 2) + 1;
+ chunk2 = totpages - chunk1 + 1;
+
+ tst_res(TINFO, "Free: %ld hugepages available: "
+ "chunk1=%ld chunk2=%ld", totpages, chunk1, chunk2);
+
+ p = SAFE_MMAP(NULL, chunk1*hpage_size, PROT_READ|PROT_WRITE, MAP_SHARED,
+ huge_fd, 0);
+
+ q = mmap(NULL, chunk2*hpage_size, PROT_READ|PROT_WRITE, MAP_SHARED,
+ huge_fd, chunk1*hpage_size);
+ if (q == MAP_FAILED) {
+ if (errno != ENOMEM) {
+ tst_res(TFAIL | TERRNO, "mmap() chunk2");
+ goto cleanup1;
+ } else {
+ tst_res(TPASS, "Successful without overcommit pages");
+ goto cleanup1;
+ }
+ }
+
+ tst_res(TINFO, "Looks like we've overcommitted, testing...");
+ /* Looks like we're overcommited, but we need to confirm that
+ * this is bad. We touch it all in a child process because an
+ * overcommit will generally lead to a SIGKILL which we can't
+ * handle, of course.
+ */
+ child = SAFE_FORK();
+
+ if (child == 0) {
+ memset(p, 0, chunk1*hpage_size);
+ memset(q, 0, chunk2*hpage_size);
+ exit(0);
+ }
+
+ SAFE_WAITPID(child, &status, 0);
+
+ if (WIFSIGNALED(status)) {
+ tst_res(TFAIL, "Killed by signal '%s' due to overcommit",
+ tst_strsig(WTERMSIG(status)));
+ goto cleanup2;
+ }
+
+ tst_res(TPASS, "Successful with overcommit pages");
+
+cleanup2:
+ SAFE_MUNMAP(q, chunk2*hpage_size);
+
+cleanup1:
+ SAFE_MUNMAP(p, chunk1*hpage_size);
+ SAFE_FTRUNCATE(huge_fd, 0);
+}
+
+static void run_test(unsigned int test_type)
+{
+ switch (test_type) {
+ case WITHOUT_OVERCOMMIT:
+ tst_res(TINFO, "Without overcommit testing...");
+ SAFE_FILE_PRINTF(PROC_OVERCOMMIT, "%d", 0);
+ break;
+ case WITH_OVERCOMMIT:
+ tst_res(TINFO, "With overcommit testing...");
+ SAFE_FILE_PRINTF(PROC_OVERCOMMIT, "%d", 2);
+ break;
+ }
+ test_chunk_overcommit();
+}
+
+static void setup(void)
+{
+ hpage_size = SAFE_READ_MEMINFO("Hugepagesize:")*1024;
+ huge_fd = tst_creat_unlinked(MNTPOINT);
+}
+
+static void cleanup(void)
+{
+ SAFE_CLOSE(huge_fd);
+}
+
+static struct tst_test test = {
+ .needs_root = 1,
+ .mntpoint = MNTPOINT,
+ .needs_hugetlbfs = 1,
+ .forks_child = 1,
+ .save_restore = (const struct tst_path_val[]) {
+ {PROC_OVERCOMMIT, NULL},
+ {}
+ },
+ .tcnt = 2,
+ .setup = setup,
+ .cleanup = cleanup,
+ .test = run_test,
+ .hugepages = {3, TST_NEEDS},
+};
+
--
2.31.1
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [LTP] [PATCH v6 4/4] Hugetlb: Migrating libhugetlbfs corrupt-by-cow-opt
2022-11-03 5:43 [LTP] [PATCH v6 0/4] Hugetlb:Migrating the libhugetlbfs tests Tarun Sahu
` (2 preceding siblings ...)
2022-11-03 5:43 ` [LTP] [PATCH v6 3/4] Hugetlb: Migrating libhugetlbfs chunk-overcommit Tarun Sahu
@ 2022-11-03 5:43 ` Tarun Sahu
3 siblings, 0 replies; 11+ messages in thread
From: Tarun Sahu @ 2022-11-03 5:43 UTC (permalink / raw)
To: ltp; +Cc: geetika, sbhat, aneesh.kumar, vaibhav, rpalethorpe
Migrating the libhugetlbfs/testcases/corrupt-by-cow-opt.c test
Test Description: Test sanity of cow optimization on page cache. If a page
in page cache has only 1 ref count, it is mapped for a private mapping
directly and is overwritten freely, so next time we access the page, we
can see corrupt data.
Signed-off-by: Tarun Sahu <tsahu@linux.ibm.com>
---
runtest/hugetlb | 1 +
testcases/kernel/mem/.gitignore | 1 +
.../kernel/mem/hugetlb/hugemmap/hugemmap09.c | 80 +++++++++++++++++++
3 files changed, 82 insertions(+)
create mode 100644 testcases/kernel/mem/hugetlb/hugemmap/hugemmap09.c
diff --git a/runtest/hugetlb b/runtest/hugetlb
index 664f18827..e2ada7a97 100644
--- a/runtest/hugetlb
+++ b/runtest/hugetlb
@@ -5,6 +5,7 @@ hugemmap05 hugemmap05
hugemmap06 hugemmap06
hugemmap07 hugemmap07
hugemmap08 hugemmap08
+hugemmap09 hugemmap09
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 003ce422b..1a242ffe0 100644
--- a/testcases/kernel/mem/.gitignore
+++ b/testcases/kernel/mem/.gitignore
@@ -6,6 +6,7 @@
/hugetlb/hugemmap/hugemmap06
/hugetlb/hugemmap/hugemmap07
/hugetlb/hugemmap/hugemmap08
+/hugetlb/hugemmap/hugemmap09
/hugetlb/hugeshmat/hugeshmat01
/hugetlb/hugeshmat/hugeshmat02
/hugetlb/hugeshmat/hugeshmat03
diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap09.c b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap09.c
new file mode 100644
index 000000000..df7c9edcb
--- /dev/null
+++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap09.c
@@ -0,0 +1,80 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/*
+ * Copyright (C) 2013 Joonsoo Kim, LG Electronics.
+ * Author: Joonsoo Kim
+ */
+
+/*\
+ * [Description]
+ *
+ * Corrupt by COW optimization:
+ * Test sanity of cow optimization on page cache. If a page in page cache
+ * has only 1 ref count, it is mapped for a private mapping directly and
+ * is overwritten freely, so next time we access the page, we can see
+ * corrupt data.
+ *
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <sys/mount.h>
+#include <limits.h>
+#include <sys/param.h>
+#include <sys/types.h>
+
+#include "hugetlb.h"
+
+#define MNTPOINT "hugetlbfs/"
+static long hpage_size;
+static int huge_fd = -1;
+
+static void run_test(void)
+{
+ char *p;
+ char c;
+
+ p = SAFE_MMAP(NULL, hpage_size, PROT_READ|PROT_WRITE, MAP_SHARED,
+ huge_fd, 0);
+ *p = 's';
+ tst_res(TINFO, "Write %c to %p via shared mapping", *p, p);
+ SAFE_MUNMAP(p, hpage_size);
+
+ p = SAFE_MMAP(NULL, hpage_size, PROT_READ|PROT_WRITE, MAP_PRIVATE,
+ huge_fd, 0);
+ *p = 'p';
+ tst_res(TINFO, "Write %c to %p via private mapping", *p, p);
+ SAFE_MUNMAP(p, hpage_size);
+
+ p = SAFE_MMAP(NULL, hpage_size, PROT_READ|PROT_WRITE, MAP_SHARED,
+ huge_fd, 0);
+ c = *p;
+ tst_res(TINFO, "Read %c from %p via shared mapping", *p, p);
+ SAFE_MUNMAP(p, hpage_size);
+
+ /* Direct write from huge page */
+ if (c != 's')
+ tst_res(TFAIL, "Data got corrupted.");
+ else
+ tst_res(TPASS, "Successful");
+}
+
+static void setup(void)
+{
+ hpage_size = SAFE_READ_MEMINFO("Hugepagesize:")*1024;
+ huge_fd = tst_creat_unlinked(MNTPOINT);
+}
+
+static void cleanup(void)
+{
+ SAFE_CLOSE(huge_fd);
+}
+
+static struct tst_test test = {
+ .needs_root = 1,
+ .mntpoint = MNTPOINT,
+ .needs_hugetlbfs = 1,
+ .setup = setup,
+ .cleanup = cleanup,
+ .test_all = run_test,
+ .hugepages = {2, TST_NEEDS},
+};
--
2.31.1
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [LTP] [PATCH v6 1/4] Hugetlb: Add new tst_test options for hugeltb test support
2022-11-03 5:43 ` [LTP] [PATCH v6 1/4] Hugetlb: Add new tst_test options for hugeltb test support Tarun Sahu
@ 2022-11-03 6:08 ` Li Wang
2022-11-03 9:31 ` Tarun Sahu
2022-11-03 9:45 ` Cyril Hrubis
1 sibling, 1 reply; 11+ messages in thread
From: Li Wang @ 2022-11-03 6:08 UTC (permalink / raw)
To: Tarun Sahu; +Cc: sbhat, aneesh.kumar, geetika, vaibhav, rpalethorpe, ltp
[-- Attachment #1.1: Type: text/plain, Size: 498 bytes --]
Tarun Sahu <tsahu@linux.ibm.com> wrote:
Most of libhugetlbfs test require mounted hugetlbfs.
>
> Here, this patch adds a new field in tst_test struct(include/tst_test.h)
> which user can set if the test requires mounted hugetlbfs. Also, this
> patch added support to create the unlinked file in the provided dirpath.
>
> Signed-off-by: Tarun Sahu <tsahu@linux.ibm.com>
>
Thanks for the patiently iteration. This looks pretty good.
Reviewed-by: Li Wang <liwang@redhat.com>
--
Regards,
Li Wang
[-- Attachment #1.2: Type: text/html, Size: 1325 bytes --]
[-- Attachment #2: Type: text/plain, Size: 60 bytes --]
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [LTP] [PATCH v6 1/4] Hugetlb: Add new tst_test options for hugeltb test support
2022-11-03 6:08 ` Li Wang
@ 2022-11-03 9:31 ` Tarun Sahu
2022-11-03 9:55 ` Li Wang
0 siblings, 1 reply; 11+ messages in thread
From: Tarun Sahu @ 2022-11-03 9:31 UTC (permalink / raw)
To: Li Wang; +Cc: geetika, sbhat, aneesh.kumar, vaibhav, rpalethorpe, ltp
Hello,
Thanks for reviewing.
I am thinking of adding following lines in "lib/hugetlb.h"
#define HUGEPAGE_TOTAL "HugePages_Total:"
#define HUGEPAGE_FREE "HugePages_Total:"
#define HUGEPAGE_RSVD "HugePages_Total:"
#define HUGEPAGE_Surp "HugePages_Total:"
There are all test that uses, TOTAL, MANY that uses FREE, few RSVD, SURP.
If we change it now, we can update this series now and, proceed further for
series of next tests.
What do you think?
On Nov 03 2022, Li Wang wrote:
> Tarun Sahu <tsahu@linux.ibm.com> wrote:
>
> Most of libhugetlbfs test require mounted hugetlbfs.
> >
> > Here, this patch adds a new field in tst_test struct(include/tst_test.h)
> > which user can set if the test requires mounted hugetlbfs. Also, this
> > patch added support to create the unlinked file in the provided dirpath.
> >
> > Signed-off-by: Tarun Sahu <tsahu@linux.ibm.com>
> >
>
>
> Thanks for the patiently iteration. This looks pretty good.
>
> Reviewed-by: Li Wang <liwang@redhat.com>
>
> --
> Regards,
> Li Wang
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [LTP] [PATCH v6 1/4] Hugetlb: Add new tst_test options for hugeltb test support
2022-11-03 5:43 ` [LTP] [PATCH v6 1/4] Hugetlb: Add new tst_test options for hugeltb test support Tarun Sahu
2022-11-03 6:08 ` Li Wang
@ 2022-11-03 9:45 ` Cyril Hrubis
1 sibling, 0 replies; 11+ messages in thread
From: Cyril Hrubis @ 2022-11-03 9:45 UTC (permalink / raw)
To: Tarun Sahu; +Cc: sbhat, aneesh.kumar, geetika, vaibhav, rpalethorpe, ltp
Hi!
Looks good now.
Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
--
Cyril Hrubis
chrubis@suse.cz
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [LTP] [PATCH v6 1/4] Hugetlb: Add new tst_test options for hugeltb test support
2022-11-03 9:31 ` Tarun Sahu
@ 2022-11-03 9:55 ` Li Wang
0 siblings, 0 replies; 11+ messages in thread
From: Li Wang @ 2022-11-03 9:55 UTC (permalink / raw)
To: Tarun Sahu; +Cc: geetika, sbhat, aneesh.kumar, vaibhav, rpalethorpe, ltp
[-- Attachment #1.1: Type: text/plain, Size: 918 bytes --]
On Thu, Nov 3, 2022 at 5:33 PM Tarun Sahu <tsahu@linux.ibm.com> wrote:
> Hello,
> Thanks for reviewing.
>
> I am thinking of adding following lines in "lib/hugetlb.h"
>
> #define HUGEPAGE_TOTAL "HugePages_Total:"
> #define HUGEPAGE_FREE "HugePages_Total:"
> #define HUGEPAGE_RSVD "HugePages_Total:"
> #define HUGEPAGE_Surp "HugePages_Total:"
>
> There are all test that uses, TOTAL, MANY that uses FREE, few RSVD, SURP.
> If we change it now, we can update this series now and, proceed further for
> series of next tests.
>
> What do you think?
>
I guess put in the top header file "inlucde/tst_hugepage.h" should be
better,
it provides more scope(for the whole LTP) of use.
I ever thought to combine this hugetlb/lib there, especially for new cases,
it would be easier to maintain only one library for hugetlb.
(and also adding more definitions. e.g.
"/proc/sys/vm/nr_overcommit_hugepages")
--
Regards,
Li Wang
[-- Attachment #1.2: Type: text/html, Size: 1881 bytes --]
[-- Attachment #2: Type: text/plain, Size: 60 bytes --]
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [LTP] [PATCH v6 2/4] Hugetlb: Migrating libhugetlbfs brk_near_huge
2022-11-03 5:43 ` [LTP] [PATCH v6 2/4] Hugetlb: Migrating libhugetlbfs brk_near_huge Tarun Sahu
@ 2022-11-03 9:55 ` Cyril Hrubis
2022-11-03 10:01 ` Cyril Hrubis
1 sibling, 0 replies; 11+ messages in thread
From: Cyril Hrubis @ 2022-11-03 9:55 UTC (permalink / raw)
To: Tarun Sahu; +Cc: sbhat, aneesh.kumar, geetika, vaibhav, rpalethorpe, ltp
Hi!
> diff --git a/testcases/kernel/mem/hugetlb/hugemmap/Makefile b/testcases/kernel/mem/hugetlb/hugemmap/Makefile
> index 2d651b4aa..0199f8446 100644
> --- a/testcases/kernel/mem/hugetlb/hugemmap/Makefile
> +++ b/testcases/kernel/mem/hugetlb/hugemmap/Makefile
> @@ -9,3 +9,9 @@ include $(abs_srcdir)/../Makefile.inc
> include $(top_srcdir)/include/mk/generic_leaf_target.mk
>
> hugemmap06: CFLAGS+=-pthread
> +
> +ARCH ?= $(shell uname -m | sed -e s/i.86/i386/)
This will break cross-compilation. We cannot assume anything during
compilation based on the system we compile LTP on.
What are we trying to detect here?
Looking at:
https://github.com/libhugetlbfs/libhugetlbfs/commit/cc0717ca0deee9dc0bb84acc8c80fd468b180f6f
it seems that we are looking for native 32bit PPC, that means that we
have to check on runtime, because we don't know if we are going to run
in 32bit compat mode or on native 32bit machine when we are compiling.
We do have tst_kernel_bits() function exactly for this purpose.
--
Cyril Hrubis
chrubis@suse.cz
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [LTP] [PATCH v6 2/4] Hugetlb: Migrating libhugetlbfs brk_near_huge
2022-11-03 5:43 ` [LTP] [PATCH v6 2/4] Hugetlb: Migrating libhugetlbfs brk_near_huge Tarun Sahu
2022-11-03 9:55 ` Cyril Hrubis
@ 2022-11-03 10:01 ` Cyril Hrubis
1 sibling, 0 replies; 11+ messages in thread
From: Cyril Hrubis @ 2022-11-03 10:01 UTC (permalink / raw)
To: Tarun Sahu; +Cc: sbhat, aneesh.kumar, geetika, vaibhav, rpalethorpe, ltp
Hi!
> +/*\
> + *
> + * [Description]
> + *
> + * brk near hugepage:
^
and this bit is still here
If you have asciidoc installed you can run make in the top level LTP
directory which will generate docparse/metadata.html where you can check
how the documentation is rendered.
> + * Certain kernels have a bug where brk() does not perform the same
> + * checks that a MAP_FIXED mmap() will, allowing brk() to create a
> + * normal page VMA in a hugepage only address region. This can lead
> + * to oopses or other badness.
> + */
--
Cyril Hrubis
chrubis@suse.cz
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2022-11-03 10:01 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-11-03 5:43 [LTP] [PATCH v6 0/4] Hugetlb:Migrating the libhugetlbfs tests Tarun Sahu
2022-11-03 5:43 ` [LTP] [PATCH v6 1/4] Hugetlb: Add new tst_test options for hugeltb test support Tarun Sahu
2022-11-03 6:08 ` Li Wang
2022-11-03 9:31 ` Tarun Sahu
2022-11-03 9:55 ` Li Wang
2022-11-03 9:45 ` Cyril Hrubis
2022-11-03 5:43 ` [LTP] [PATCH v6 2/4] Hugetlb: Migrating libhugetlbfs brk_near_huge Tarun Sahu
2022-11-03 9:55 ` Cyril Hrubis
2022-11-03 10:01 ` Cyril Hrubis
2022-11-03 5:43 ` [LTP] [PATCH v6 3/4] Hugetlb: Migrating libhugetlbfs chunk-overcommit Tarun Sahu
2022-11-03 5:43 ` [LTP] [PATCH v6 4/4] Hugetlb: Migrating libhugetlbfs corrupt-by-cow-opt Tarun Sahu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox