[LTP] [PATCH V2 04/14] mem/ksm: convert to new API
Li Wang
liwang@redhat.com
Mon Apr 10 12:05:46 CEST 2017
Recast ksm_options structure to support parameter transfer.
Signed-off-by: Li Wang <liwang@redhat.com>
---
testcases/kernel/mem/include/mem.h | 9 ++-
testcases/kernel/mem/ksm/ksm01.c | 88 ++++++++++---------------
testcases/kernel/mem/ksm/ksm02.c | 123 ++++++++++++++---------------------
testcases/kernel/mem/ksm/ksm03.c | 90 ++++++++++---------------
testcases/kernel/mem/ksm/ksm04.c | 121 ++++++++++++++--------------------
testcases/kernel/mem/ksm/ksm05.c | 130 +++++++++++++++----------------------
testcases/kernel/mem/ksm/ksm06.c | 105 ++++++++++--------------------
testcases/kernel/mem/lib/mem.c | 16 ++---
8 files changed, 266 insertions(+), 416 deletions(-)
diff --git a/testcases/kernel/mem/include/mem.h b/testcases/kernel/mem/include/mem.h
index 377cc55..bada549 100644
--- a/testcases/kernel/mem/include/mem.h
+++ b/testcases/kernel/mem/include/mem.h
@@ -44,6 +44,10 @@ void testoom(int mempolicy, int lite, int retcode, int allow_sigkill);
#define PATH_KSM "/sys/kernel/mm/ksm/"
+char *opt_numstr, *opt_sizestr, *opt_unitstr;
+
+void create_same_memory(int size, int num, int unit);
+void check_ksm_options(int *size, int *num, int *unit);
void save_max_page_sharing(void);
void restore_max_page_sharing(void);
void test_ksm_merge_across_nodes(unsigned long nr_pages);
@@ -58,11 +62,6 @@ void test_ksm_merge_across_nodes(unsigned long nr_pages);
#define PATH_SHMMAX "/proc/sys/kernel/shmmax"
void write_memcg(void);
-void create_same_memory(int size, int num, int unit);
-int opt_num, opt_size, opt_unit;
-char *opt_numstr, *opt_sizestr, *opt_unitstr;
-void check_ksm_options(int *size, int *num, int *unit);
-void ksm_usage(void);
/* cpuset/memcg */
diff --git a/testcases/kernel/mem/ksm/ksm01.c b/testcases/kernel/mem/ksm/ksm01.c
index 824881c..849d4d4 100644
--- a/testcases/kernel/mem/ksm/ksm01.c
+++ b/testcases/kernel/mem/ksm/ksm01.c
@@ -1,4 +1,16 @@
/*
+ * Copyright (C) 2010-2017 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
+ * the GNU General Public License for more details.
+ *
* Kernel Samepage Merging (KSM)
*
* Basic tests were to start several programs with same and different
@@ -31,28 +43,6 @@
* - Change run setting to 2 - unmerging.
* - Check ksm statistics and verify the content.
* - Change run setting to 0 - stop.
- *
- * Copyright (C) 2010 Red Hat, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it
- * is free of the rightful claim of any third person regarding
- * infringement or the like. Any license provided herein, whether
- * implied or otherwise, applies only to this software file. Patent
- * licenses, if any, provided herein do not apply to combinations of
- * this program with other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
*/
#include <sys/types.h>
@@ -66,45 +56,29 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include "test.h"
#include "mem.h"
-char *TCID = "ksm01";
-int TST_TOTAL = 1;
-
static int merge_across_nodes;
-option_t ksm_options[] = {
- {"n:", &opt_num, &opt_numstr},
- {"s:", &opt_size, &opt_sizestr},
- {"u:", &opt_unit, &opt_unitstr},
+static struct tst_option ksm_options[] = {
+ {"n:", &opt_numstr, "-n Number of processes"},
+ {"s:", &opt_sizestr, "-s Memory allocation size in MB"},
+ {"u:", &opt_unitstr, "-u Memory allocation unit in MB"},
{NULL, NULL, NULL}
};
-int main(int argc, char *argv[])
+static void verify_ksm(void)
{
- int lc;
int size = 128, num = 3, unit = 1;
- tst_parse_opts(argc, argv, ksm_options, ksm_usage);
- setup();
- for (lc = 0; TEST_LOOPING(lc); lc++) {
- tst_count = 0;
- check_ksm_options(&size, &num, &unit);
- create_same_memory(size, num, unit);
- }
- cleanup();
- tst_exit();
+ check_ksm_options(&size, &num, &unit);
+ create_same_memory(size, num, unit);
}
-void setup(void)
+static void setup(void)
{
- tst_require_root();
-
- if (tst_kvercmp(2, 6, 32) < 0)
- tst_brkm(TCONF, NULL, "2.6.32 or greater kernel required");
if (access(PATH_KSM, F_OK) == -1)
- tst_brkm(TCONF, NULL, "KSM configuration is not enabled");
+ tst_brk(TCONF, "KSM configuration is not enabled");
save_max_page_sharing();
@@ -116,16 +90,13 @@ void setup(void)
* it is enabled before testing.
*/
if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) {
- SAFE_FILE_SCANF(NULL, PATH_KSM "merge_across_nodes",
+ SAFE_FILE_SCANF(PATH_KSM "merge_across_nodes",
"%d", &merge_across_nodes);
- SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", "1");
+ SAFE_FILE_PRINTF(PATH_KSM "merge_across_nodes", "1");
}
-
- tst_sig(FORK, DEF_HANDLER, NULL);
- TEST_PAUSE;
}
-void cleanup(void)
+static void cleanup(void)
{
if (access(PATH_KSM "merge_across_nodes", F_OK) == 0)
FILE_PRINTF(PATH_KSM "merge_across_nodes",
@@ -133,3 +104,14 @@ void cleanup(void)
restore_max_page_sharing();
}
+
+static struct tst_test test = {
+ .tid = "ksm01",
+ .needs_root = 1,
+ .forks_child = 1,
+ .options = ksm_options,
+ .setup = setup,
+ .cleanup = cleanup,
+ .test_all = verify_ksm,
+ .min_kver = "2.6.32",
+};
diff --git a/testcases/kernel/mem/ksm/ksm02.c b/testcases/kernel/mem/ksm/ksm02.c
index 6274f8a..eeebfef 100644
--- a/testcases/kernel/mem/ksm/ksm02.c
+++ b/testcases/kernel/mem/ksm/ksm02.c
@@ -1,5 +1,17 @@
/*
- * Kernel Samepage Merging (KSM) for NUMA
+ * Copyright (C) 2010-2017 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
+ * the GNU General Public License for more details.
+ *
+ * Kernel Samepage Merging (KSM)
*
* Basic tests were to start several programs with same and different
* memory contents and ensure only to merge the ones with the same
@@ -31,28 +43,6 @@
* - Change run setting to 2 - unmerging.
* - Check ksm statistics and verify the content.
* - Change run setting to 0 - stop.
- *
- * Copyright (C) 2010 Red Hat, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it
- * is free of the rightful claim of any third person regarding
- * infringement or the like. Any license provided herein, whether
- * implied or otherwise, applies only to this software file. Patent
- * licenses, if any, provided herein do not apply to combinations of
- * this program with other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
*/
#include "config.h"
@@ -66,60 +56,45 @@
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
-#include "test.h"
#include "mem.h"
-char *TCID = "ksm02";
-int TST_TOTAL = 1;
+#if HAVE_NUMA_H && HAVE_LINUX_MEMPOLICY_H && HAVE_NUMAIF_H \
+ && HAVE_MPOL_CONSTANTS
static int merge_across_nodes;
-#if HAVE_NUMA_H && HAVE_LINUX_MEMPOLICY_H && HAVE_NUMAIF_H \
- && HAVE_MPOL_CONSTANTS
-option_t ksm_options[] = {
- {"n:", &opt_num, &opt_numstr},
- {"s:", &opt_size, &opt_sizestr},
- {"u:", &opt_unit, &opt_unitstr},
+static struct tst_option ksm_options[] = {
+ {"n:", &opt_numstr, "-n Number of processes"},
+ {"s:", &opt_sizestr, "-s Memory allocation size in MB"},
+ {"u:", &opt_unitstr, "-u Memory allocation unit in MB"},
{NULL, NULL, NULL}
};
-int main(int argc, char *argv[])
+static void verify_ksm(void)
{
- int lc;
int size = 128, num = 3, unit = 1;
unsigned long nmask[MAXNODES / BITS_PER_LONG] = { 0 };
unsigned int node;
- tst_parse_opts(argc, argv, ksm_options, ksm_usage);
-
- node = get_a_numa_node(tst_exit);
+ node = get_a_numa_node();
set_node(nmask, node);
- setup();
-
- for (lc = 0; TEST_LOOPING(lc); lc++) {
- tst_count = 0;
- check_ksm_options(&size, &num, &unit);
-
- if (set_mempolicy(MPOL_BIND, nmask, MAXNODES) == -1) {
- if (errno != ENOSYS)
- tst_brkm(TBROK | TERRNO, cleanup,
- "set_mempolicy");
- else
- tst_brkm(TCONF, cleanup,
- "set_mempolicy syscall is not "
- "implemented on your system.");
- }
- create_same_memory(size, num, unit);
-
- write_cpusets(node);
- create_same_memory(size, num, unit);
+ check_ksm_options(&size, &num, &unit);
+
+ if (set_mempolicy(MPOL_BIND, nmask, MAXNODES) == -1) {
+ if (errno != ENOSYS)
+ tst_brk(TBROK | TERRNO, "set_mempolicy");
+ else
+ tst_brk(TCONF, "set_mempolicy syscall is not "
+ "implemented on your system.");
}
- cleanup();
- tst_exit();
+ create_same_memory(size, num, unit);
+
+ write_cpusets(node);
+ create_same_memory(size, num, unit);
}
-void cleanup(void)
+static void cleanup(void)
{
if (access(PATH_KSM "merge_across_nodes", F_OK) == 0)
FILE_PRINTF(PATH_KSM "merge_across_nodes",
@@ -130,30 +105,32 @@ void cleanup(void)
umount_mem(CPATH, CPATH_NEW);
}
-void setup(void)
+static void setup(void)
{
- tst_require_root();
-
- if (tst_kvercmp(2, 6, 32) < 0)
- tst_brkm(TCONF, NULL, "2.6.32 or greater kernel required");
if (access(PATH_KSM, F_OK) == -1)
- tst_brkm(TCONF, NULL, "KSM configuration is not enabled");
+ tst_brk(TCONF, "KSM configuration is not enabled");
save_max_page_sharing();
if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) {
- SAFE_FILE_SCANF(NULL, PATH_KSM "merge_across_nodes",
+ SAFE_FILE_SCANF(PATH_KSM "merge_across_nodes",
"%d", &merge_across_nodes);
- SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", "1");
+ SAFE_FILE_PRINTF(PATH_KSM "merge_across_nodes", "1");
}
- tst_sig(FORK, DEF_HANDLER, cleanup);
- TEST_PAUSE;
mount_mem("cpuset", "cpuset", NULL, CPATH, CPATH_NEW);
}
+static struct tst_test test = {
+ .tid = "ksm02",
+ .needs_root = 1,
+ .forks_child = 1,
+ .options = ksm_options,
+ .setup = setup,
+ .cleanup = cleanup,
+ .test_all = verify_ksm,
+ .min_kver = "2.6.32",
+};
+
#else /* no NUMA */
-int main(void)
-{
- tst_brkm(TCONF, NULL, "no NUMA development packages installed.");
-}
+ TST_TEST_TCONF("no NUMA development packages installed.");
#endif
diff --git a/testcases/kernel/mem/ksm/ksm03.c b/testcases/kernel/mem/ksm/ksm03.c
index 979222a..9fd5aac 100644
--- a/testcases/kernel/mem/ksm/ksm03.c
+++ b/testcases/kernel/mem/ksm/ksm03.c
@@ -1,4 +1,16 @@
/*
+ * Copyright (C) 2010-2017 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
+ * the GNU General Public License for more details.
+ *
* Kernel Samepage Merging (KSM) for Memory Resource Controller
*
* Basic tests were to start several programs with same and different
@@ -31,28 +43,6 @@
* - Change run setting to 2 - unmerging.
* - Check ksm statistics and verify the content.
* - Change run setting to 0 - stop.
- *
- * Copyright (C) 2010 Red Hat, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it
- * is free of the rightful claim of any third person regarding
- * infringement or the like. Any license provided herein, whether
- * implied or otherwise, applies only to this software file. Patent
- * licenses, if any, provided herein do not apply to combinations of
- * this program with other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
*/
#include <sys/types.h>
@@ -66,61 +56,42 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include "test.h"
#include "mem.h"
-char *TCID = "ksm03";
-int TST_TOTAL = 1;
-
static int merge_across_nodes;
-option_t ksm_options[] = {
- {"n:", &opt_num, &opt_numstr},
- {"s:", &opt_size, &opt_sizestr},
- {"u:", &opt_unit, &opt_unitstr},
+static struct tst_option ksm_options[] = {
+ {"n:", &opt_numstr, "-n Number of processes"},
+ {"s:", &opt_sizestr, "-s Memory allocation size in MB"},
+ {"u:", &opt_unitstr, "-u Memory allocation unit in MB"},
{NULL, NULL, NULL}
};
-int main(int argc, char *argv[])
+static void verify_ksm(void)
{
- int lc;
int size = 128, num = 3, unit = 1;
- tst_parse_opts(argc, argv, ksm_options, ksm_usage);
- setup();
- for (lc = 0; TEST_LOOPING(lc); lc++) {
- tst_count = 0;
- check_ksm_options(&size, &num, &unit);
- write_memcg();
- create_same_memory(size, num, unit);
- }
- cleanup();
- tst_exit();
+ check_ksm_options(&size, &num, &unit);
+ write_memcg();
+ create_same_memory(size, num, unit);
}
-void setup(void)
+static void setup(void)
{
- tst_require_root();
-
- if (tst_kvercmp(2, 6, 32) < 0)
- tst_brkm(TCONF, NULL, "2.6.32 or greater kernel required");
if (access(PATH_KSM, F_OK) == -1)
- tst_brkm(TCONF, NULL, "KSM configuration is not enabled");
+ tst_brk(TCONF, "KSM configuration is not enabled");
if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) {
- SAFE_FILE_SCANF(NULL, PATH_KSM "merge_across_nodes",
+ SAFE_FILE_SCANF(PATH_KSM "merge_across_nodes",
"%d", &merge_across_nodes);
- SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", "1");
+ SAFE_FILE_PRINTF(PATH_KSM "merge_across_nodes", "1");
}
save_max_page_sharing();
-
mount_mem("memcg", "cgroup", "memory", MEMCG_PATH, MEMCG_PATH_NEW);
- tst_sig(FORK, DEF_HANDLER, NULL);
- TEST_PAUSE;
}
-void cleanup(void)
+static void cleanup(void)
{
if (access(PATH_KSM "merge_across_nodes", F_OK) == 0)
FILE_PRINTF(PATH_KSM "merge_across_nodes",
@@ -130,3 +101,14 @@ void cleanup(void)
umount_mem(MEMCG_PATH, MEMCG_PATH_NEW);
}
+
+static struct tst_test test = {
+ .tid = "ksm03",
+ .needs_root = 1,
+ .forks_child = 1,
+ .options = ksm_options,
+ .setup = setup,
+ .cleanup = cleanup,
+ .test_all = verify_ksm,
+ .min_kver = "2.6.32",
+};
diff --git a/testcases/kernel/mem/ksm/ksm04.c b/testcases/kernel/mem/ksm/ksm04.c
index 4beeed6..29a5e2b 100644
--- a/testcases/kernel/mem/ksm/ksm04.c
+++ b/testcases/kernel/mem/ksm/ksm04.c
@@ -1,4 +1,16 @@
/*
+ * Copyright (C) 2010-2017 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
+ * the GNU General Public License for more details.
+ *
* Kernel Samepage Merging (KSM) for Memory Resource Controller and NUMA
*
* Basic tests were to start several programs with same and different
@@ -31,28 +43,6 @@
* - Change run setting to 2 - unmerging.
* - Check ksm statistics and verify the content.
* - Change run setting to 0 - stop.
- *
- * Copyright (C) 2010 Red Hat, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it
- * is free of the rightful claim of any third person regarding
- * infringement or the like. Any license provided herein, whether
- * implied or otherwise, applies only to this software file. Patent
- * licenses, if any, provided herein do not apply to combinations of
- * this program with other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
*/
#include "config.h"
@@ -66,62 +56,47 @@
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
-#include "test.h"
#include "mem.h"
-char *TCID = "ksm04";
-int TST_TOTAL = 1;
+#if HAVE_NUMA_H && HAVE_LINUX_MEMPOLICY_H && HAVE_NUMAIF_H \
+ && HAVE_MPOL_CONSTANTS
static int merge_across_nodes;
-#if HAVE_NUMA_H && HAVE_LINUX_MEMPOLICY_H && HAVE_NUMAIF_H \
- && HAVE_MPOL_CONSTANTS
-option_t ksm_options[] = {
- {"n:", &opt_num, &opt_numstr},
- {"s:", &opt_size, &opt_sizestr},
- {"u:", &opt_unit, &opt_unitstr},
+static struct tst_option ksm_options[] = {
+ {"n:", &opt_numstr, "-n Number of processes"},
+ {"s:", &opt_sizestr, "-s Memory allocation size in MB"},
+ {"u:", &opt_unitstr, "-u Memory allocation unit in MB"},
{NULL, NULL, NULL}
};
-int main(int argc, char *argv[])
+static void verify_ksm(void)
{
- int lc;
int size = 128, num = 3, unit = 1;
unsigned long nmask[MAXNODES / BITS_PER_LONG] = { 0 };
unsigned int node;
- tst_parse_opts(argc, argv, ksm_options, ksm_usage);
-
- node = get_a_numa_node(tst_exit);
+ node = get_a_numa_node();
set_node(nmask, node);
- setup();
-
- for (lc = 0; TEST_LOOPING(lc); lc++) {
- tst_count = 0;
- check_ksm_options(&size, &num, &unit);
+ check_ksm_options(&size, &num, &unit);
- write_memcg();
+ write_memcg();
- if (set_mempolicy(MPOL_BIND, nmask, MAXNODES) == -1) {
- if (errno != ENOSYS)
- tst_brkm(TBROK | TERRNO, cleanup,
- "set_mempolicy");
- else
- tst_brkm(TCONF, cleanup,
- "set_mempolicy syscall is not "
- "implemented on your system.");
- }
- create_same_memory(size, num, unit);
-
- write_cpusets(node);
- create_same_memory(size, num, unit);
+ if (set_mempolicy(MPOL_BIND, nmask, MAXNODES) == -1) {
+ if (errno != ENOSYS)
+ tst_brk(TBROK | TERRNO, "set_mempolicy");
+ else
+ tst_brk(TCONF, "set_mempolicy syscall is not "
+ "implemented on your system.");
}
- cleanup();
- tst_exit();
+ create_same_memory(size, num, unit);
+
+ write_cpusets(node);
+ create_same_memory(size, num, unit);
}
-void cleanup(void)
+static void cleanup(void)
{
if (access(PATH_KSM "merge_across_nodes", F_OK) == 0)
FILE_PRINTF(PATH_KSM "merge_across_nodes",
@@ -133,32 +108,34 @@ void cleanup(void)
umount_mem(MEMCG_PATH, MEMCG_PATH_NEW);
}
-void setup(void)
+static void setup(void)
{
- tst_require_root();
-
- if (tst_kvercmp(2, 6, 32) < 0)
- tst_brkm(TCONF, NULL, "2.6.32 or greater kernel required");
if (access(PATH_KSM, F_OK) == -1)
- tst_brkm(TCONF, NULL, "KSM configuration is not enabled");
+ tst_brk(TCONF, "KSM configuration is not enabled");
if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) {
- SAFE_FILE_SCANF(NULL, PATH_KSM "merge_across_nodes",
+ SAFE_FILE_SCANF(PATH_KSM "merge_across_nodes",
"%d", &merge_across_nodes);
- SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", "1");
+ SAFE_FILE_PRINTF(PATH_KSM "merge_across_nodes", "1");
}
save_max_page_sharing();
- tst_sig(FORK, DEF_HANDLER, cleanup);
- TEST_PAUSE;
mount_mem("cpuset", "cpuset", NULL, CPATH, CPATH_NEW);
mount_mem("memcg", "cgroup", "memory", MEMCG_PATH, MEMCG_PATH_NEW);
}
+static struct tst_test test = {
+ .tid = "ksm04",
+ .needs_root = 1,
+ .forks_child = 1,
+ .options = ksm_options,
+ .setup = setup,
+ .cleanup = cleanup,
+ .test_all = verify_ksm,
+ .min_kver = "2.6.32",
+};
+
#else /* no NUMA */
-int main(void)
-{
- tst_brkm(TCONF, NULL, "no NUMA development packages installed.");
-}
+ TST_TEST_TCONF("no NUMA development packages installed.");
#endif
diff --git a/testcases/kernel/mem/ksm/ksm05.c b/testcases/kernel/mem/ksm/ksm05.c
index 59b2683..59c8f4b 100644
--- a/testcases/kernel/mem/ksm/ksm05.c
+++ b/testcases/kernel/mem/ksm/ksm05.c
@@ -1,4 +1,16 @@
/*
+ * Copyright (C) 2011-2017 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
+ * the GNU General Public License for more details.
+ *
* KSM - NULL pointer dereference in ksm_do_scan() (CVE-2011-2183)
*
* This is a testcase from upstream commit:
@@ -29,94 +41,55 @@
* *) ksm and ksmtuned daemons need to be disabled. Otherwise, it could
* distrub the testing as they also change some ksm tunables depends
* on current workloads.
- *
- * Copyright (C) 2011 Red Hat, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it
- * is free of the rightful claim of any third person regarding
- * infringement or the like. Any license provided herein, whether
- * implied or otherwise, applies only to this software file. Patent
- * licenses, if any, provided herein do not apply to combinations of
- * this program with other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
*/
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
#include <sys/wait.h>
-#include <errno.h>
-#include <fcntl.h>
#include <signal.h>
-#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "test.h"
+#include <errno.h>
+#include "tst_test.h"
#include "mem.h"
-char *TCID = "ksm05";
-int TST_TOTAL = 1;
-
#ifdef HAVE_MADV_MERGEABLE
static int ksm_run_orig;
-
static void sighandler(int sig);
-int main(int argc, char *argv[])
+static void test_ksm(void)
{
- int lc, status, ret;
+ int status, ret;
long ps;
pid_t pid;
void *ptr;
-
- tst_parse_opts(argc, argv, NULL, NULL);
-
+ struct sigaction sa;
+
+ memset (&sa, '\0', sizeof(sa));
+ sa.sa_handler = sighandler;
+ sa.sa_flags = 0;
+ TEST(sigaction(SIGSEGV, &sa, NULL));
+ if (TEST_RETURN == -1)
+ tst_brk(TBROK | TRERRNO,
+ "SIGSEGV signal setup failed");
ps = sysconf(_SC_PAGESIZE);
- setup();
-
- for (lc = 0; TEST_LOOPING(lc); lc++) {
- tst_count = 0;
-
- switch (pid = fork()) {
- case -1:
- tst_brkm(TBROK | TERRNO, cleanup, "fork");
+ switch (pid = SAFE_FORK()) {
case 0:
ret = posix_memalign(&ptr, ps, ps);
if (ret) {
- tst_brkm(TBROK, cleanup, "posix_memalign(): %s",
- tst_strerrno(ret));
+ tst_brk(TBROK, "posix_memalign(): %s",
+ tst_strerrno(ret));
}
if (madvise(ptr, ps, MADV_MERGEABLE) < 0)
- tst_brkm(TBROK | TERRNO, cleanup, "madvise");
+ tst_brk(TBROK | TERRNO, "madvise");
*(char *)NULL = 0; /* SIGSEGV occurs as expected. */
- exit(0);
default:
break;
- }
- if (waitpid(pid, &status, WUNTRACED | WCONTINUED) == -1)
- tst_brkm(TBROK | TERRNO, cleanup, "waitpid");
- if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
- tst_brkm(TBROK, cleanup,
- "invalid signal received: %d", status);
}
+ if (waitpid(pid, &status, WUNTRACED | WCONTINUED) == -1)
+ tst_brk(TBROK | TERRNO, "waitpid");
+ if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
+ tst_brk(TBROK, "invalid signal received: %d", status);
- tst_resm(TPASS, "still alive.");
- cleanup();
- tst_exit();
+ tst_res(TPASS, "still alive.");
}
static void sighandler(int sig)
@@ -124,35 +97,34 @@ static void sighandler(int sig)
_exit((sig == SIGSEGV) ? 0 : sig);
}
-void setup(void)
+static void setup(void)
{
- tst_require_root();
-
- if (tst_kvercmp(2, 6, 32) < 0)
- tst_brkm(TCONF, NULL, "2.6.32 or greater kernel required.");
-
if (access(PATH_KSM, F_OK) == -1)
- tst_brkm(TCONF, NULL, "KSM configuration is not enabled");
-
- tst_sig(FORK, sighandler, cleanup);
-
- TEST_PAUSE;
+ tst_brk(TCONF, "KSM configuration is not enabled");
/* save original /sys/kernel/mm/ksm/run value */
- SAFE_FILE_SCANF(NULL, PATH_KSM "run", "%d", &ksm_run_orig);
+ SAFE_FILE_SCANF(PATH_KSM "run", "%d", &ksm_run_orig);
/* echo 1 > /sys/kernel/mm/ksm/run */
- SAFE_FILE_PRINTF(NULL, PATH_KSM "run", "1");
+ SAFE_FILE_PRINTF(PATH_KSM "run", "1");
}
-void cleanup(void)
+static void cleanup(void)
{
/* restore /sys/kernel/mm/ksm/run value */
FILE_PRINTF(PATH_KSM "run", "%d", ksm_run_orig);
}
+
+static struct tst_test test = {
+ .tid = "ksm05",
+ .needs_root = 1,
+ .forks_child = 1,
+ .setup = setup,
+ .cleanup = cleanup,
+ .test_all = test_ksm,
+ .min_kver = "2.6.32",
+};
+
#else
-int main(void)
-{
- tst_brkm(TCONF, NULL, "no MADV_MERGEABLE found.");
-}
+ TST_TEST_TCONF("no MADV_MERGEABLE found.");
#endif
diff --git a/testcases/kernel/mem/ksm/ksm06.c b/testcases/kernel/mem/ksm/ksm06.c
index 2092746..96c91b0 100644
--- a/testcases/kernel/mem/ksm/ksm06.c
+++ b/testcases/kernel/mem/ksm/ksm06.c
@@ -1,25 +1,15 @@
/*
- * Copyright (C) 2013 Linux Test Project
+ * Copyright (C) 2013-2017 Red Hat, Inc.
*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 2 of the GNU General Public
- * License as published by the Free Software Foundation.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
- * This program is distributed in the hope that it would be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it
- * is free of the rightful claim of any third person regarding
- * infringement or the like. Any license provided herein, whether
- * implied or otherwise, applies only to this software file. Patent
- * licenses, if any, provided herein do not apply to combinations of
- * this program with other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
+ * the GNU General Public License for more details.
*/
/*
@@ -35,6 +25,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
+#include <limits.h>
#include <errno.h>
#include <fcntl.h>
#if HAVE_NUMAIF_H
@@ -44,92 +35,68 @@
#include <stdio.h>
#include <unistd.h>
#include "numa_helper.h"
-#include "test.h"
-#include "safe_macros.h"
#include "mem.h"
-char *TCID = "ksm06";
-int TST_TOTAL = 1;
-
#if HAVE_NUMA_H && HAVE_LINUX_MEMPOLICY_H && HAVE_NUMAIF_H \
&& HAVE_MPOL_CONSTANTS
static int run;
static int sleep_millisecs;
static int merge_across_nodes;
-static int n_flag;
static unsigned long nr_pages;
-static char *n_opt;
-option_t options[] = {
- { "n:", &n_flag, &n_opt },
- { NULL, NULL, NULL }
+char *n_opt;
+static struct tst_option ksm_options[] = {
+ {"n:", &n_opt, "-n x Allocate x pages memory per node"},
+ {NULL, NULL, NULL}
};
-static void usage(void);
-int main(int argc, char *argv[])
+static void test_ksm(void)
{
- int lc;
-
- tst_parse_opts(argc, argv, options, &usage);
-
- if (n_flag)
- nr_pages = SAFE_STRTOUL(NULL, n_opt, 0, ULONG_MAX);
+ if (n_opt)
+ nr_pages = SAFE_STRTOUL(n_opt, 0, ULONG_MAX);
else
nr_pages = 100;
- setup();
-
- for (lc = 0; TEST_LOOPING(lc); lc++) {
- tst_count = 0;
-
- test_ksm_merge_across_nodes(nr_pages);
- }
-
- cleanup();
- tst_exit();
+ test_ksm_merge_across_nodes(nr_pages);
}
-void setup(void)
+static void setup(void)
{
if (access(PATH_KSM "merge_across_nodes", F_OK) == -1)
- tst_brkm(TCONF, NULL, "no merge_across_nodes sysfs knob");
+ tst_brk(TCONF, "no merge_across_nodes sysfs knob");
if (!is_numa(NULL, NH_MEMS, 2))
- tst_brkm(TCONF, NULL, "The case needs a NUMA system.");
+ tst_brk(TCONF, "The case needs a NUMA system.");
/* save the current value */
- SAFE_FILE_SCANF(NULL, PATH_KSM "run", "%d", &run);
- SAFE_FILE_SCANF(NULL, PATH_KSM "merge_across_nodes",
+ SAFE_FILE_SCANF(PATH_KSM "run", "%d", &run);
+ SAFE_FILE_SCANF(PATH_KSM "merge_across_nodes",
"%d", &merge_across_nodes);
- SAFE_FILE_SCANF(NULL, PATH_KSM "sleep_millisecs",
+ SAFE_FILE_SCANF(PATH_KSM "sleep_millisecs",
"%d", &sleep_millisecs);
save_max_page_sharing();
-
- tst_sig(FORK, DEF_HANDLER, cleanup);
- TEST_PAUSE;
}
-void cleanup(void)
+static void cleanup(void)
{
- FILE_PRINTF(PATH_KSM "merge_across_nodes",
- "%d", merge_across_nodes);
- FILE_PRINTF(PATH_KSM "sleep_millisecs",
- "%d", sleep_millisecs);
+ FILE_PRINTF(PATH_KSM "merge_across_nodes", "%d", merge_across_nodes);
+ FILE_PRINTF(PATH_KSM "sleep_millisecs", "%d", sleep_millisecs);
FILE_PRINTF(PATH_KSM "run", "%d", run);
restore_max_page_sharing();
}
-static void usage(void)
-{
- printf(" -n x Allocate x pages memory per node\n");
-}
+static struct tst_test test = {
+ .tid = "ksm06",
+ .needs_root = 1,
+ .options = ksm_options,
+ .setup = setup,
+ .cleanup = cleanup,
+ .test_all = test_ksm,
+};
#else /* no NUMA */
-int main(void)
-{
- tst_brkm(TCONF, NULL, "no NUMA development packages installed.");
-}
+ TST_TEST_TCONF("no NUMA development packages installed.");
#endif
diff --git a/testcases/kernel/mem/lib/mem.c b/testcases/kernel/mem/lib/mem.c
index 053737b..f5d86c7 100644
--- a/testcases/kernel/mem/lib/mem.c
+++ b/testcases/kernel/mem/lib/mem.c
@@ -266,9 +266,10 @@ static void check(char *path, long int value)
snprintf(fullpath, BUFSIZ, PATH_KSM "%s", path);
SAFE_FILE_SCANF(fullpath, "%ld", &actual_val);
- tst_res(TINFO, "%s is %ld.", path, actual_val);
if (actual_val != value)
tst_res(TFAIL, "%s is not %ld.", path, value);
+ else
+ tst_res(TPASS, "%s is %ld.", path, actual_val);
}
static void wait_ksmd_done(void)
@@ -636,12 +637,12 @@ void test_ksm_merge_across_nodes(unsigned long nr_pages)
void check_ksm_options(int *size, int *num, int *unit)
{
- if (opt_size) {
+ if (opt_sizestr) {
*size = atoi(opt_sizestr);
if (*size < 1)
tst_brk(TBROK, "size cannot be less than 1.");
}
- if (opt_unit) {
+ if (opt_unitstr) {
*unit = atoi(opt_unitstr);
if (*unit > *size)
tst_brk(TBROK,
@@ -651,7 +652,7 @@ void check_ksm_options(int *size, int *num, int *unit)
"the remainder of division of size by unit is "
"not zero.");
}
- if (opt_num) {
+ if (opt_numstr) {
*num = atoi(opt_numstr);
if (*num < 3)
tst_brk(TBROK,
@@ -659,13 +660,6 @@ void check_ksm_options(int *size, int *num, int *unit)
}
}
-void ksm_usage(void)
-{
- printf(" -n Number of processes\n");
- printf(" -s Memory allocation size in MB\n");
- printf(" -u Memory allocation unit in MB\n");
-}
-
/* THP */
/* cpuset/memcg */
--
2.9.3
More information about the ltp
mailing list