* [LTP] [PATCH] syscalls/migrate_pages03.c: Add new regression test
@ 2017-11-28 10:07 Xiao Yang
2017-11-30 15:20 ` Cyril Hrubis
0 siblings, 1 reply; 24+ messages in thread
From: Xiao Yang @ 2017-11-28 10:07 UTC (permalink / raw)
To: ltp
The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
Signed-off-by: Xiao Yang <yangx.jy@cn.fujitsu.com>
Signed-off-by: Jie Fei <feij.fnst@cn.fujitsu.com>
---
runtest/syscalls | 1 +
testcases/kernel/syscalls/.gitignore | 1 +
.../syscalls/migrate_pages/migrate_pages03.c | 176 +++++++++++++++++++++
3 files changed, 178 insertions(+)
create mode 100644 testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
diff --git a/runtest/syscalls b/runtest/syscalls
index 14089ac..51885d4 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -587,6 +587,7 @@ memcpy01 memcpy01
migrate_pages01 migrate_pages01
migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
mlockall01 mlockall01
mlockall02 mlockall02
diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
index 12a136e..27e30b2 100644
--- a/testcases/kernel/syscalls/.gitignore
+++ b/testcases/kernel/syscalls/.gitignore
@@ -538,6 +538,7 @@
/memset/memset01
/migrate_pages/migrate_pages01
/migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
/mincore/mincore01
/mincore/mincore02
/mkdir/mkdir01
diff --git a/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
new file mode 100644
index 0000000..6d0b3c6
--- /dev/null
+++ b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
+ * Jie Fei <feij.fnst@cn.fujitsu.com>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program, if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * Description:
+ * This is a regression test for ksm page migration which is miscalculated.
+ *
+ * The kernel bug has been fixed by:
+ *
+ * commit 4b0ece6fa0167b22c004ff69e137dc94ee2e469e
+ * Author: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
+ * Date: Fri Mar 31 15:11:44 2017 -0700
+ *
+ * mm: migrate: fix remove_migration_pte() for ksm pages
+ */
+
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#if HAVE_NUMA_H
+#include <numa.h>
+#endif
+#if HAVE_NUMAIF_H
+#include <numaif.h>
+#endif
+
+#include "config.h"
+#include "lapi/syscalls.h"
+#include "lapi/mmap.h"
+#include "tst_test.h"
+#include "numa_helper.h"
+#include "migrate_pages_common.h"
+
+#if defined(HAVE_NUMA_V2) && defined(__NR_migrate_pages)
+
+#define KSM_RUN_PATH "/sys/kernel/mm/ksm/run"
+#define N_PAGES 20
+#define N_LOOPS 100
+#define TEST_NODES 2
+
+static int orig_ksm_value;
+static int restore_ksm_run;
+static unsigned int page_size;
+static void *test_pages[N_PAGES];
+static int node1, node2;
+static int num_nodes;
+static int *nodes;
+
+static void setup(void)
+{
+ int n, ret;
+
+ if (access(KSM_RUN_PATH, F_OK)) {
+ tst_brk(TCONF, "KSM configuration was not enabled");
+ } else {
+ SAFE_FILE_SCANF(KSM_RUN_PATH, "%d", &orig_ksm_value);
+ restore_ksm_run = 1;
+ SAFE_FILE_PRINTF(KSM_RUN_PATH, "%d", 1);
+ }
+
+ ret = get_allowed_nodes_arr(NH_MEMS, &num_nodes, &nodes);
+ if (ret < 0)
+ tst_brk(TBROK | TERRNO, "get_allowed_nodes() failed");
+
+ if (num_nodes < TEST_NODES) {
+ tst_brk(TCONF, "requires NUMA with@least %d node",
+ TEST_NODES);
+ }
+
+ ret = get_allowed_nodes(NH_MEMS, TEST_NODES, &node1, &node2);
+ if (ret < 0)
+ tst_brk(TBROK | TERRNO, "get_allowed_nodes() failed");
+
+ page_size = getpagesize();
+
+ for (n = 0; n < N_PAGES; n++) {
+ test_pages[n] = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE | PROT_EXEC,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ memset(test_pages[n], 0, page_size);
+ errno = 0;
+ if (madvise(test_pages[n], page_size, MADV_MERGEABLE)) {
+ if (errno == EINVAL) {
+ tst_brk(TCONF, "madvise() didn't support "
+ "MADV_MERGEABLE");
+ }
+
+ tst_brk(TBROK | TERRNO,
+ "madvise(MADV_MERGEABLE) failed");
+ }
+ }
+}
+
+static void cleanup(void)
+{
+ int n;
+
+ for (n = 0; n < N_PAGES; n++) {
+ if (test_pages[n])
+ SAFE_MUNMAP(test_pages[n], page_size);
+ }
+
+ if (restore_ksm_run)
+ SAFE_FILE_PRINTF(KSM_RUN_PATH, "%d", orig_ksm_value);
+}
+
+static void migrate_test(void)
+{
+ int i, loop, max_node;
+ int ret1, ret2;
+ unsigned long *old_nodes, *new_node1, *new_node2;
+ unsigned long nodemask_size;
+
+ max_node = LTP_ALIGN(get_max_node(), sizeof(unsigned long) * 8);
+ nodemask_size = max_node / 8;
+
+ old_nodes = SAFE_MALLOC(nodemask_size);
+ new_node1 = SAFE_MALLOC(nodemask_size);
+ new_node2 = SAFE_MALLOC(nodemask_size);
+ memset(old_nodes, 0, nodemask_size);
+ memset(new_node1, 0, nodemask_size);
+ memset(new_node2, 0, nodemask_size);
+
+ for (i = 0; i < num_nodes; i++)
+ set_bit(old_nodes, nodes[i], 1);
+ set_bit(new_node1, node1, 1);
+ set_bit(new_node2, node2, 1);
+
+ for (loop = 0; loop < N_LOOPS; loop++) {
+ ret1 = tst_syscall(__NR_migrate_pages, 0, max_node,
+ old_nodes, new_node1);
+ ret2 = tst_syscall(__NR_migrate_pages, 0, max_node,
+ old_nodes, new_node2);
+ if (ret1 < 0 || ret2 < 0) {
+ tst_res(TFAIL | TERRNO, "migrate_pages() failed");
+ free(old_nodes);
+ free(new_node1);
+ free(new_node2);
+ return;
+ }
+ }
+
+ tst_res(TPASS, "migrate_pages() passed");
+
+ free(old_nodes);
+ free(new_node1);
+ free(new_node2);
+}
+
+static struct tst_test test = {
+ .min_kver = "2.6.32",
+ .needs_root = 1,
+ .setup = setup,
+ .cleanup = cleanup,
+ .test_all = migrate_test,
+};
+
+#else
+ TST_TEST_TCONF("System doesn't support __NR_migrate_pages or libnuma "
+ "or libnuma development packages are not available");
+#endif
--
1.8.3.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [LTP] [PATCH] syscalls/migrate_pages03.c: Add new regression test
2017-11-28 10:07 [LTP] [PATCH] syscalls/migrate_pages03.c: Add new regression test Xiao Yang
@ 2017-11-30 15:20 ` Cyril Hrubis
2017-12-21 10:03 ` [LTP] [PATCH v2] " Xiao Yang
2017-12-25 10:37 ` xiao yang
0 siblings, 2 replies; 24+ messages in thread
From: Cyril Hrubis @ 2017-11-30 15:20 UTC (permalink / raw)
To: ltp
Hi!
> +#include <errno.h>
> +#include <unistd.h>
> +#include <stdlib.h>
> +#if HAVE_NUMA_H
> +#include <numa.h>
> +#endif
> +#if HAVE_NUMAIF_H
> +#include <numaif.h>
> +#endif
> +
> +#include "config.h"
> +#include "lapi/syscalls.h"
> +#include "lapi/mmap.h"
> +#include "tst_test.h"
> +#include "numa_helper.h"
> +#include "migrate_pages_common.h"
> +
> +#if defined(HAVE_NUMA_V2) && defined(__NR_migrate_pages)
^
The lapi/syscalls.h defines fallback for
this one, hence this macro is always
defined. And the tst_syscall() will just
do tst_brk(TCONF, ...) if the syscall
number is not defined for a particular
arch.
> +
> +#define KSM_RUN_PATH "/sys/kernel/mm/ksm/run"
> +#define N_PAGES 20
> +#define N_LOOPS 100
> +#define TEST_NODES 2
> +
> +static int orig_ksm_value;
> +static int restore_ksm_run;
> +static unsigned int page_size;
> +static void *test_pages[N_PAGES];
> +static int node1, node2;
> +static int num_nodes;
> +static int *nodes;
> +
> +static void setup(void)
> +{
> + int n, ret;
> +
> + if (access(KSM_RUN_PATH, F_OK)) {
> + tst_brk(TCONF, "KSM configuration was not enabled");
> + } else {
No need for else branch after tst_brk();
> + SAFE_FILE_SCANF(KSM_RUN_PATH, "%d", &orig_ksm_value);
> + restore_ksm_run = 1;
> + SAFE_FILE_PRINTF(KSM_RUN_PATH, "%d", 1);
> + }
> +
> + ret = get_allowed_nodes_arr(NH_MEMS, &num_nodes, &nodes);
> + if (ret < 0)
> + tst_brk(TBROK | TERRNO, "get_allowed_nodes() failed");
> +
> + if (num_nodes < TEST_NODES) {
> + tst_brk(TCONF, "requires NUMA with at least %d node",
> + TEST_NODES);
> + }
> +
> + ret = get_allowed_nodes(NH_MEMS, TEST_NODES, &node1, &node2);
> + if (ret < 0)
> + tst_brk(TBROK | TERRNO, "get_allowed_nodes() failed");
We already got array of nodes from the get_allowed_nodes_arr(), we can
just use nodes[0] and nodes[1] instead of calling this again.
Or drop the get_allowed_nodes_arr() because get_allowed_nodes() returns
negative number if number of nodes was less than count anyway.
> + page_size = getpagesize();
> +
> + for (n = 0; n < N_PAGES; n++) {
> + test_pages[n] = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE | PROT_EXEC,
> + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
> + memset(test_pages[n], 0, page_size);
> + errno = 0;
Do we really have to reset the errno here?
> + if (madvise(test_pages[n], page_size, MADV_MERGEABLE)) {
> + if (errno == EINVAL) {
> + tst_brk(TCONF, "madvise() didn't support "
^ | TERRNO here please
> + "MADV_MERGEABLE");
> + }
> +
> + tst_brk(TBROK | TERRNO,
> + "madvise(MADV_MERGEABLE) failed");
> + }
> + }
> +}
> +
> +static void cleanup(void)
> +{
> + int n;
> +
> + for (n = 0; n < N_PAGES; n++) {
> + if (test_pages[n])
> + SAFE_MUNMAP(test_pages[n], page_size);
> + }
> +
> + if (restore_ksm_run)
> + SAFE_FILE_PRINTF(KSM_RUN_PATH, "%d", orig_ksm_value);
> +}
> +
> +static void migrate_test(void)
> +{
> + int i, loop, max_node;
> + int ret1, ret2;
> + unsigned long *old_nodes, *new_node1, *new_node2;
> + unsigned long nodemask_size;
> +
> + max_node = LTP_ALIGN(get_max_node(), sizeof(unsigned long) * 8);
> + nodemask_size = max_node / 8;
> +
> + old_nodes = SAFE_MALLOC(nodemask_size);
> + new_node1 = SAFE_MALLOC(nodemask_size);
> + new_node2 = SAFE_MALLOC(nodemask_size);
I guess that we can allocate and free the nodemasks in the test setup()
and cleanup() as well, but that is minor.
> + memset(old_nodes, 0, nodemask_size);
> + memset(new_node1, 0, nodemask_size);
> + memset(new_node2, 0, nodemask_size);
> +
> + for (i = 0; i < num_nodes; i++)
> + set_bit(old_nodes, nodes[i], 1);
> + set_bit(new_node1, node1, 1);
> + set_bit(new_node2, node2, 1);
> +
> + for (loop = 0; loop < N_LOOPS; loop++) {
> + ret1 = tst_syscall(__NR_migrate_pages, 0, max_node,
> + old_nodes, new_node1);
> + ret2 = tst_syscall(__NR_migrate_pages, 0, max_node,
> + old_nodes, new_node2);
> + if (ret1 < 0 || ret2 < 0) {
> + tst_res(TFAIL | TERRNO, "migrate_pages() failed");
> + free(old_nodes);
> + free(new_node1);
> + free(new_node2);
> + return;
> + }
> + }
> +
> + tst_res(TPASS, "migrate_pages() passed");
> +
> + free(old_nodes);
> + free(new_node1);
> + free(new_node2);
> +}
> +
> +static struct tst_test test = {
> + .min_kver = "2.6.32",
> + .needs_root = 1,
> + .setup = setup,
> + .cleanup = cleanup,
> + .test_all = migrate_test,
> +};
> +
> +#else
> + TST_TEST_TCONF("System doesn't support __NR_migrate_pages or libnuma "
> + "or libnuma development packages are not available");
> +#endif
> --
> 1.8.3.1
>
>
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
--
Cyril Hrubis
chrubis@suse.cz
^ permalink raw reply [flat|nested] 24+ messages in thread
* [LTP] [PATCH v2] syscalls/migrate_pages03.c: Add new regression test
2017-11-30 15:20 ` Cyril Hrubis
@ 2017-12-21 10:03 ` Xiao Yang
2017-12-25 10:26 ` Xiao Yang
2017-12-25 10:37 ` xiao yang
1 sibling, 1 reply; 24+ messages in thread
From: Xiao Yang @ 2017-12-21 10:03 UTC (permalink / raw)
To: ltp
The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
Signed-off-by: Xiao Yang <yangx.jy@cn.fujitsu.com>
---
runtest/syscalls | 1 +
testcases/kernel/syscalls/.gitignore | 1 +
.../syscalls/migrate_pages/migrate_pages03.c | 156 +++++++++++++++++++++
3 files changed, 158 insertions(+)
create mode 100644 testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
diff --git a/runtest/syscalls b/runtest/syscalls
index 97fc643..ee8850f 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -587,6 +587,7 @@ memcpy01 memcpy01
migrate_pages01 migrate_pages01
migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
mlockall01 mlockall01
mlockall02 mlockall02
diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
index 12a136e..27e30b2 100644
--- a/testcases/kernel/syscalls/.gitignore
+++ b/testcases/kernel/syscalls/.gitignore
@@ -538,6 +538,7 @@
/memset/memset01
/migrate_pages/migrate_pages01
/migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
/mincore/mincore01
/mincore/mincore02
/mkdir/mkdir01
diff --git a/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
new file mode 100644
index 0000000..f3c0c7d
--- /dev/null
+++ b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
+ * Jie Fei <feij.fnst@cn.fujitsu.com>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program, if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * Description:
+ * This is a regression test for ksm page migration which is miscalculated.
+ *
+ * The kernel bug has been fixed by:
+ *
+ * commit 4b0ece6fa0167b22c004ff69e137dc94ee2e469e
+ * Author: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
+ * Date: Fri Mar 31 15:11:44 2017 -0700
+ *
+ * mm: migrate: fix remove_migration_pte() for ksm pages
+ */
+
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#if HAVE_NUMA_H
+#include <numa.h>
+#endif
+#if HAVE_NUMAIF_H
+#include <numaif.h>
+#endif
+
+#include "config.h"
+#include "lapi/syscalls.h"
+#include "lapi/mmap.h"
+#include "tst_test.h"
+#include "numa_helper.h"
+#include "migrate_pages_common.h"
+
+#ifdef HAVE_NUMA_V2
+#define KSM_RUN_PATH "/sys/kernel/mm/ksm/run"
+#define N_PAGES 20
+#define N_LOOPS 400
+#define TEST_NODES 2
+
+static int orig_ksm_run = -1;
+static unsigned int page_size;
+static void *test_pages[N_PAGES];
+static int num_nodes, max_node;
+static int *nodes;
+static unsigned long *new_nodes[2];
+
+static void setup(void)
+{
+ int n;
+ unsigned long nodemask_size;
+
+ if (access(KSM_RUN_PATH, F_OK))
+ tst_brk(TCONF, "KSM configuration was not enabled");
+
+ if (get_allowed_nodes_arr(NH_MEMS, &num_nodes, &nodes) < 0)
+ tst_brk(TBROK | TERRNO, "get_allowed_nodes() failed");
+
+ if (num_nodes < TEST_NODES) {
+ tst_brk(TCONF, "requires NUMA with@least %d node",
+ TEST_NODES);
+ }
+
+ max_node = LTP_ALIGN(get_max_node(), sizeof(unsigned long) * 8);
+ nodemask_size = max_node / 8;
+ new_nodes[0] = SAFE_MALLOC(nodemask_size);
+ new_nodes[1] = SAFE_MALLOC(nodemask_size);
+ memset(new_nodes[0], 0, nodemask_size);
+ memset(new_nodes[1], 0, nodemask_size);
+ set_bit(new_nodes[0], nodes[0], 1);
+ set_bit(new_nodes[1], nodes[1], 1);
+
+ page_size = getpagesize();
+
+ for (n = 0; n < N_PAGES; n++) {
+ test_pages[n] = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE | PROT_EXEC,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (madvise(test_pages[n], page_size, MADV_MERGEABLE)) {
+ if (errno == EINVAL) {
+ tst_brk(TCONF | TERRNO, "madvise() didn't support "
+ "MADV_MERGEABLE");
+ }
+
+ tst_brk(TBROK | TERRNO,
+ "madvise(MADV_MERGEABLE) failed");
+ }
+
+ if (mbind(test_pages[n], page_size, MPOL_BIND, new_nodes[0], max_node, 0))
+ tst_brk(TBROK|TERRNO, "mbind");
+
+ memset(test_pages[n], 0, page_size);
+ }
+
+ SAFE_FILE_SCANF(KSM_RUN_PATH, "%d", &orig_ksm_run);
+ SAFE_FILE_PRINTF(KSM_RUN_PATH, "%d", 1);
+}
+
+static void cleanup(void)
+{
+ int n;
+
+ for (n = 0; n < N_PAGES; n++) {
+ if (test_pages[n])
+ SAFE_MUNMAP(test_pages[n], page_size);
+ }
+
+ free(new_nodes[0]);
+ free(new_nodes[1]);
+
+ if (orig_ksm_run != -1)
+ SAFE_FILE_PRINTF(KSM_RUN_PATH, "%d", orig_ksm_run);
+}
+
+static void migrate_test(void)
+{
+ int loop, i, ret;
+
+ for (loop = 0; loop < N_LOOPS; loop++) {
+ i = loop % 2;
+ ret = tst_syscall(__NR_migrate_pages, 0, max_node,
+ new_nodes[i], new_nodes[i ? 0 : 1]);
+ if (ret < 0) {
+ tst_res(TFAIL | TERRNO, "migrate_pages() failed");
+ return;
+ }
+ }
+
+ tst_res(TPASS, "migrate_pages() passed");
+}
+
+static struct tst_test test = {
+ .min_kver = "2.6.32",
+ .needs_root = 1,
+ .setup = setup,
+ .cleanup = cleanup,
+ .test_all = migrate_test,
+};
+
+#else
+ TST_TEST_TCONF("require libnuma >= 2 and it's development packages");
+#endif
--
1.8.3.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [LTP] [PATCH v2] syscalls/migrate_pages03.c: Add new regression test
2017-12-21 10:03 ` [LTP] [PATCH v2] " Xiao Yang
@ 2017-12-25 10:26 ` Xiao Yang
0 siblings, 0 replies; 24+ messages in thread
From: Xiao Yang @ 2017-12-25 10:26 UTC (permalink / raw)
To: ltp
Hi,
I find there is something wrong with this patch. So please ignore it, and i will resend v2 patch.
Thanks,
Xiao Yang.
On 2017/12/21 18:03, Xiao Yang wrote:
> The bug has been fixed in kernel:
> '4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
>
> Signed-off-by: Xiao Yang <yangx.jy@cn.fujitsu.com>
> ---
> runtest/syscalls | 1 +
> testcases/kernel/syscalls/.gitignore | 1 +
> .../syscalls/migrate_pages/migrate_pages03.c | 156 +++++++++++++++++++++
> 3 files changed, 158 insertions(+)
> create mode 100644 testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
>
> diff --git a/runtest/syscalls b/runtest/syscalls
> index 97fc643..ee8850f 100644
> --- a/runtest/syscalls
> +++ b/runtest/syscalls
> @@ -587,6 +587,7 @@ memcpy01 memcpy01
>
> migrate_pages01 migrate_pages01
> migrate_pages02 migrate_pages02
> +migrate_pages03 migrate_pages03
>
> mlockall01 mlockall01
> mlockall02 mlockall02
> diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
> index 12a136e..27e30b2 100644
> --- a/testcases/kernel/syscalls/.gitignore
> +++ b/testcases/kernel/syscalls/.gitignore
> @@ -538,6 +538,7 @@
> /memset/memset01
> /migrate_pages/migrate_pages01
> /migrate_pages/migrate_pages02
> +/migrate_pages/migrate_pages03
> /mincore/mincore01
> /mincore/mincore02
> /mkdir/mkdir01
> diff --git a/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
> new file mode 100644
> index 0000000..f3c0c7d
> --- /dev/null
> +++ b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
> @@ -0,0 +1,156 @@
> +/*
> + * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
> + * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
> + * Jie Fei <feij.fnst@cn.fujitsu.com>
> + *
> + * 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.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program, if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +/*
> + * Description:
> + * This is a regression test for ksm page migration which is miscalculated.
> + *
> + * The kernel bug has been fixed by:
> + *
> + * commit 4b0ece6fa0167b22c004ff69e137dc94ee2e469e
> + * Author: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
> + * Date: Fri Mar 31 15:11:44 2017 -0700
> + *
> + * mm: migrate: fix remove_migration_pte() for ksm pages
> + */
> +
> +#include <errno.h>
> +#include <unistd.h>
> +#include <stdlib.h>
> +#if HAVE_NUMA_H
> +#include <numa.h>
> +#endif
> +#if HAVE_NUMAIF_H
> +#include <numaif.h>
> +#endif
> +
> +#include "config.h"
> +#include "lapi/syscalls.h"
> +#include "lapi/mmap.h"
> +#include "tst_test.h"
> +#include "numa_helper.h"
> +#include "migrate_pages_common.h"
> +
> +#ifdef HAVE_NUMA_V2
> +#define KSM_RUN_PATH "/sys/kernel/mm/ksm/run"
> +#define N_PAGES 20
> +#define N_LOOPS 400
> +#define TEST_NODES 2
> +
> +static int orig_ksm_run = -1;
> +static unsigned int page_size;
> +static void *test_pages[N_PAGES];
> +static int num_nodes, max_node;
> +static int *nodes;
> +static unsigned long *new_nodes[2];
> +
> +static void setup(void)
> +{
> + int n;
> + unsigned long nodemask_size;
> +
> + if (access(KSM_RUN_PATH, F_OK))
> + tst_brk(TCONF, "KSM configuration was not enabled");
> +
> + if (get_allowed_nodes_arr(NH_MEMS, &num_nodes, &nodes) < 0)
> + tst_brk(TBROK | TERRNO, "get_allowed_nodes() failed");
> +
> + if (num_nodes < TEST_NODES) {
> + tst_brk(TCONF, "requires NUMA with at least %d node",
> + TEST_NODES);
> + }
> +
> + max_node = LTP_ALIGN(get_max_node(), sizeof(unsigned long) * 8);
> + nodemask_size = max_node / 8;
> + new_nodes[0] = SAFE_MALLOC(nodemask_size);
> + new_nodes[1] = SAFE_MALLOC(nodemask_size);
> + memset(new_nodes[0], 0, nodemask_size);
> + memset(new_nodes[1], 0, nodemask_size);
> + set_bit(new_nodes[0], nodes[0], 1);
> + set_bit(new_nodes[1], nodes[1], 1);
> +
> + page_size = getpagesize();
> +
> + for (n = 0; n < N_PAGES; n++) {
> + test_pages[n] = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE | PROT_EXEC,
> + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
> + if (madvise(test_pages[n], page_size, MADV_MERGEABLE)) {
> + if (errno == EINVAL) {
> + tst_brk(TCONF | TERRNO, "madvise() didn't support "
> + "MADV_MERGEABLE");
> + }
> +
> + tst_brk(TBROK | TERRNO,
> + "madvise(MADV_MERGEABLE) failed");
> + }
> +
> + if (mbind(test_pages[n], page_size, MPOL_BIND, new_nodes[0], max_node, 0))
> + tst_brk(TBROK|TERRNO, "mbind");
> +
> + memset(test_pages[n], 0, page_size);
> + }
> +
> + SAFE_FILE_SCANF(KSM_RUN_PATH, "%d", &orig_ksm_run);
> + SAFE_FILE_PRINTF(KSM_RUN_PATH, "%d", 1);
> +}
> +
> +static void cleanup(void)
> +{
> + int n;
> +
> + for (n = 0; n < N_PAGES; n++) {
> + if (test_pages[n])
> + SAFE_MUNMAP(test_pages[n], page_size);
> + }
> +
> + free(new_nodes[0]);
> + free(new_nodes[1]);
> +
> + if (orig_ksm_run != -1)
> + SAFE_FILE_PRINTF(KSM_RUN_PATH, "%d", orig_ksm_run);
> +}
> +
> +static void migrate_test(void)
> +{
> + int loop, i, ret;
> +
> + for (loop = 0; loop < N_LOOPS; loop++) {
> + i = loop % 2;
> + ret = tst_syscall(__NR_migrate_pages, 0, max_node,
> + new_nodes[i], new_nodes[i ? 0 : 1]);
> + if (ret < 0) {
> + tst_res(TFAIL | TERRNO, "migrate_pages() failed");
> + return;
> + }
> + }
> +
> + tst_res(TPASS, "migrate_pages() passed");
> +}
> +
> +static struct tst_test test = {
> + .min_kver = "2.6.32",
> + .needs_root = 1,
> + .setup = setup,
> + .cleanup = cleanup,
> + .test_all = migrate_test,
> +};
> +
> +#else
> + TST_TEST_TCONF("require libnuma >= 2 and it's development packages");
> +#endif
^ permalink raw reply [flat|nested] 24+ messages in thread
* [LTP] [PATCH v2] syscalls/migrate_pages03.c: Add new regression test
2017-11-30 15:20 ` Cyril Hrubis
2017-12-21 10:03 ` [LTP] [PATCH v2] " Xiao Yang
@ 2017-12-25 10:37 ` xiao yang
2018-01-03 12:04 ` Jan Stancek
2018-01-03 14:38 ` Cyril Hrubis
1 sibling, 2 replies; 24+ messages in thread
From: xiao yang @ 2017-12-25 10:37 UTC (permalink / raw)
To: ltp
The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
Signed-off-by: xiao yang <yangx.jy@cn.fujitsu.com>
---
runtest/syscalls | 1 +
testcases/kernel/syscalls/.gitignore | 1 +
.../syscalls/migrate_pages/migrate_pages03.c | 175 +++++++++++++++++++++
3 files changed, 177 insertions(+)
create mode 100644 testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
diff --git a/runtest/syscalls b/runtest/syscalls
index 97fc643..ee8850f 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -587,6 +587,7 @@ memcpy01 memcpy01
migrate_pages01 migrate_pages01
migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
mlockall01 mlockall01
mlockall02 mlockall02
diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
index 12a136e..27e30b2 100644
--- a/testcases/kernel/syscalls/.gitignore
+++ b/testcases/kernel/syscalls/.gitignore
@@ -538,6 +538,7 @@
/memset/memset01
/migrate_pages/migrate_pages01
/migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
/mincore/mincore01
/mincore/mincore02
/mkdir/mkdir01
diff --git a/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
new file mode 100644
index 0000000..697ab55
--- /dev/null
+++ b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
+ * Jie Fei <feij.fnst@cn.fujitsu.com>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program, if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * Description:
+ * This is a regression test for ksm page migration which is miscalculated.
+ *
+ * The kernel bug has been fixed by:
+ *
+ * commit 4b0ece6fa0167b22c004ff69e137dc94ee2e469e
+ * Author: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
+ * Date: Fri Mar 31 15:11:44 2017 -0700
+ *
+ * mm: migrate: fix remove_migration_pte() for ksm pages
+ */
+
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#if HAVE_NUMA_H
+#include <numa.h>
+#endif
+#if HAVE_NUMAIF_H
+#include <numaif.h>
+#endif
+
+#include "config.h"
+#include "lapi/syscalls.h"
+#include "lapi/mmap.h"
+#include "tst_test.h"
+#include "numa_helper.h"
+#include "migrate_pages_common.h"
+
+#ifdef HAVE_NUMA_V2
+#define KSM_PATH "/sys/kernel/mm/ksm/"
+#define N_PAGES 20
+#define N_LOOPS 600
+#define TEST_NODES 2
+
+static int orig_ksm_run = -1;
+static unsigned int page_size;
+static void *test_pages[N_PAGES];
+static int num_nodes, max_node;
+static int *nodes;
+static unsigned long *new_nodes[2];
+
+/* Wait at least two full scans to guarantee merging */
+static void wait_ksmd_full_scan(void)
+{
+ unsigned long exp_scans, get_scans;
+ int count = 0;
+
+ SAFE_FILE_SCANF(KSM_PATH "full_scans", "%lu", &get_scans);
+ exp_scans = get_scans + 3;
+ while (get_scans < exp_scans) {
+ sleep(1);
+ count++;
+ SAFE_FILE_SCANF(KSM_PATH "full_scans", "%lu", &get_scans);
+ }
+
+ tst_res(TINFO, "ksmd takes %ds to run two full scans", count);
+}
+
+static void setup(void)
+{
+ int n;
+ unsigned long nodemask_size;
+
+ if (access(KSM_PATH, F_OK))
+ tst_brk(TCONF, "KSM configuration was not enabled");
+
+ if (get_allowed_nodes_arr(NH_MEMS, &num_nodes, &nodes) < 0)
+ tst_brk(TBROK | TERRNO, "get_allowed_nodes() failed");
+
+ if (num_nodes < TEST_NODES) {
+ tst_brk(TCONF, "requires NUMA with@least %d node",
+ TEST_NODES);
+ }
+
+ max_node = LTP_ALIGN(get_max_node(), sizeof(unsigned long) * 8);
+ nodemask_size = max_node / 8;
+ new_nodes[0] = SAFE_MALLOC(nodemask_size);
+ new_nodes[1] = SAFE_MALLOC(nodemask_size);
+ memset(new_nodes[0], 0, nodemask_size);
+ memset(new_nodes[1], 0, nodemask_size);
+ set_bit(new_nodes[0], nodes[0], 1);
+ set_bit(new_nodes[1], nodes[1], 1);
+
+ page_size = getpagesize();
+
+ for (n = 0; n < N_PAGES; n++) {
+ test_pages[n] = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE | PROT_EXEC,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (madvise(test_pages[n], page_size, MADV_MERGEABLE)) {
+ if (errno == EINVAL) {
+ tst_brk(TCONF | TERRNO, "madvise() didn't "
+ "support MADV_MERGEABLE");
+ }
+
+ tst_brk(TBROK | TERRNO,
+ "madvise(MADV_MERGEABLE) failed");
+ }
+
+ if (mbind(test_pages[n], page_size, MPOL_BIND, new_nodes[0],
+ max_node, 0))
+ tst_brk(TBROK | TERRNO, "mbind(MPOL_BIND) failed");
+
+ memset(test_pages[n], 0, page_size);
+ }
+
+ SAFE_FILE_SCANF(KSM_PATH "run", "%d", &orig_ksm_run);
+ SAFE_FILE_PRINTF(KSM_PATH "run", "%d", 1);
+ wait_ksmd_full_scan();
+}
+
+static void cleanup(void)
+{
+ int n;
+
+ for (n = 0; n < N_PAGES; n++) {
+ if (test_pages[n])
+ SAFE_MUNMAP(test_pages[n], page_size);
+ }
+
+ free(new_nodes[0]);
+ free(new_nodes[1]);
+
+ if (orig_ksm_run != -1)
+ SAFE_FILE_PRINTF(KSM_PATH "run", "%d", orig_ksm_run);
+}
+
+static void migrate_test(void)
+{
+ int loop, i, ret;
+
+ for (loop = 0; loop < N_LOOPS; loop++) {
+ i = loop % 2;
+ ret = tst_syscall(__NR_migrate_pages, 0, max_node,
+ new_nodes[i], new_nodes[i ? 0 : 1]);
+ if (ret < 0) {
+ tst_res(TFAIL | TERRNO, "migrate_pages() failed");
+ return;
+ }
+ }
+
+ tst_res(TPASS, "migrate_pages() passed");
+}
+
+static struct tst_test test = {
+ .min_kver = "2.6.32",
+ .needs_root = 1,
+ .setup = setup,
+ .cleanup = cleanup,
+ .test_all = migrate_test,
+};
+
+#else
+ TST_TEST_TCONF("require libnuma >= 2 and it's development packages");
+#endif
--
1.8.3.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [LTP] [PATCH v2] syscalls/migrate_pages03.c: Add new regression test
2017-12-25 10:37 ` xiao yang
@ 2018-01-03 12:04 ` Jan Stancek
2018-01-03 14:38 ` Cyril Hrubis
1 sibling, 0 replies; 24+ messages in thread
From: Jan Stancek @ 2018-01-03 12:04 UTC (permalink / raw)
To: ltp
----- Original Message -----
> The bug has been fixed in kernel:
> '4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
>
> Signed-off-by: xiao yang <yangx.jy@cn.fujitsu.com>
Looks good to me.
Regards,
Jan
^ permalink raw reply [flat|nested] 24+ messages in thread
* [LTP] [PATCH v2] syscalls/migrate_pages03.c: Add new regression test
2017-12-25 10:37 ` xiao yang
2018-01-03 12:04 ` Jan Stancek
@ 2018-01-03 14:38 ` Cyril Hrubis
2018-01-04 9:26 ` [LTP] [PATCH v3 1/2] lib/mem.c: factor out wait_ksmd_full_scan() xiao yang
2018-01-04 9:44 ` [LTP] [PATCH v4 " xiao yang
1 sibling, 2 replies; 24+ messages in thread
From: Cyril Hrubis @ 2018-01-03 14:38 UTC (permalink / raw)
To: ltp
Hi!
> +/* Wait at least two full scans to guarantee merging */
> +static void wait_ksmd_full_scan(void)
> +{
> + unsigned long exp_scans, get_scans;
> + int count = 0;
> +
> + SAFE_FILE_SCANF(KSM_PATH "full_scans", "%lu", &get_scans);
> + exp_scans = get_scans + 3;
> + while (get_scans < exp_scans) {
> + sleep(1);
> + count++;
> + SAFE_FILE_SCANF(KSM_PATH "full_scans", "%lu", &get_scans);
> + }
> +
> + tst_res(TINFO, "ksmd takes %ds to run two full scans", count);
> +}
I do not like that this piece of code has been copied from the lib/mem.c.
Cleaner solution will move the function to testcases/kernel/lib/ksm.c
and create accompanying testcases/kernel/include/ksm.h header so that we
can link againts it here and in the ksm testcases as well in order to
retain only one copy of the function in the source tree.
--
Cyril Hrubis
chrubis@suse.cz
^ permalink raw reply [flat|nested] 24+ messages in thread
* [LTP] [PATCH v3 1/2] lib/mem.c: factor out wait_ksmd_full_scan()
2018-01-03 14:38 ` Cyril Hrubis
@ 2018-01-04 9:26 ` xiao yang
2018-01-04 9:26 ` [LTP] [PATCH v3 2/2] syscalls/migrate_pages03.c: Add new regression test xiao yang
2018-01-04 9:34 ` [LTP] [PATCH v3 1/2] lib/mem.c: factor out wait_ksmd_full_scan() Xiao Yang
2018-01-04 9:44 ` [LTP] [PATCH v4 " xiao yang
1 sibling, 2 replies; 24+ messages in thread
From: xiao yang @ 2018-01-04 9:26 UTC (permalink / raw)
To: ltp
Move common wait_ksmd_full_scan() to kernel/lib/ksm_helper.c
and create accompanying kernel/include/ksm_helper.h.
Signed-off-by: xiao yang <yangx.jy@cn.fujitsu.com>
---
testcases/kernel/include/ksm_helper.h | 26 +++++++++++++++++++
testcases/kernel/lib/ksm_helper.c | 49 +++++++++++++++++++++++++++++++++++
testcases/kernel/mem/lib/mem.c | 28 +-------------------
3 files changed, 76 insertions(+), 27 deletions(-)
create mode 100644 testcases/kernel/include/ksm_helper.h
create mode 100644 testcases/kernel/lib/ksm_helper.c
diff --git a/testcases/kernel/include/ksm_helper.h b/testcases/kernel/include/ksm_helper.h
new file mode 100644
index 0000000..0b35218
--- /dev/null
+++ b/testcases/kernel/include/ksm_helper.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program, if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef KSM_HELPER_H
+#define KSM_HELPER_H
+
+#define PATH_KSM "/sys/kernel/mm/ksm/"
+
+void wait_ksmd_full_scan(void);
+
+#endif /* KSM_HELPER_H */
diff --git a/testcases/kernel/lib/ksm_helper.c b/testcases/kernel/lib/ksm_helper.c
new file mode 100644
index 0000000..eba28d4
--- /dev/null
+++ b/testcases/kernel/lib/ksm_helper.c
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program, if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define TST_NO_DEFAULT_MAIN
+
+#include <unistd.h>
+#include "tst_test.h"
+#include "ksm_helper.h"
+
+void wait_ksmd_full_scan(void)
+{
+ unsigned long full_scans, at_least_one_full_scan;
+ int count = 0;
+
+ SAFE_FILE_SCANF(PATH_KSM "full_scans", "%lu", &full_scans);
+ /*
+ * The current scan is already in progress so we can't guarantee that
+ * the get_user_pages() is called on every existing rmap_item if we
+ * only waited for the remaining part of the scan.
+ *
+ * The actual merging happens after the unstable tree has been built so
+ * we need to wait at least two full scans to guarantee merging, hence
+ * wait full_scans to increment by 3 so that at least two full scans
+ * will run.
+ */
+ at_least_one_full_scan = full_scans + 3;
+ while (full_scans < at_least_one_full_scan) {
+ sleep(1);
+ count++;
+ SAFE_FILE_SCANF(PATH_KSM "full_scans", "%lu", &full_scans);
+ }
+
+ tst_res(TINFO, "ksm daemon takes %ds to run two full scans", count);
+}
diff --git a/testcases/kernel/mem/lib/mem.c b/testcases/kernel/mem/lib/mem.c
index 7f2099b..4275f63 100644
--- a/testcases/kernel/mem/lib/mem.c
+++ b/testcases/kernel/mem/lib/mem.c
@@ -23,6 +23,7 @@
#include <unistd.h>
#include "mem.h"
+#include "ksm_helper.h"
#include "numa_helper.h"
/* OOM */
@@ -268,33 +269,6 @@ static void check(char *path, long int value)
tst_res(TPASS, "%s is %ld.", path, actual_val);
}
-static void wait_ksmd_full_scan(void)
-{
- unsigned long full_scans, at_least_one_full_scan;
- int count = 0;
-
- SAFE_FILE_SCANF(PATH_KSM "full_scans", "%lu", &full_scans);
- /*
- * The current scan is already in progress so we can't guarantee that
- * the get_user_pages() is called on every existing rmap_item if we
- * only waited for the remaining part of the scan.
- *
- * The actual merging happens after the unstable tree has been built so
- * we need to wait at least two full scans to guarantee merging, hence
- * wait full_scans to increment by 3 so that at least two full scans
- * will run.
- */
- at_least_one_full_scan = full_scans + 3;
- while (full_scans < at_least_one_full_scan) {
- sleep(1);
- count++;
- SAFE_FILE_SCANF(PATH_KSM "full_scans", "%lu", &full_scans);
- }
-
- tst_res(TINFO, "ksm daemon takes %ds to run two full scans",
- count);
-}
-
static void final_group_check(int run, int pages_shared, int pages_sharing,
int pages_volatile, int pages_unshared,
int sleep_millisecs, int pages_to_scan)
--
1.8.3.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [LTP] [PATCH v3 2/2] syscalls/migrate_pages03.c: Add new regression test
2018-01-04 9:26 ` [LTP] [PATCH v3 1/2] lib/mem.c: factor out wait_ksmd_full_scan() xiao yang
@ 2018-01-04 9:26 ` xiao yang
2018-01-04 9:34 ` [LTP] [PATCH v3 1/2] lib/mem.c: factor out wait_ksmd_full_scan() Xiao Yang
1 sibling, 0 replies; 24+ messages in thread
From: xiao yang @ 2018-01-04 9:26 UTC (permalink / raw)
To: ltp
The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
Signed-off-by: xiao yang <yangx.jy@cn.fujitsu.com>
---
runtest/syscalls | 1 +
testcases/kernel/syscalls/.gitignore | 1 +
.../syscalls/migrate_pages/migrate_pages03.c | 158 +++++++++++++++++++++
3 files changed, 160 insertions(+)
create mode 100644 testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
diff --git a/runtest/syscalls b/runtest/syscalls
index 97fc643..ee8850f 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -587,6 +587,7 @@ memcpy01 memcpy01
migrate_pages01 migrate_pages01
migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
mlockall01 mlockall01
mlockall02 mlockall02
diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
index 12a136e..27e30b2 100644
--- a/testcases/kernel/syscalls/.gitignore
+++ b/testcases/kernel/syscalls/.gitignore
@@ -538,6 +538,7 @@
/memset/memset01
/migrate_pages/migrate_pages01
/migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
/mincore/mincore01
/mincore/mincore02
/mkdir/mkdir01
diff --git a/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
new file mode 100644
index 0000000..19831d3
--- /dev/null
+++ b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
+ * Jie Fei <feij.fnst@cn.fujitsu.com>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program, if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * Description:
+ * This is a regression test for ksm page migration which is miscalculated.
+ *
+ * The kernel bug has been fixed by:
+ *
+ * commit 4b0ece6fa0167b22c004ff69e137dc94ee2e469e
+ * Author: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
+ * Date: Fri Mar 31 15:11:44 2017 -0700
+ *
+ * mm: migrate: fix remove_migration_pte() for ksm pages
+ */
+
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#if HAVE_NUMA_H
+#include <numa.h>
+#endif
+#if HAVE_NUMAIF_H
+#include <numaif.h>
+#endif
+
+#include "config.h"
+#include "lapi/syscalls.h"
+#include "lapi/mmap.h"
+#include "tst_test.h"
+#include "ksm_helper.h"
+#include "numa_helper.h"
+#include "migrate_pages_common.h"
+
+#ifdef HAVE_NUMA_V2
+#define N_PAGES 20
+#define N_LOOPS 600
+#define TEST_NODES 2
+
+static int orig_ksm_run = -1;
+static unsigned int page_size;
+static void *test_pages[N_PAGES];
+static int num_nodes, max_node;
+static int *nodes;
+static unsigned long *new_nodes[2];
+
+static void setup(void)
+{
+ int n;
+ unsigned long nodemask_size;
+
+ if (access(PATH_KSM, F_OK))
+ tst_brk(TCONF, "KSM configuration was not enabled");
+
+ if (get_allowed_nodes_arr(NH_MEMS, &num_nodes, &nodes) < 0)
+ tst_brk(TBROK | TERRNO, "get_allowed_nodes() failed");
+
+ if (num_nodes < TEST_NODES) {
+ tst_brk(TCONF, "requires NUMA with@least %d node",
+ TEST_NODES);
+ }
+
+ max_node = LTP_ALIGN(get_max_node(), sizeof(unsigned long) * 8);
+ nodemask_size = max_node / 8;
+ new_nodes[0] = SAFE_MALLOC(nodemask_size);
+ new_nodes[1] = SAFE_MALLOC(nodemask_size);
+ memset(new_nodes[0], 0, nodemask_size);
+ memset(new_nodes[1], 0, nodemask_size);
+ set_bit(new_nodes[0], nodes[0], 1);
+ set_bit(new_nodes[1], nodes[1], 1);
+
+ page_size = getpagesize();
+
+ for (n = 0; n < N_PAGES; n++) {
+ test_pages[n] = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE | PROT_EXEC,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (madvise(test_pages[n], page_size, MADV_MERGEABLE)) {
+ if (errno == EINVAL) {
+ tst_brk(TCONF | TERRNO, "madvise() didn't "
+ "support MADV_MERGEABLE");
+ }
+
+ tst_brk(TBROK | TERRNO,
+ "madvise(MADV_MERGEABLE) failed");
+ }
+
+ if (mbind(test_pages[n], page_size, MPOL_BIND, new_nodes[0],
+ max_node, 0))
+ tst_brk(TBROK | TERRNO, "mbind(MPOL_BIND) failed");
+
+ memset(test_pages[n], 0, page_size);
+ }
+
+ SAFE_FILE_SCANF(PATH_KSM "run", "%d", &orig_ksm_run);
+ SAFE_FILE_PRINTF(PATH_KSM "run", "%d", 1);
+ wait_ksmd_full_scan();
+}
+
+static void cleanup(void)
+{
+ int n;
+
+ for (n = 0; n < N_PAGES; n++) {
+ if (test_pages[n])
+ SAFE_MUNMAP(test_pages[n], page_size);
+ }
+
+ free(new_nodes[0]);
+ free(new_nodes[1]);
+
+ if (orig_ksm_run != -1)
+ SAFE_FILE_PRINTF(PATH_KSM "run", "%d", orig_ksm_run);
+}
+
+static void migrate_test(void)
+{
+ int loop, i, ret;
+
+ for (loop = 0; loop < N_LOOPS; loop++) {
+ i = loop % 2;
+ ret = tst_syscall(__NR_migrate_pages, 0, max_node,
+ new_nodes[i], new_nodes[i ? 0 : 1]);
+ if (ret < 0) {
+ tst_res(TFAIL | TERRNO, "migrate_pages() failed");
+ return;
+ }
+ }
+
+ tst_res(TPASS, "migrate_pages() passed");
+}
+
+static struct tst_test test = {
+ .min_kver = "2.6.32",
+ .needs_root = 1,
+ .setup = setup,
+ .cleanup = cleanup,
+ .test_all = migrate_test,
+};
+
+#else
+ TST_TEST_TCONF("require libnuma >= 2 and it's development packages");
+#endif
--
1.8.3.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [LTP] [PATCH v3 1/2] lib/mem.c: factor out wait_ksmd_full_scan()
2018-01-04 9:26 ` [LTP] [PATCH v3 1/2] lib/mem.c: factor out wait_ksmd_full_scan() xiao yang
2018-01-04 9:26 ` [LTP] [PATCH v3 2/2] syscalls/migrate_pages03.c: Add new regression test xiao yang
@ 2018-01-04 9:34 ` Xiao Yang
1 sibling, 0 replies; 24+ messages in thread
From: Xiao Yang @ 2018-01-04 9:34 UTC (permalink / raw)
To: ltp
Hi,
Sorry, there is duplicate code with this patch set. So please ignore it.
Thanks,
Xiao Yang
On 2018/01/04 17:26, xiao yang wrote:
> Move common wait_ksmd_full_scan() to kernel/lib/ksm_helper.c
> and create accompanying kernel/include/ksm_helper.h.
>
> Signed-off-by: xiao yang <yangx.jy@cn.fujitsu.com>
> ---
> testcases/kernel/include/ksm_helper.h | 26 +++++++++++++++++++
> testcases/kernel/lib/ksm_helper.c | 49 +++++++++++++++++++++++++++++++++++
> testcases/kernel/mem/lib/mem.c | 28 +-------------------
> 3 files changed, 76 insertions(+), 27 deletions(-)
> create mode 100644 testcases/kernel/include/ksm_helper.h
> create mode 100644 testcases/kernel/lib/ksm_helper.c
>
> diff --git a/testcases/kernel/include/ksm_helper.h b/testcases/kernel/include/ksm_helper.h
> new file mode 100644
> index 0000000..0b35218
> --- /dev/null
> +++ b/testcases/kernel/include/ksm_helper.h
> @@ -0,0 +1,26 @@
> +/*
> + * Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
> + * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
> + *
> + * 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.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program, if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef KSM_HELPER_H
> +#define KSM_HELPER_H
> +
> +#define PATH_KSM "/sys/kernel/mm/ksm/"
> +
> +void wait_ksmd_full_scan(void);
> +
> +#endif /* KSM_HELPER_H */
> diff --git a/testcases/kernel/lib/ksm_helper.c b/testcases/kernel/lib/ksm_helper.c
> new file mode 100644
> index 0000000..eba28d4
> --- /dev/null
> +++ b/testcases/kernel/lib/ksm_helper.c
> @@ -0,0 +1,49 @@
> +/*
> + * Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
> + * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
> + *
> + * 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.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program, if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#define TST_NO_DEFAULT_MAIN
> +
> +#include <unistd.h>
> +#include "tst_test.h"
> +#include "ksm_helper.h"
> +
> +void wait_ksmd_full_scan(void)
> +{
> + unsigned long full_scans, at_least_one_full_scan;
> + int count = 0;
> +
> + SAFE_FILE_SCANF(PATH_KSM "full_scans", "%lu", &full_scans);
> + /*
> + * The current scan is already in progress so we can't guarantee that
> + * the get_user_pages() is called on every existing rmap_item if we
> + * only waited for the remaining part of the scan.
> + *
> + * The actual merging happens after the unstable tree has been built so
> + * we need to wait at least two full scans to guarantee merging, hence
> + * wait full_scans to increment by 3 so that at least two full scans
> + * will run.
> + */
> + at_least_one_full_scan = full_scans + 3;
> + while (full_scans < at_least_one_full_scan) {
> + sleep(1);
> + count++;
> + SAFE_FILE_SCANF(PATH_KSM "full_scans", "%lu", &full_scans);
> + }
> +
> + tst_res(TINFO, "ksm daemon takes %ds to run two full scans", count);
> +}
> diff --git a/testcases/kernel/mem/lib/mem.c b/testcases/kernel/mem/lib/mem.c
> index 7f2099b..4275f63 100644
> --- a/testcases/kernel/mem/lib/mem.c
> +++ b/testcases/kernel/mem/lib/mem.c
> @@ -23,6 +23,7 @@
> #include <unistd.h>
>
> #include "mem.h"
> +#include "ksm_helper.h"
> #include "numa_helper.h"
>
> /* OOM */
> @@ -268,33 +269,6 @@ static void check(char *path, long int value)
> tst_res(TPASS, "%s is %ld.", path, actual_val);
> }
>
> -static void wait_ksmd_full_scan(void)
> -{
> - unsigned long full_scans, at_least_one_full_scan;
> - int count = 0;
> -
> - SAFE_FILE_SCANF(PATH_KSM "full_scans", "%lu", &full_scans);
> - /*
> - * The current scan is already in progress so we can't guarantee that
> - * the get_user_pages() is called on every existing rmap_item if we
> - * only waited for the remaining part of the scan.
> - *
> - * The actual merging happens after the unstable tree has been built so
> - * we need to wait at least two full scans to guarantee merging, hence
> - * wait full_scans to increment by 3 so that at least two full scans
> - * will run.
> - */
> - at_least_one_full_scan = full_scans + 3;
> - while (full_scans < at_least_one_full_scan) {
> - sleep(1);
> - count++;
> - SAFE_FILE_SCANF(PATH_KSM "full_scans", "%lu", &full_scans);
> - }
> -
> - tst_res(TINFO, "ksm daemon takes %ds to run two full scans",
> - count);
> -}
> -
> static void final_group_check(int run, int pages_shared, int pages_sharing,
> int pages_volatile, int pages_unshared,
> int sleep_millisecs, int pages_to_scan)
^ permalink raw reply [flat|nested] 24+ messages in thread
* [LTP] [PATCH v4 1/2] lib/mem.c: factor out wait_ksmd_full_scan()
2018-01-03 14:38 ` Cyril Hrubis
2018-01-04 9:26 ` [LTP] [PATCH v3 1/2] lib/mem.c: factor out wait_ksmd_full_scan() xiao yang
@ 2018-01-04 9:44 ` xiao yang
2018-01-04 9:44 ` [LTP] [PATCH v4 2/2] syscalls/migrate_pages03.c: Add new regression test xiao yang
1 sibling, 1 reply; 24+ messages in thread
From: xiao yang @ 2018-01-04 9:44 UTC (permalink / raw)
To: ltp
Move common wait_ksmd_full_scan() to kernel/lib/ksm_helper.c
and create accompanying kernel/include/ksm_helper.h.
Signed-off-by: xiao yang <yangx.jy@cn.fujitsu.com>
---
testcases/kernel/include/ksm_helper.h | 26 +++++++++++++++++++
testcases/kernel/lib/ksm_helper.c | 49 +++++++++++++++++++++++++++++++++++
testcases/kernel/mem/include/mem.h | 3 +--
testcases/kernel/mem/lib/mem.c | 27 -------------------
4 files changed, 76 insertions(+), 29 deletions(-)
create mode 100644 testcases/kernel/include/ksm_helper.h
create mode 100644 testcases/kernel/lib/ksm_helper.c
diff --git a/testcases/kernel/include/ksm_helper.h b/testcases/kernel/include/ksm_helper.h
new file mode 100644
index 0000000..0b35218
--- /dev/null
+++ b/testcases/kernel/include/ksm_helper.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program, if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef KSM_HELPER_H
+#define KSM_HELPER_H
+
+#define PATH_KSM "/sys/kernel/mm/ksm/"
+
+void wait_ksmd_full_scan(void);
+
+#endif /* KSM_HELPER_H */
diff --git a/testcases/kernel/lib/ksm_helper.c b/testcases/kernel/lib/ksm_helper.c
new file mode 100644
index 0000000..eba28d4
--- /dev/null
+++ b/testcases/kernel/lib/ksm_helper.c
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program, if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define TST_NO_DEFAULT_MAIN
+
+#include <unistd.h>
+#include "tst_test.h"
+#include "ksm_helper.h"
+
+void wait_ksmd_full_scan(void)
+{
+ unsigned long full_scans, at_least_one_full_scan;
+ int count = 0;
+
+ SAFE_FILE_SCANF(PATH_KSM "full_scans", "%lu", &full_scans);
+ /*
+ * The current scan is already in progress so we can't guarantee that
+ * the get_user_pages() is called on every existing rmap_item if we
+ * only waited for the remaining part of the scan.
+ *
+ * The actual merging happens after the unstable tree has been built so
+ * we need to wait at least two full scans to guarantee merging, hence
+ * wait full_scans to increment by 3 so that at least two full scans
+ * will run.
+ */
+ at_least_one_full_scan = full_scans + 3;
+ while (full_scans < at_least_one_full_scan) {
+ sleep(1);
+ count++;
+ SAFE_FILE_SCANF(PATH_KSM "full_scans", "%lu", &full_scans);
+ }
+
+ tst_res(TINFO, "ksm daemon takes %ds to run two full scans", count);
+}
diff --git a/testcases/kernel/mem/include/mem.h b/testcases/kernel/mem/include/mem.h
index 95d0bda..f7682f9 100644
--- a/testcases/kernel/mem/include/mem.h
+++ b/testcases/kernel/mem/include/mem.h
@@ -2,6 +2,7 @@
#define _MEM_H
#include "config.h"
#include "tst_test.h"
+#include "ksm_helper.h"
#if defined(__powerpc__) || defined(__powerpc64__)
#define MAXNODES 256
@@ -42,8 +43,6 @@ void testoom(int mempolicy, int lite, int retcode, int allow_sigkill);
/* KSM */
-#define PATH_KSM "/sys/kernel/mm/ksm/"
-
void create_same_memory(int size, int num, int unit);
void save_max_page_sharing(void);
void restore_max_page_sharing(void);
diff --git a/testcases/kernel/mem/lib/mem.c b/testcases/kernel/mem/lib/mem.c
index 7f2099b..59138a0 100644
--- a/testcases/kernel/mem/lib/mem.c
+++ b/testcases/kernel/mem/lib/mem.c
@@ -268,33 +268,6 @@ static void check(char *path, long int value)
tst_res(TPASS, "%s is %ld.", path, actual_val);
}
-static void wait_ksmd_full_scan(void)
-{
- unsigned long full_scans, at_least_one_full_scan;
- int count = 0;
-
- SAFE_FILE_SCANF(PATH_KSM "full_scans", "%lu", &full_scans);
- /*
- * The current scan is already in progress so we can't guarantee that
- * the get_user_pages() is called on every existing rmap_item if we
- * only waited for the remaining part of the scan.
- *
- * The actual merging happens after the unstable tree has been built so
- * we need to wait at least two full scans to guarantee merging, hence
- * wait full_scans to increment by 3 so that@least two full scans
- * will run.
- */
- at_least_one_full_scan = full_scans + 3;
- while (full_scans < at_least_one_full_scan) {
- sleep(1);
- count++;
- SAFE_FILE_SCANF(PATH_KSM "full_scans", "%lu", &full_scans);
- }
-
- tst_res(TINFO, "ksm daemon takes %ds to run two full scans",
- count);
-}
-
static void final_group_check(int run, int pages_shared, int pages_sharing,
int pages_volatile, int pages_unshared,
int sleep_millisecs, int pages_to_scan)
--
1.8.3.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [LTP] [PATCH v4 2/2] syscalls/migrate_pages03.c: Add new regression test
2018-01-04 9:44 ` [LTP] [PATCH v4 " xiao yang
@ 2018-01-04 9:44 ` xiao yang
2018-01-04 15:30 ` Cyril Hrubis
0 siblings, 1 reply; 24+ messages in thread
From: xiao yang @ 2018-01-04 9:44 UTC (permalink / raw)
To: ltp
The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
Signed-off-by: xiao yang <yangx.jy@cn.fujitsu.com>
---
runtest/syscalls | 1 +
testcases/kernel/syscalls/.gitignore | 1 +
.../syscalls/migrate_pages/migrate_pages03.c | 158 +++++++++++++++++++++
3 files changed, 160 insertions(+)
create mode 100644 testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
diff --git a/runtest/syscalls b/runtest/syscalls
index 97fc643..ee8850f 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -587,6 +587,7 @@ memcpy01 memcpy01
migrate_pages01 migrate_pages01
migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
mlockall01 mlockall01
mlockall02 mlockall02
diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
index 12a136e..27e30b2 100644
--- a/testcases/kernel/syscalls/.gitignore
+++ b/testcases/kernel/syscalls/.gitignore
@@ -538,6 +538,7 @@
/memset/memset01
/migrate_pages/migrate_pages01
/migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
/mincore/mincore01
/mincore/mincore02
/mkdir/mkdir01
diff --git a/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
new file mode 100644
index 0000000..19831d3
--- /dev/null
+++ b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
+ * Jie Fei <feij.fnst@cn.fujitsu.com>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program, if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * Description:
+ * This is a regression test for ksm page migration which is miscalculated.
+ *
+ * The kernel bug has been fixed by:
+ *
+ * commit 4b0ece6fa0167b22c004ff69e137dc94ee2e469e
+ * Author: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
+ * Date: Fri Mar 31 15:11:44 2017 -0700
+ *
+ * mm: migrate: fix remove_migration_pte() for ksm pages
+ */
+
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#if HAVE_NUMA_H
+#include <numa.h>
+#endif
+#if HAVE_NUMAIF_H
+#include <numaif.h>
+#endif
+
+#include "config.h"
+#include "lapi/syscalls.h"
+#include "lapi/mmap.h"
+#include "tst_test.h"
+#include "ksm_helper.h"
+#include "numa_helper.h"
+#include "migrate_pages_common.h"
+
+#ifdef HAVE_NUMA_V2
+#define N_PAGES 20
+#define N_LOOPS 600
+#define TEST_NODES 2
+
+static int orig_ksm_run = -1;
+static unsigned int page_size;
+static void *test_pages[N_PAGES];
+static int num_nodes, max_node;
+static int *nodes;
+static unsigned long *new_nodes[2];
+
+static void setup(void)
+{
+ int n;
+ unsigned long nodemask_size;
+
+ if (access(PATH_KSM, F_OK))
+ tst_brk(TCONF, "KSM configuration was not enabled");
+
+ if (get_allowed_nodes_arr(NH_MEMS, &num_nodes, &nodes) < 0)
+ tst_brk(TBROK | TERRNO, "get_allowed_nodes() failed");
+
+ if (num_nodes < TEST_NODES) {
+ tst_brk(TCONF, "requires NUMA with@least %d node",
+ TEST_NODES);
+ }
+
+ max_node = LTP_ALIGN(get_max_node(), sizeof(unsigned long) * 8);
+ nodemask_size = max_node / 8;
+ new_nodes[0] = SAFE_MALLOC(nodemask_size);
+ new_nodes[1] = SAFE_MALLOC(nodemask_size);
+ memset(new_nodes[0], 0, nodemask_size);
+ memset(new_nodes[1], 0, nodemask_size);
+ set_bit(new_nodes[0], nodes[0], 1);
+ set_bit(new_nodes[1], nodes[1], 1);
+
+ page_size = getpagesize();
+
+ for (n = 0; n < N_PAGES; n++) {
+ test_pages[n] = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE | PROT_EXEC,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (madvise(test_pages[n], page_size, MADV_MERGEABLE)) {
+ if (errno == EINVAL) {
+ tst_brk(TCONF | TERRNO, "madvise() didn't "
+ "support MADV_MERGEABLE");
+ }
+
+ tst_brk(TBROK | TERRNO,
+ "madvise(MADV_MERGEABLE) failed");
+ }
+
+ if (mbind(test_pages[n], page_size, MPOL_BIND, new_nodes[0],
+ max_node, 0))
+ tst_brk(TBROK | TERRNO, "mbind(MPOL_BIND) failed");
+
+ memset(test_pages[n], 0, page_size);
+ }
+
+ SAFE_FILE_SCANF(PATH_KSM "run", "%d", &orig_ksm_run);
+ SAFE_FILE_PRINTF(PATH_KSM "run", "%d", 1);
+ wait_ksmd_full_scan();
+}
+
+static void cleanup(void)
+{
+ int n;
+
+ for (n = 0; n < N_PAGES; n++) {
+ if (test_pages[n])
+ SAFE_MUNMAP(test_pages[n], page_size);
+ }
+
+ free(new_nodes[0]);
+ free(new_nodes[1]);
+
+ if (orig_ksm_run != -1)
+ SAFE_FILE_PRINTF(PATH_KSM "run", "%d", orig_ksm_run);
+}
+
+static void migrate_test(void)
+{
+ int loop, i, ret;
+
+ for (loop = 0; loop < N_LOOPS; loop++) {
+ i = loop % 2;
+ ret = tst_syscall(__NR_migrate_pages, 0, max_node,
+ new_nodes[i], new_nodes[i ? 0 : 1]);
+ if (ret < 0) {
+ tst_res(TFAIL | TERRNO, "migrate_pages() failed");
+ return;
+ }
+ }
+
+ tst_res(TPASS, "migrate_pages() passed");
+}
+
+static struct tst_test test = {
+ .min_kver = "2.6.32",
+ .needs_root = 1,
+ .setup = setup,
+ .cleanup = cleanup,
+ .test_all = migrate_test,
+};
+
+#else
+ TST_TEST_TCONF("require libnuma >= 2 and it's development packages");
+#endif
--
1.8.3.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [LTP] [PATCH v4 2/2] syscalls/migrate_pages03.c: Add new regression test
2018-01-04 9:44 ` [LTP] [PATCH v4 2/2] syscalls/migrate_pages03.c: Add new regression test xiao yang
@ 2018-01-04 15:30 ` Cyril Hrubis
2018-01-05 1:51 ` Xiao Yang
2018-01-05 2:48 ` [LTP] [PATCH v5 1/3] lib/mem.c: factor out wait_ksmd_full_scan() xiao yang
0 siblings, 2 replies; 24+ messages in thread
From: Cyril Hrubis @ 2018-01-04 15:30 UTC (permalink / raw)
To: ltp
Hi!
> +#include <errno.h>
> +#include <unistd.h>
> +#include <stdlib.h>
> +#if HAVE_NUMA_H
> +#include <numa.h>
> +#endif
> +#if HAVE_NUMAIF_H
> +#include <numaif.h>
> +#endif
> +
> +#include "config.h"
One small nit, the HAVE_NUMA* macros are defined in config.h so they are
defined only after the config.h header is included. I wonder if these
haders are needed to be included here at all, because they were not
included at all.
Also it's customary to use #ifdef instead of #if for autoconf macros.
--
Cyril Hrubis
chrubis@suse.cz
^ permalink raw reply [flat|nested] 24+ messages in thread
* [LTP] [PATCH v4 2/2] syscalls/migrate_pages03.c: Add new regression test
2018-01-04 15:30 ` Cyril Hrubis
@ 2018-01-05 1:51 ` Xiao Yang
2018-01-05 2:48 ` [LTP] [PATCH v5 1/3] lib/mem.c: factor out wait_ksmd_full_scan() xiao yang
1 sibling, 0 replies; 24+ messages in thread
From: Xiao Yang @ 2018-01-05 1:51 UTC (permalink / raw)
To: ltp
On 2018/01/04 23:30, Cyril Hrubis wrote:
> Hi!
>> +#include<errno.h>
>> +#include<unistd.h>
>> +#include<stdlib.h>
>> +#if HAVE_NUMA_H
>> +#include<numa.h>
>> +#endif
>> +#if HAVE_NUMAIF_H
>> +#include<numaif.h>
>> +#endif
>> +
>> +#include "config.h"
> One small nit, the HAVE_NUMA* macros are defined in config.h so they are
> defined only after the config.h header is included. I wonder if these
> haders are needed to be included here at all, because they were not
> included at all.
Hi Cyril,
These headers has been included in numa_helper.h, so we can remove them.
> Also it's customary to use #ifdef instead of #if for autoconf macros.
Agreed.
Thanks,
Xiao Yang
^ permalink raw reply [flat|nested] 24+ messages in thread
* [LTP] [PATCH v5 1/3] lib/mem.c: factor out wait_ksmd_full_scan()
2018-01-04 15:30 ` Cyril Hrubis
2018-01-05 1:51 ` Xiao Yang
@ 2018-01-05 2:48 ` xiao yang
2018-01-05 2:48 ` [LTP] [PATCH v5 2/3] syscalls/migrate_pages*: Small cleanup xiao yang
2018-01-05 2:48 ` [LTP] [PATCH v5 3/3] syscalls/migrate_pages03.c: Add new regression test xiao yang
1 sibling, 2 replies; 24+ messages in thread
From: xiao yang @ 2018-01-05 2:48 UTC (permalink / raw)
To: ltp
Move common wait_ksmd_full_scan() to kernel/lib/ksm_helper.c
and create accompanying kernel/include/ksm_helper.h.
Signed-off-by: xiao yang <yangx.jy@cn.fujitsu.com>
---
testcases/kernel/include/ksm_helper.h | 26 +++++++++++++++++++
testcases/kernel/lib/ksm_helper.c | 49 +++++++++++++++++++++++++++++++++++
testcases/kernel/mem/include/mem.h | 3 +--
testcases/kernel/mem/lib/mem.c | 27 -------------------
4 files changed, 76 insertions(+), 29 deletions(-)
create mode 100644 testcases/kernel/include/ksm_helper.h
create mode 100644 testcases/kernel/lib/ksm_helper.c
diff --git a/testcases/kernel/include/ksm_helper.h b/testcases/kernel/include/ksm_helper.h
new file mode 100644
index 0000000..0b35218
--- /dev/null
+++ b/testcases/kernel/include/ksm_helper.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program, if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef KSM_HELPER_H
+#define KSM_HELPER_H
+
+#define PATH_KSM "/sys/kernel/mm/ksm/"
+
+void wait_ksmd_full_scan(void);
+
+#endif /* KSM_HELPER_H */
diff --git a/testcases/kernel/lib/ksm_helper.c b/testcases/kernel/lib/ksm_helper.c
new file mode 100644
index 0000000..eba28d4
--- /dev/null
+++ b/testcases/kernel/lib/ksm_helper.c
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program, if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define TST_NO_DEFAULT_MAIN
+
+#include <unistd.h>
+#include "tst_test.h"
+#include "ksm_helper.h"
+
+void wait_ksmd_full_scan(void)
+{
+ unsigned long full_scans, at_least_one_full_scan;
+ int count = 0;
+
+ SAFE_FILE_SCANF(PATH_KSM "full_scans", "%lu", &full_scans);
+ /*
+ * The current scan is already in progress so we can't guarantee that
+ * the get_user_pages() is called on every existing rmap_item if we
+ * only waited for the remaining part of the scan.
+ *
+ * The actual merging happens after the unstable tree has been built so
+ * we need to wait at least two full scans to guarantee merging, hence
+ * wait full_scans to increment by 3 so that at least two full scans
+ * will run.
+ */
+ at_least_one_full_scan = full_scans + 3;
+ while (full_scans < at_least_one_full_scan) {
+ sleep(1);
+ count++;
+ SAFE_FILE_SCANF(PATH_KSM "full_scans", "%lu", &full_scans);
+ }
+
+ tst_res(TINFO, "ksm daemon takes %ds to run two full scans", count);
+}
diff --git a/testcases/kernel/mem/include/mem.h b/testcases/kernel/mem/include/mem.h
index 95d0bda..f7682f9 100644
--- a/testcases/kernel/mem/include/mem.h
+++ b/testcases/kernel/mem/include/mem.h
@@ -2,6 +2,7 @@
#define _MEM_H
#include "config.h"
#include "tst_test.h"
+#include "ksm_helper.h"
#if defined(__powerpc__) || defined(__powerpc64__)
#define MAXNODES 256
@@ -42,8 +43,6 @@ void testoom(int mempolicy, int lite, int retcode, int allow_sigkill);
/* KSM */
-#define PATH_KSM "/sys/kernel/mm/ksm/"
-
void create_same_memory(int size, int num, int unit);
void save_max_page_sharing(void);
void restore_max_page_sharing(void);
diff --git a/testcases/kernel/mem/lib/mem.c b/testcases/kernel/mem/lib/mem.c
index 7f2099b..59138a0 100644
--- a/testcases/kernel/mem/lib/mem.c
+++ b/testcases/kernel/mem/lib/mem.c
@@ -268,33 +268,6 @@ static void check(char *path, long int value)
tst_res(TPASS, "%s is %ld.", path, actual_val);
}
-static void wait_ksmd_full_scan(void)
-{
- unsigned long full_scans, at_least_one_full_scan;
- int count = 0;
-
- SAFE_FILE_SCANF(PATH_KSM "full_scans", "%lu", &full_scans);
- /*
- * The current scan is already in progress so we can't guarantee that
- * the get_user_pages() is called on every existing rmap_item if we
- * only waited for the remaining part of the scan.
- *
- * The actual merging happens after the unstable tree has been built so
- * we need to wait at least two full scans to guarantee merging, hence
- * wait full_scans to increment by 3 so that@least two full scans
- * will run.
- */
- at_least_one_full_scan = full_scans + 3;
- while (full_scans < at_least_one_full_scan) {
- sleep(1);
- count++;
- SAFE_FILE_SCANF(PATH_KSM "full_scans", "%lu", &full_scans);
- }
-
- tst_res(TINFO, "ksm daemon takes %ds to run two full scans",
- count);
-}
-
static void final_group_check(int run, int pages_shared, int pages_sharing,
int pages_volatile, int pages_unshared,
int sleep_millisecs, int pages_to_scan)
--
1.8.3.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [LTP] [PATCH v5 2/3] syscalls/migrate_pages*: Small cleanup
2018-01-05 2:48 ` [LTP] [PATCH v5 1/3] lib/mem.c: factor out wait_ksmd_full_scan() xiao yang
@ 2018-01-05 2:48 ` xiao yang
2018-02-07 16:22 ` Cyril Hrubis
2018-01-05 2:48 ` [LTP] [PATCH v5 3/3] syscalls/migrate_pages03.c: Add new regression test xiao yang
1 sibling, 1 reply; 24+ messages in thread
From: xiao yang @ 2018-01-05 2:48 UTC (permalink / raw)
To: ltp
1) Remove unused code
2) Use #ifdef instead of #if
Signed-off-by: xiao yang <yangx.jy@cn.fujitsu.com>
---
testcases/kernel/include/numa_helper.h | 8 ++++----
testcases/kernel/syscalls/migrate_pages/migrate_pages01.c | 10 ++--------
testcases/kernel/syscalls/migrate_pages/migrate_pages02.c | 9 +--------
3 files changed, 7 insertions(+), 20 deletions(-)
diff --git a/testcases/kernel/include/numa_helper.h b/testcases/kernel/include/numa_helper.h
index 39cf7aa..ed45ec8 100644
--- a/testcases/kernel/include/numa_helper.h
+++ b/testcases/kernel/include/numa_helper.h
@@ -20,11 +20,11 @@
#define NUMA_HELPER_H
#include "config.h"
-#if HAVE_NUMA_H
-#include <numa.h>
+#ifdef HAVE_NUMA_H
+# include <numa.h>
#endif
-#if HAVE_NUMAIF_H
-#include <numaif.h>
+#ifdef HAVE_NUMAIF_H
+# include <numaif.h>
#endif
#define NH_MEMS (1 << 0)
diff --git a/testcases/kernel/syscalls/migrate_pages/migrate_pages01.c b/testcases/kernel/syscalls/migrate_pages/migrate_pages01.c
index 01409f3..7cdcb31 100644
--- a/testcases/kernel/syscalls/migrate_pages/migrate_pages01.c
+++ b/testcases/kernel/syscalls/migrate_pages/migrate_pages01.c
@@ -30,18 +30,12 @@
#include <sys/wait.h>
#include <sys/mman.h>
#include <errno.h>
-#if HAVE_NUMA_H
-#include <numa.h>
-#endif
-#if HAVE_NUMAIF_H
-#include <numaif.h>
-#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pwd.h>
-#include "config.h"
+
#include "test.h"
#include "safe_macros.h"
#include "lapi/syscalls.h"
@@ -55,7 +49,7 @@ option_t options[] = {
{NULL, NULL, NULL}
};
-#if defined(HAVE_NUMA_V2) && defined(__NR_migrate_pages)
+#ifdef HAVE_NUMA_V2
static unsigned long *sane_old_nodes;
static unsigned long *sane_new_nodes;
diff --git a/testcases/kernel/syscalls/migrate_pages/migrate_pages02.c b/testcases/kernel/syscalls/migrate_pages/migrate_pages02.c
index faf96b6..800b575 100644
--- a/testcases/kernel/syscalls/migrate_pages/migrate_pages02.c
+++ b/testcases/kernel/syscalls/migrate_pages/migrate_pages02.c
@@ -35,18 +35,11 @@
#include <sys/wait.h>
#include <sys/mman.h>
#include <errno.h>
-#if HAVE_NUMA_H
-#include <numa.h>
-#endif
-#if HAVE_NUMAIF_H
-#include <numaif.h>
-#endif
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pwd.h>
-#include "config.h"
#include "test.h"
#include "safe_macros.h"
#include "lapi/syscalls.h"
@@ -66,7 +59,7 @@
char *TCID = "migrate_pages02";
int TST_TOTAL = 1;
-#if defined(HAVE_NUMA_V2) && defined(__NR_migrate_pages)
+#ifdef HAVE_NUMA_V2
static const char nobody_uid[] = "nobody";
static struct passwd *ltpuser;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [LTP] [PATCH v5 3/3] syscalls/migrate_pages03.c: Add new regression test
2018-01-05 2:48 ` [LTP] [PATCH v5 1/3] lib/mem.c: factor out wait_ksmd_full_scan() xiao yang
2018-01-05 2:48 ` [LTP] [PATCH v5 2/3] syscalls/migrate_pages*: Small cleanup xiao yang
@ 2018-01-05 2:48 ` xiao yang
2018-01-19 1:51 ` Xiao Yang
` (2 more replies)
1 sibling, 3 replies; 24+ messages in thread
From: xiao yang @ 2018-01-05 2:48 UTC (permalink / raw)
To: ltp
The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
Signed-off-by: xiao yang <yangx.jy@cn.fujitsu.com>
---
runtest/syscalls | 1 +
testcases/kernel/syscalls/.gitignore | 1 +
.../syscalls/migrate_pages/migrate_pages03.c | 151 +++++++++++++++++++++
3 files changed, 153 insertions(+)
create mode 100644 testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
diff --git a/runtest/syscalls b/runtest/syscalls
index 97fc643..ee8850f 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -587,6 +587,7 @@ memcpy01 memcpy01
migrate_pages01 migrate_pages01
migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
mlockall01 mlockall01
mlockall02 mlockall02
diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
index 12a136e..27e30b2 100644
--- a/testcases/kernel/syscalls/.gitignore
+++ b/testcases/kernel/syscalls/.gitignore
@@ -538,6 +538,7 @@
/memset/memset01
/migrate_pages/migrate_pages01
/migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
/mincore/mincore01
/mincore/mincore02
/mkdir/mkdir01
diff --git a/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
new file mode 100644
index 0000000..ecfc552
--- /dev/null
+++ b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
+ * Jie Fei <feij.fnst@cn.fujitsu.com>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program, if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * Description:
+ * This is a regression test for ksm page migration which is miscalculated.
+ *
+ * The kernel bug has been fixed by:
+ *
+ * commit 4b0ece6fa0167b22c004ff69e137dc94ee2e469e
+ * Author: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
+ * Date: Fri Mar 31 15:11:44 2017 -0700
+ *
+ * mm: migrate: fix remove_migration_pte() for ksm pages
+ */
+
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include "tst_test.h"
+#include "lapi/syscalls.h"
+#include "lapi/mmap.h"
+#include "ksm_helper.h"
+#include "numa_helper.h"
+#include "migrate_pages_common.h"
+
+#ifdef HAVE_NUMA_V2
+#define N_PAGES 20
+#define N_LOOPS 600
+#define TEST_NODES 2
+
+static int orig_ksm_run = -1;
+static unsigned int page_size;
+static void *test_pages[N_PAGES];
+static int num_nodes, max_node;
+static int *nodes;
+static unsigned long *new_nodes[2];
+
+static void setup(void)
+{
+ int n;
+ unsigned long nodemask_size;
+
+ if (access(PATH_KSM, F_OK))
+ tst_brk(TCONF, "KSM configuration was not enabled");
+
+ if (get_allowed_nodes_arr(NH_MEMS, &num_nodes, &nodes) < 0)
+ tst_brk(TBROK | TERRNO, "get_allowed_nodes() failed");
+
+ if (num_nodes < TEST_NODES) {
+ tst_brk(TCONF, "requires NUMA with@least %d node",
+ TEST_NODES);
+ }
+
+ max_node = LTP_ALIGN(get_max_node(), sizeof(unsigned long) * 8);
+ nodemask_size = max_node / 8;
+ new_nodes[0] = SAFE_MALLOC(nodemask_size);
+ new_nodes[1] = SAFE_MALLOC(nodemask_size);
+ memset(new_nodes[0], 0, nodemask_size);
+ memset(new_nodes[1], 0, nodemask_size);
+ set_bit(new_nodes[0], nodes[0], 1);
+ set_bit(new_nodes[1], nodes[1], 1);
+
+ page_size = getpagesize();
+
+ for (n = 0; n < N_PAGES; n++) {
+ test_pages[n] = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE | PROT_EXEC,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (madvise(test_pages[n], page_size, MADV_MERGEABLE)) {
+ if (errno == EINVAL) {
+ tst_brk(TCONF | TERRNO, "madvise() didn't "
+ "support MADV_MERGEABLE");
+ }
+
+ tst_brk(TBROK | TERRNO,
+ "madvise(MADV_MERGEABLE) failed");
+ }
+
+ if (mbind(test_pages[n], page_size, MPOL_BIND, new_nodes[0],
+ max_node, 0))
+ tst_brk(TBROK | TERRNO, "mbind(MPOL_BIND) failed");
+
+ memset(test_pages[n], 0, page_size);
+ }
+
+ SAFE_FILE_SCANF(PATH_KSM "run", "%d", &orig_ksm_run);
+ SAFE_FILE_PRINTF(PATH_KSM "run", "%d", 1);
+ wait_ksmd_full_scan();
+}
+
+static void cleanup(void)
+{
+ int n;
+
+ for (n = 0; n < N_PAGES; n++) {
+ if (test_pages[n])
+ SAFE_MUNMAP(test_pages[n], page_size);
+ }
+
+ free(new_nodes[0]);
+ free(new_nodes[1]);
+
+ if (orig_ksm_run != -1)
+ SAFE_FILE_PRINTF(PATH_KSM "run", "%d", orig_ksm_run);
+}
+
+static void migrate_test(void)
+{
+ int loop, i, ret;
+
+ for (loop = 0; loop < N_LOOPS; loop++) {
+ i = loop % 2;
+ ret = tst_syscall(__NR_migrate_pages, 0, max_node,
+ new_nodes[i], new_nodes[i ? 0 : 1]);
+ if (ret < 0) {
+ tst_res(TFAIL | TERRNO, "migrate_pages() failed");
+ return;
+ }
+ }
+
+ tst_res(TPASS, "migrate_pages() passed");
+}
+
+static struct tst_test test = {
+ .min_kver = "2.6.32",
+ .needs_root = 1,
+ .setup = setup,
+ .cleanup = cleanup,
+ .test_all = migrate_test,
+};
+
+#else
+ TST_TEST_TCONF("require libnuma >= 2 and it's development packages");
+#endif
--
1.8.3.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [LTP] [PATCH v5 3/3] syscalls/migrate_pages03.c: Add new regression test
2018-01-05 2:48 ` [LTP] [PATCH v5 3/3] syscalls/migrate_pages03.c: Add new regression test xiao yang
@ 2018-01-19 1:51 ` Xiao Yang
2018-02-02 8:11 ` Xiao Yang
2018-03-20 9:18 ` Xiao Yang
2 siblings, 0 replies; 24+ messages in thread
From: Xiao Yang @ 2018-01-19 1:51 UTC (permalink / raw)
To: ltp
Hi,
Ping. Thanks a lot. :-)
Thanks,
Xiao Yang
On 2018/01/05 10:48, xiao yang wrote:
> The bug has been fixed in kernel:
> '4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
>
> Signed-off-by: xiao yang <yangx.jy@cn.fujitsu.com>
> ---
> runtest/syscalls | 1 +
> testcases/kernel/syscalls/.gitignore | 1 +
> .../syscalls/migrate_pages/migrate_pages03.c | 151 +++++++++++++++++++++
> 3 files changed, 153 insertions(+)
> create mode 100644 testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
>
> diff --git a/runtest/syscalls b/runtest/syscalls
> index 97fc643..ee8850f 100644
> --- a/runtest/syscalls
> +++ b/runtest/syscalls
> @@ -587,6 +587,7 @@ memcpy01 memcpy01
>
> migrate_pages01 migrate_pages01
> migrate_pages02 migrate_pages02
> +migrate_pages03 migrate_pages03
>
> mlockall01 mlockall01
> mlockall02 mlockall02
> diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
> index 12a136e..27e30b2 100644
> --- a/testcases/kernel/syscalls/.gitignore
> +++ b/testcases/kernel/syscalls/.gitignore
> @@ -538,6 +538,7 @@
> /memset/memset01
> /migrate_pages/migrate_pages01
> /migrate_pages/migrate_pages02
> +/migrate_pages/migrate_pages03
> /mincore/mincore01
> /mincore/mincore02
> /mkdir/mkdir01
> diff --git a/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
> new file mode 100644
> index 0000000..ecfc552
> --- /dev/null
> +++ b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
> @@ -0,0 +1,151 @@
> +/*
> + * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
> + * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
> + * Jie Fei <feij.fnst@cn.fujitsu.com>
> + *
> + * 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.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program, if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +/*
> + * Description:
> + * This is a regression test for ksm page migration which is miscalculated.
> + *
> + * The kernel bug has been fixed by:
> + *
> + * commit 4b0ece6fa0167b22c004ff69e137dc94ee2e469e
> + * Author: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
> + * Date: Fri Mar 31 15:11:44 2017 -0700
> + *
> + * mm: migrate: fix remove_migration_pte() for ksm pages
> + */
> +
> +#include <errno.h>
> +#include <unistd.h>
> +#include <stdlib.h>
> +
> +#include "tst_test.h"
> +#include "lapi/syscalls.h"
> +#include "lapi/mmap.h"
> +#include "ksm_helper.h"
> +#include "numa_helper.h"
> +#include "migrate_pages_common.h"
> +
> +#ifdef HAVE_NUMA_V2
> +#define N_PAGES 20
> +#define N_LOOPS 600
> +#define TEST_NODES 2
> +
> +static int orig_ksm_run = -1;
> +static unsigned int page_size;
> +static void *test_pages[N_PAGES];
> +static int num_nodes, max_node;
> +static int *nodes;
> +static unsigned long *new_nodes[2];
> +
> +static void setup(void)
> +{
> + int n;
> + unsigned long nodemask_size;
> +
> + if (access(PATH_KSM, F_OK))
> + tst_brk(TCONF, "KSM configuration was not enabled");
> +
> + if (get_allowed_nodes_arr(NH_MEMS, &num_nodes, &nodes) < 0)
> + tst_brk(TBROK | TERRNO, "get_allowed_nodes() failed");
> +
> + if (num_nodes < TEST_NODES) {
> + tst_brk(TCONF, "requires NUMA with at least %d node",
> + TEST_NODES);
> + }
> +
> + max_node = LTP_ALIGN(get_max_node(), sizeof(unsigned long) * 8);
> + nodemask_size = max_node / 8;
> + new_nodes[0] = SAFE_MALLOC(nodemask_size);
> + new_nodes[1] = SAFE_MALLOC(nodemask_size);
> + memset(new_nodes[0], 0, nodemask_size);
> + memset(new_nodes[1], 0, nodemask_size);
> + set_bit(new_nodes[0], nodes[0], 1);
> + set_bit(new_nodes[1], nodes[1], 1);
> +
> + page_size = getpagesize();
> +
> + for (n = 0; n < N_PAGES; n++) {
> + test_pages[n] = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE | PROT_EXEC,
> + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
> + if (madvise(test_pages[n], page_size, MADV_MERGEABLE)) {
> + if (errno == EINVAL) {
> + tst_brk(TCONF | TERRNO, "madvise() didn't "
> + "support MADV_MERGEABLE");
> + }
> +
> + tst_brk(TBROK | TERRNO,
> + "madvise(MADV_MERGEABLE) failed");
> + }
> +
> + if (mbind(test_pages[n], page_size, MPOL_BIND, new_nodes[0],
> + max_node, 0))
> + tst_brk(TBROK | TERRNO, "mbind(MPOL_BIND) failed");
> +
> + memset(test_pages[n], 0, page_size);
> + }
> +
> + SAFE_FILE_SCANF(PATH_KSM "run", "%d", &orig_ksm_run);
> + SAFE_FILE_PRINTF(PATH_KSM "run", "%d", 1);
> + wait_ksmd_full_scan();
> +}
> +
> +static void cleanup(void)
> +{
> + int n;
> +
> + for (n = 0; n < N_PAGES; n++) {
> + if (test_pages[n])
> + SAFE_MUNMAP(test_pages[n], page_size);
> + }
> +
> + free(new_nodes[0]);
> + free(new_nodes[1]);
> +
> + if (orig_ksm_run != -1)
> + SAFE_FILE_PRINTF(PATH_KSM "run", "%d", orig_ksm_run);
> +}
> +
> +static void migrate_test(void)
> +{
> + int loop, i, ret;
> +
> + for (loop = 0; loop < N_LOOPS; loop++) {
> + i = loop % 2;
> + ret = tst_syscall(__NR_migrate_pages, 0, max_node,
> + new_nodes[i], new_nodes[i ? 0 : 1]);
> + if (ret < 0) {
> + tst_res(TFAIL | TERRNO, "migrate_pages() failed");
> + return;
> + }
> + }
> +
> + tst_res(TPASS, "migrate_pages() passed");
> +}
> +
> +static struct tst_test test = {
> + .min_kver = "2.6.32",
> + .needs_root = 1,
> + .setup = setup,
> + .cleanup = cleanup,
> + .test_all = migrate_test,
> +};
> +
> +#else
> + TST_TEST_TCONF("require libnuma >= 2 and it's development packages");
> +#endif
^ permalink raw reply [flat|nested] 24+ messages in thread
* [LTP] [PATCH v5 3/3] syscalls/migrate_pages03.c: Add new regression test
2018-01-05 2:48 ` [LTP] [PATCH v5 3/3] syscalls/migrate_pages03.c: Add new regression test xiao yang
2018-01-19 1:51 ` Xiao Yang
@ 2018-02-02 8:11 ` Xiao Yang
2018-02-06 21:20 ` Jan Stancek
2018-03-20 9:18 ` Xiao Yang
2 siblings, 1 reply; 24+ messages in thread
From: Xiao Yang @ 2018-02-02 8:11 UTC (permalink / raw)
To: ltp
Hi Jan, Cyril
Could you help me review the v5 patch set. Thanks a lot.
Thanks,
Xiao Yang
On 2018/01/05 10:48, xiao yang wrote:
> The bug has been fixed in kernel:
> '4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
>
> Signed-off-by: xiao yang <yangx.jy@cn.fujitsu.com>
> ---
> runtest/syscalls | 1 +
> testcases/kernel/syscalls/.gitignore | 1 +
> .../syscalls/migrate_pages/migrate_pages03.c | 151 +++++++++++++++++++++
> 3 files changed, 153 insertions(+)
> create mode 100644 testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
>
> diff --git a/runtest/syscalls b/runtest/syscalls
> index 97fc643..ee8850f 100644
> --- a/runtest/syscalls
> +++ b/runtest/syscalls
> @@ -587,6 +587,7 @@ memcpy01 memcpy01
>
> migrate_pages01 migrate_pages01
> migrate_pages02 migrate_pages02
> +migrate_pages03 migrate_pages03
>
> mlockall01 mlockall01
> mlockall02 mlockall02
> diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
> index 12a136e..27e30b2 100644
> --- a/testcases/kernel/syscalls/.gitignore
> +++ b/testcases/kernel/syscalls/.gitignore
> @@ -538,6 +538,7 @@
> /memset/memset01
> /migrate_pages/migrate_pages01
> /migrate_pages/migrate_pages02
> +/migrate_pages/migrate_pages03
> /mincore/mincore01
> /mincore/mincore02
> /mkdir/mkdir01
> diff --git a/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
> new file mode 100644
> index 0000000..ecfc552
> --- /dev/null
> +++ b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
> @@ -0,0 +1,151 @@
> +/*
> + * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
> + * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
> + * Jie Fei <feij.fnst@cn.fujitsu.com>
> + *
> + * 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.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program, if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +/*
> + * Description:
> + * This is a regression test for ksm page migration which is miscalculated.
> + *
> + * The kernel bug has been fixed by:
> + *
> + * commit 4b0ece6fa0167b22c004ff69e137dc94ee2e469e
> + * Author: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
> + * Date: Fri Mar 31 15:11:44 2017 -0700
> + *
> + * mm: migrate: fix remove_migration_pte() for ksm pages
> + */
> +
> +#include <errno.h>
> +#include <unistd.h>
> +#include <stdlib.h>
> +
> +#include "tst_test.h"
> +#include "lapi/syscalls.h"
> +#include "lapi/mmap.h"
> +#include "ksm_helper.h"
> +#include "numa_helper.h"
> +#include "migrate_pages_common.h"
> +
> +#ifdef HAVE_NUMA_V2
> +#define N_PAGES 20
> +#define N_LOOPS 600
> +#define TEST_NODES 2
> +
> +static int orig_ksm_run = -1;
> +static unsigned int page_size;
> +static void *test_pages[N_PAGES];
> +static int num_nodes, max_node;
> +static int *nodes;
> +static unsigned long *new_nodes[2];
> +
> +static void setup(void)
> +{
> + int n;
> + unsigned long nodemask_size;
> +
> + if (access(PATH_KSM, F_OK))
> + tst_brk(TCONF, "KSM configuration was not enabled");
> +
> + if (get_allowed_nodes_arr(NH_MEMS, &num_nodes, &nodes) < 0)
> + tst_brk(TBROK | TERRNO, "get_allowed_nodes() failed");
> +
> + if (num_nodes < TEST_NODES) {
> + tst_brk(TCONF, "requires NUMA with at least %d node",
> + TEST_NODES);
> + }
> +
> + max_node = LTP_ALIGN(get_max_node(), sizeof(unsigned long) * 8);
> + nodemask_size = max_node / 8;
> + new_nodes[0] = SAFE_MALLOC(nodemask_size);
> + new_nodes[1] = SAFE_MALLOC(nodemask_size);
> + memset(new_nodes[0], 0, nodemask_size);
> + memset(new_nodes[1], 0, nodemask_size);
> + set_bit(new_nodes[0], nodes[0], 1);
> + set_bit(new_nodes[1], nodes[1], 1);
> +
> + page_size = getpagesize();
> +
> + for (n = 0; n < N_PAGES; n++) {
> + test_pages[n] = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE | PROT_EXEC,
> + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
> + if (madvise(test_pages[n], page_size, MADV_MERGEABLE)) {
> + if (errno == EINVAL) {
> + tst_brk(TCONF | TERRNO, "madvise() didn't "
> + "support MADV_MERGEABLE");
> + }
> +
> + tst_brk(TBROK | TERRNO,
> + "madvise(MADV_MERGEABLE) failed");
> + }
> +
> + if (mbind(test_pages[n], page_size, MPOL_BIND, new_nodes[0],
> + max_node, 0))
> + tst_brk(TBROK | TERRNO, "mbind(MPOL_BIND) failed");
> +
> + memset(test_pages[n], 0, page_size);
> + }
> +
> + SAFE_FILE_SCANF(PATH_KSM "run", "%d", &orig_ksm_run);
> + SAFE_FILE_PRINTF(PATH_KSM "run", "%d", 1);
> + wait_ksmd_full_scan();
> +}
> +
> +static void cleanup(void)
> +{
> + int n;
> +
> + for (n = 0; n < N_PAGES; n++) {
> + if (test_pages[n])
> + SAFE_MUNMAP(test_pages[n], page_size);
> + }
> +
> + free(new_nodes[0]);
> + free(new_nodes[1]);
> +
> + if (orig_ksm_run != -1)
> + SAFE_FILE_PRINTF(PATH_KSM "run", "%d", orig_ksm_run);
> +}
> +
> +static void migrate_test(void)
> +{
> + int loop, i, ret;
> +
> + for (loop = 0; loop < N_LOOPS; loop++) {
> + i = loop % 2;
> + ret = tst_syscall(__NR_migrate_pages, 0, max_node,
> + new_nodes[i], new_nodes[i ? 0 : 1]);
> + if (ret < 0) {
> + tst_res(TFAIL | TERRNO, "migrate_pages() failed");
> + return;
> + }
> + }
> +
> + tst_res(TPASS, "migrate_pages() passed");
> +}
> +
> +static struct tst_test test = {
> + .min_kver = "2.6.32",
> + .needs_root = 1,
> + .setup = setup,
> + .cleanup = cleanup,
> + .test_all = migrate_test,
> +};
> +
> +#else
> + TST_TEST_TCONF("require libnuma >= 2 and it's development packages");
> +#endif
^ permalink raw reply [flat|nested] 24+ messages in thread
* [LTP] [PATCH v5 3/3] syscalls/migrate_pages03.c: Add new regression test
2018-02-02 8:11 ` Xiao Yang
@ 2018-02-06 21:20 ` Jan Stancek
2018-05-15 8:30 ` Xiao Yang
0 siblings, 1 reply; 24+ messages in thread
From: Jan Stancek @ 2018-02-06 21:20 UTC (permalink / raw)
To: ltp
----- Original Message -----
> Hi Jan, Cyril
>
> Could you help me review the v5 patch set. Thanks a lot.
Looks good to me - I didn't have a chance to test it though.
Regards,
Jan
>
> Thanks,
> Xiao Yang
> On 2018/01/05 10:48, xiao yang wrote:
> > The bug has been fixed in kernel:
> > '4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
> >
> > Signed-off-by: xiao yang <yangx.jy@cn.fujitsu.com>
> > ---
> > runtest/syscalls | 1 +
> > testcases/kernel/syscalls/.gitignore | 1 +
> > .../syscalls/migrate_pages/migrate_pages03.c | 151
> > +++++++++++++++++++++
> > 3 files changed, 153 insertions(+)
> > create mode 100644
> > testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
> >
> > diff --git a/runtest/syscalls b/runtest/syscalls
> > index 97fc643..ee8850f 100644
> > --- a/runtest/syscalls
> > +++ b/runtest/syscalls
> > @@ -587,6 +587,7 @@ memcpy01 memcpy01
> >
> > migrate_pages01 migrate_pages01
> > migrate_pages02 migrate_pages02
> > +migrate_pages03 migrate_pages03
> >
> > mlockall01 mlockall01
> > mlockall02 mlockall02
> > diff --git a/testcases/kernel/syscalls/.gitignore
> > b/testcases/kernel/syscalls/.gitignore
> > index 12a136e..27e30b2 100644
> > --- a/testcases/kernel/syscalls/.gitignore
> > +++ b/testcases/kernel/syscalls/.gitignore
> > @@ -538,6 +538,7 @@
> > /memset/memset01
> > /migrate_pages/migrate_pages01
> > /migrate_pages/migrate_pages02
> > +/migrate_pages/migrate_pages03
> > /mincore/mincore01
> > /mincore/mincore02
> > /mkdir/mkdir01
> > diff --git a/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
> > b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
> > new file mode 100644
> > index 0000000..ecfc552
> > --- /dev/null
> > +++ b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
> > @@ -0,0 +1,151 @@
> > +/*
> > + * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
> > + * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
> > + * Jie Fei <feij.fnst@cn.fujitsu.com>
> > + *
> > + * 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.
> > + *
> > + * You should have received a copy of the GNU General Public License
> > + * along with this program, if not, see <http://www.gnu.org/licenses/>.
> > + */
> > +
> > +/*
> > + * Description:
> > + * This is a regression test for ksm page migration which is
> > miscalculated.
> > + *
> > + * The kernel bug has been fixed by:
> > + *
> > + * commit 4b0ece6fa0167b22c004ff69e137dc94ee2e469e
> > + * Author: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
> > + * Date: Fri Mar 31 15:11:44 2017 -0700
> > + *
> > + * mm: migrate: fix remove_migration_pte() for ksm pages
> > + */
> > +
> > +#include <errno.h>
> > +#include <unistd.h>
> > +#include <stdlib.h>
> > +
> > +#include "tst_test.h"
> > +#include "lapi/syscalls.h"
> > +#include "lapi/mmap.h"
> > +#include "ksm_helper.h"
> > +#include "numa_helper.h"
> > +#include "migrate_pages_common.h"
> > +
> > +#ifdef HAVE_NUMA_V2
> > +#define N_PAGES 20
> > +#define N_LOOPS 600
> > +#define TEST_NODES 2
> > +
> > +static int orig_ksm_run = -1;
> > +static unsigned int page_size;
> > +static void *test_pages[N_PAGES];
> > +static int num_nodes, max_node;
> > +static int *nodes;
> > +static unsigned long *new_nodes[2];
> > +
> > +static void setup(void)
> > +{
> > + int n;
> > + unsigned long nodemask_size;
> > +
> > + if (access(PATH_KSM, F_OK))
> > + tst_brk(TCONF, "KSM configuration was not enabled");
> > +
> > + if (get_allowed_nodes_arr(NH_MEMS, &num_nodes, &nodes) < 0)
> > + tst_brk(TBROK | TERRNO, "get_allowed_nodes() failed");
> > +
> > + if (num_nodes < TEST_NODES) {
> > + tst_brk(TCONF, "requires NUMA with at least %d node",
> > + TEST_NODES);
> > + }
> > +
> > + max_node = LTP_ALIGN(get_max_node(), sizeof(unsigned long) * 8);
> > + nodemask_size = max_node / 8;
> > + new_nodes[0] = SAFE_MALLOC(nodemask_size);
> > + new_nodes[1] = SAFE_MALLOC(nodemask_size);
> > + memset(new_nodes[0], 0, nodemask_size);
> > + memset(new_nodes[1], 0, nodemask_size);
> > + set_bit(new_nodes[0], nodes[0], 1);
> > + set_bit(new_nodes[1], nodes[1], 1);
> > +
> > + page_size = getpagesize();
> > +
> > + for (n = 0; n < N_PAGES; n++) {
> > + test_pages[n] = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE |
> > PROT_EXEC,
> > + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
> > + if (madvise(test_pages[n], page_size, MADV_MERGEABLE)) {
> > + if (errno == EINVAL) {
> > + tst_brk(TCONF | TERRNO, "madvise() didn't "
> > + "support MADV_MERGEABLE");
> > + }
> > +
> > + tst_brk(TBROK | TERRNO,
> > + "madvise(MADV_MERGEABLE) failed");
> > + }
> > +
> > + if (mbind(test_pages[n], page_size, MPOL_BIND, new_nodes[0],
> > + max_node, 0))
> > + tst_brk(TBROK | TERRNO, "mbind(MPOL_BIND) failed");
> > +
> > + memset(test_pages[n], 0, page_size);
> > + }
> > +
> > + SAFE_FILE_SCANF(PATH_KSM "run", "%d", &orig_ksm_run);
> > + SAFE_FILE_PRINTF(PATH_KSM "run", "%d", 1);
> > + wait_ksmd_full_scan();
> > +}
> > +
> > +static void cleanup(void)
> > +{
> > + int n;
> > +
> > + for (n = 0; n < N_PAGES; n++) {
> > + if (test_pages[n])
> > + SAFE_MUNMAP(test_pages[n], page_size);
> > + }
> > +
> > + free(new_nodes[0]);
> > + free(new_nodes[1]);
> > +
> > + if (orig_ksm_run != -1)
> > + SAFE_FILE_PRINTF(PATH_KSM "run", "%d", orig_ksm_run);
> > +}
> > +
> > +static void migrate_test(void)
> > +{
> > + int loop, i, ret;
> > +
> > + for (loop = 0; loop < N_LOOPS; loop++) {
> > + i = loop % 2;
> > + ret = tst_syscall(__NR_migrate_pages, 0, max_node,
> > + new_nodes[i], new_nodes[i ? 0 : 1]);
> > + if (ret < 0) {
> > + tst_res(TFAIL | TERRNO, "migrate_pages() failed");
> > + return;
> > + }
> > + }
> > +
> > + tst_res(TPASS, "migrate_pages() passed");
> > +}
> > +
> > +static struct tst_test test = {
> > + .min_kver = "2.6.32",
> > + .needs_root = 1,
> > + .setup = setup,
> > + .cleanup = cleanup,
> > + .test_all = migrate_test,
> > +};
> > +
> > +#else
> > + TST_TEST_TCONF("require libnuma >= 2 and it's development packages");
> > +#endif
>
>
>
>
^ permalink raw reply [flat|nested] 24+ messages in thread
* [LTP] [PATCH v5 2/3] syscalls/migrate_pages*: Small cleanup
2018-01-05 2:48 ` [LTP] [PATCH v5 2/3] syscalls/migrate_pages*: Small cleanup xiao yang
@ 2018-02-07 16:22 ` Cyril Hrubis
0 siblings, 0 replies; 24+ messages in thread
From: Cyril Hrubis @ 2018-02-07 16:22 UTC (permalink / raw)
To: ltp
Hi!
I've pushed first two patches, so that Petr can rebase his fixes on the
top of that and I'm looking at the test now. Thanks.
--
Cyril Hrubis
chrubis@suse.cz
^ permalink raw reply [flat|nested] 24+ messages in thread
* [LTP] [PATCH v5 3/3] syscalls/migrate_pages03.c: Add new regression test
2018-01-05 2:48 ` [LTP] [PATCH v5 3/3] syscalls/migrate_pages03.c: Add new regression test xiao yang
2018-01-19 1:51 ` Xiao Yang
2018-02-02 8:11 ` Xiao Yang
@ 2018-03-20 9:18 ` Xiao Yang
2 siblings, 0 replies; 24+ messages in thread
From: Xiao Yang @ 2018-03-20 9:18 UTC (permalink / raw)
To: ltp
Hi,
Ping :-)
Thanks,
Xiao Yang
On 2018/01/05 10:48, xiao yang wrote:
> The bug has been fixed in kernel:
> '4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
>
> Signed-off-by: xiao yang <yangx.jy@cn.fujitsu.com>
> ---
> runtest/syscalls | 1 +
> testcases/kernel/syscalls/.gitignore | 1 +
> .../syscalls/migrate_pages/migrate_pages03.c | 151 +++++++++++++++++++++
> 3 files changed, 153 insertions(+)
> create mode 100644 testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
>
> diff --git a/runtest/syscalls b/runtest/syscalls
> index 97fc643..ee8850f 100644
> --- a/runtest/syscalls
> +++ b/runtest/syscalls
> @@ -587,6 +587,7 @@ memcpy01 memcpy01
>
> migrate_pages01 migrate_pages01
> migrate_pages02 migrate_pages02
> +migrate_pages03 migrate_pages03
>
> mlockall01 mlockall01
> mlockall02 mlockall02
> diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
> index 12a136e..27e30b2 100644
> --- a/testcases/kernel/syscalls/.gitignore
> +++ b/testcases/kernel/syscalls/.gitignore
> @@ -538,6 +538,7 @@
> /memset/memset01
> /migrate_pages/migrate_pages01
> /migrate_pages/migrate_pages02
> +/migrate_pages/migrate_pages03
> /mincore/mincore01
> /mincore/mincore02
> /mkdir/mkdir01
> diff --git a/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
> new file mode 100644
> index 0000000..ecfc552
> --- /dev/null
> +++ b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
> @@ -0,0 +1,151 @@
> +/*
> + * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
> + * Author(s): Xiao Yang <yangx.jy@cn.fujitsu.com>
> + * Jie Fei <feij.fnst@cn.fujitsu.com>
> + *
> + * 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.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program, if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +/*
> + * Description:
> + * This is a regression test for ksm page migration which is miscalculated.
> + *
> + * The kernel bug has been fixed by:
> + *
> + * commit 4b0ece6fa0167b22c004ff69e137dc94ee2e469e
> + * Author: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
> + * Date: Fri Mar 31 15:11:44 2017 -0700
> + *
> + * mm: migrate: fix remove_migration_pte() for ksm pages
> + */
> +
> +#include <errno.h>
> +#include <unistd.h>
> +#include <stdlib.h>
> +
> +#include "tst_test.h"
> +#include "lapi/syscalls.h"
> +#include "lapi/mmap.h"
> +#include "ksm_helper.h"
> +#include "numa_helper.h"
> +#include "migrate_pages_common.h"
> +
> +#ifdef HAVE_NUMA_V2
> +#define N_PAGES 20
> +#define N_LOOPS 600
> +#define TEST_NODES 2
> +
> +static int orig_ksm_run = -1;
> +static unsigned int page_size;
> +static void *test_pages[N_PAGES];
> +static int num_nodes, max_node;
> +static int *nodes;
> +static unsigned long *new_nodes[2];
> +
> +static void setup(void)
> +{
> + int n;
> + unsigned long nodemask_size;
> +
> + if (access(PATH_KSM, F_OK))
> + tst_brk(TCONF, "KSM configuration was not enabled");
> +
> + if (get_allowed_nodes_arr(NH_MEMS, &num_nodes, &nodes) < 0)
> + tst_brk(TBROK | TERRNO, "get_allowed_nodes() failed");
> +
> + if (num_nodes < TEST_NODES) {
> + tst_brk(TCONF, "requires NUMA with at least %d node",
> + TEST_NODES);
> + }
> +
> + max_node = LTP_ALIGN(get_max_node(), sizeof(unsigned long) * 8);
> + nodemask_size = max_node / 8;
> + new_nodes[0] = SAFE_MALLOC(nodemask_size);
> + new_nodes[1] = SAFE_MALLOC(nodemask_size);
> + memset(new_nodes[0], 0, nodemask_size);
> + memset(new_nodes[1], 0, nodemask_size);
> + set_bit(new_nodes[0], nodes[0], 1);
> + set_bit(new_nodes[1], nodes[1], 1);
> +
> + page_size = getpagesize();
> +
> + for (n = 0; n < N_PAGES; n++) {
> + test_pages[n] = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE | PROT_EXEC,
> + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
> + if (madvise(test_pages[n], page_size, MADV_MERGEABLE)) {
> + if (errno == EINVAL) {
> + tst_brk(TCONF | TERRNO, "madvise() didn't "
> + "support MADV_MERGEABLE");
> + }
> +
> + tst_brk(TBROK | TERRNO,
> + "madvise(MADV_MERGEABLE) failed");
> + }
> +
> + if (mbind(test_pages[n], page_size, MPOL_BIND, new_nodes[0],
> + max_node, 0))
> + tst_brk(TBROK | TERRNO, "mbind(MPOL_BIND) failed");
> +
> + memset(test_pages[n], 0, page_size);
> + }
> +
> + SAFE_FILE_SCANF(PATH_KSM "run", "%d", &orig_ksm_run);
> + SAFE_FILE_PRINTF(PATH_KSM "run", "%d", 1);
> + wait_ksmd_full_scan();
> +}
> +
> +static void cleanup(void)
> +{
> + int n;
> +
> + for (n = 0; n < N_PAGES; n++) {
> + if (test_pages[n])
> + SAFE_MUNMAP(test_pages[n], page_size);
> + }
> +
> + free(new_nodes[0]);
> + free(new_nodes[1]);
> +
> + if (orig_ksm_run != -1)
> + SAFE_FILE_PRINTF(PATH_KSM "run", "%d", orig_ksm_run);
> +}
> +
> +static void migrate_test(void)
> +{
> + int loop, i, ret;
> +
> + for (loop = 0; loop < N_LOOPS; loop++) {
> + i = loop % 2;
> + ret = tst_syscall(__NR_migrate_pages, 0, max_node,
> + new_nodes[i], new_nodes[i ? 0 : 1]);
> + if (ret < 0) {
> + tst_res(TFAIL | TERRNO, "migrate_pages() failed");
> + return;
> + }
> + }
> +
> + tst_res(TPASS, "migrate_pages() passed");
> +}
> +
> +static struct tst_test test = {
> + .min_kver = "2.6.32",
> + .needs_root = 1,
> + .setup = setup,
> + .cleanup = cleanup,
> + .test_all = migrate_test,
> +};
> +
> +#else
> + TST_TEST_TCONF("require libnuma >= 2 and it's development packages");
> +#endif
^ permalink raw reply [flat|nested] 24+ messages in thread
* [LTP] [PATCH v5 3/3] syscalls/migrate_pages03.c: Add new regression test
2018-02-06 21:20 ` Jan Stancek
@ 2018-05-15 8:30 ` Xiao Yang
2018-05-16 8:48 ` Jan Stancek
0 siblings, 1 reply; 24+ messages in thread
From: Xiao Yang @ 2018-05-15 8:30 UTC (permalink / raw)
To: ltp
Hi, Jan and Cyril,
Could you help me push the v5 patch ? Thanks a lot. :-)
Best Regards,
Xiao Yang
On 2018/02/07 5:20, Jan Stancek wrote:
>
> ----- Original Message -----
>> Hi Jan, Cyril
>>
>> Could you help me review the v5 patch set. Thanks a lot.
> Looks good to me - I didn't have a chance to test it though.
>
> Regards,
> Jan
>
>> Thanks,
>> Xiao Yang
>> On 2018/01/05 10:48, xiao yang wrote:
>>> The bug has been fixed in kernel:
>>> '4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
>>>
>>> Signed-off-by: xiao yang<yangx.jy@cn.fujitsu.com>
>>> ---
>>> runtest/syscalls | 1 +
>>> testcases/kernel/syscalls/.gitignore | 1 +
>>> .../syscalls/migrate_pages/migrate_pages03.c | 151
>>> +++++++++++++++++++++
>>> 3 files changed, 153 insertions(+)
>>> create mode 100644
>>> testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
>>>
>>> diff --git a/runtest/syscalls b/runtest/syscalls
>>> index 97fc643..ee8850f 100644
>>> --- a/runtest/syscalls
>>> +++ b/runtest/syscalls
>>> @@ -587,6 +587,7 @@ memcpy01 memcpy01
>>>
>>> migrate_pages01 migrate_pages01
>>> migrate_pages02 migrate_pages02
>>> +migrate_pages03 migrate_pages03
>>>
>>> mlockall01 mlockall01
>>> mlockall02 mlockall02
>>> diff --git a/testcases/kernel/syscalls/.gitignore
>>> b/testcases/kernel/syscalls/.gitignore
>>> index 12a136e..27e30b2 100644
>>> --- a/testcases/kernel/syscalls/.gitignore
>>> +++ b/testcases/kernel/syscalls/.gitignore
>>> @@ -538,6 +538,7 @@
>>> /memset/memset01
>>> /migrate_pages/migrate_pages01
>>> /migrate_pages/migrate_pages02
>>> +/migrate_pages/migrate_pages03
>>> /mincore/mincore01
>>> /mincore/mincore02
>>> /mkdir/mkdir01
>>> diff --git a/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
>>> b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
>>> new file mode 100644
>>> index 0000000..ecfc552
>>> --- /dev/null
>>> +++ b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
>>> @@ -0,0 +1,151 @@
>>> +/*
>>> + * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
>>> + * Author(s): Xiao Yang<yangx.jy@cn.fujitsu.com>
>>> + * Jie Fei<feij.fnst@cn.fujitsu.com>
>>> + *
>>> + * 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.
>>> + *
>>> + * You should have received a copy of the GNU General Public License
>>> + * along with this program, if not, see<http://www.gnu.org/licenses/>.
>>> + */
>>> +
>>> +/*
>>> + * Description:
>>> + * This is a regression test for ksm page migration which is
>>> miscalculated.
>>> + *
>>> + * The kernel bug has been fixed by:
>>> + *
>>> + * commit 4b0ece6fa0167b22c004ff69e137dc94ee2e469e
>>> + * Author: Naoya Horiguchi<n-horiguchi@ah.jp.nec.com>
>>> + * Date: Fri Mar 31 15:11:44 2017 -0700
>>> + *
>>> + * mm: migrate: fix remove_migration_pte() for ksm pages
>>> + */
>>> +
>>> +#include<errno.h>
>>> +#include<unistd.h>
>>> +#include<stdlib.h>
>>> +
>>> +#include "tst_test.h"
>>> +#include "lapi/syscalls.h"
>>> +#include "lapi/mmap.h"
>>> +#include "ksm_helper.h"
>>> +#include "numa_helper.h"
>>> +#include "migrate_pages_common.h"
>>> +
>>> +#ifdef HAVE_NUMA_V2
>>> +#define N_PAGES 20
>>> +#define N_LOOPS 600
>>> +#define TEST_NODES 2
>>> +
>>> +static int orig_ksm_run = -1;
>>> +static unsigned int page_size;
>>> +static void *test_pages[N_PAGES];
>>> +static int num_nodes, max_node;
>>> +static int *nodes;
>>> +static unsigned long *new_nodes[2];
>>> +
>>> +static void setup(void)
>>> +{
>>> + int n;
>>> + unsigned long nodemask_size;
>>> +
>>> + if (access(PATH_KSM, F_OK))
>>> + tst_brk(TCONF, "KSM configuration was not enabled");
>>> +
>>> + if (get_allowed_nodes_arr(NH_MEMS,&num_nodes,&nodes)< 0)
>>> + tst_brk(TBROK | TERRNO, "get_allowed_nodes() failed");
>>> +
>>> + if (num_nodes< TEST_NODES) {
>>> + tst_brk(TCONF, "requires NUMA with at least %d node",
>>> + TEST_NODES);
>>> + }
>>> +
>>> + max_node = LTP_ALIGN(get_max_node(), sizeof(unsigned long) * 8);
>>> + nodemask_size = max_node / 8;
>>> + new_nodes[0] = SAFE_MALLOC(nodemask_size);
>>> + new_nodes[1] = SAFE_MALLOC(nodemask_size);
>>> + memset(new_nodes[0], 0, nodemask_size);
>>> + memset(new_nodes[1], 0, nodemask_size);
>>> + set_bit(new_nodes[0], nodes[0], 1);
>>> + set_bit(new_nodes[1], nodes[1], 1);
>>> +
>>> + page_size = getpagesize();
>>> +
>>> + for (n = 0; n< N_PAGES; n++) {
>>> + test_pages[n] = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE |
>>> PROT_EXEC,
>>> + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
>>> + if (madvise(test_pages[n], page_size, MADV_MERGEABLE)) {
>>> + if (errno == EINVAL) {
>>> + tst_brk(TCONF | TERRNO, "madvise() didn't "
>>> + "support MADV_MERGEABLE");
>>> + }
>>> +
>>> + tst_brk(TBROK | TERRNO,
>>> + "madvise(MADV_MERGEABLE) failed");
>>> + }
>>> +
>>> + if (mbind(test_pages[n], page_size, MPOL_BIND, new_nodes[0],
>>> + max_node, 0))
>>> + tst_brk(TBROK | TERRNO, "mbind(MPOL_BIND) failed");
>>> +
>>> + memset(test_pages[n], 0, page_size);
>>> + }
>>> +
>>> + SAFE_FILE_SCANF(PATH_KSM "run", "%d",&orig_ksm_run);
>>> + SAFE_FILE_PRINTF(PATH_KSM "run", "%d", 1);
>>> + wait_ksmd_full_scan();
>>> +}
>>> +
>>> +static void cleanup(void)
>>> +{
>>> + int n;
>>> +
>>> + for (n = 0; n< N_PAGES; n++) {
>>> + if (test_pages[n])
>>> + SAFE_MUNMAP(test_pages[n], page_size);
>>> + }
>>> +
>>> + free(new_nodes[0]);
>>> + free(new_nodes[1]);
>>> +
>>> + if (orig_ksm_run != -1)
>>> + SAFE_FILE_PRINTF(PATH_KSM "run", "%d", orig_ksm_run);
>>> +}
>>> +
>>> +static void migrate_test(void)
>>> +{
>>> + int loop, i, ret;
>>> +
>>> + for (loop = 0; loop< N_LOOPS; loop++) {
>>> + i = loop % 2;
>>> + ret = tst_syscall(__NR_migrate_pages, 0, max_node,
>>> + new_nodes[i], new_nodes[i ? 0 : 1]);
>>> + if (ret< 0) {
>>> + tst_res(TFAIL | TERRNO, "migrate_pages() failed");
>>> + return;
>>> + }
>>> + }
>>> +
>>> + tst_res(TPASS, "migrate_pages() passed");
>>> +}
>>> +
>>> +static struct tst_test test = {
>>> + .min_kver = "2.6.32",
>>> + .needs_root = 1,
>>> + .setup = setup,
>>> + .cleanup = cleanup,
>>> + .test_all = migrate_test,
>>> +};
>>> +
>>> +#else
>>> + TST_TEST_TCONF("require libnuma>= 2 and it's development packages");
>>> +#endif
>>
>>
>>
>
> .
>
^ permalink raw reply [flat|nested] 24+ messages in thread
* [LTP] [PATCH v5 3/3] syscalls/migrate_pages03.c: Add new regression test
2018-05-15 8:30 ` Xiao Yang
@ 2018-05-16 8:48 ` Jan Stancek
0 siblings, 0 replies; 24+ messages in thread
From: Jan Stancek @ 2018-05-16 8:48 UTC (permalink / raw)
To: ltp
----- Original Message -----
> Hi, Jan and Cyril,
>
> Could you help me push the v5 patch ? Thanks a lot. :-)
Rebased and pushed.
Regards,
Jan
>
> Best Regards,
> Xiao Yang
> On 2018/02/07 5:20, Jan Stancek wrote:
> >
> > ----- Original Message -----
> >> Hi Jan, Cyril
> >>
> >> Could you help me review the v5 patch set. Thanks a lot.
> > Looks good to me - I didn't have a chance to test it though.
> >
> > Regards,
> > Jan
> >
> >> Thanks,
> >> Xiao Yang
> >> On 2018/01/05 10:48, xiao yang wrote:
> >>> The bug has been fixed in kernel:
> >>> '4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
> >>>
> >>> Signed-off-by: xiao yang<yangx.jy@cn.fujitsu.com>
> >>> ---
> >>> runtest/syscalls | 1 +
> >>> testcases/kernel/syscalls/.gitignore | 1 +
> >>> .../syscalls/migrate_pages/migrate_pages03.c | 151
> >>> +++++++++++++++++++++
> >>> 3 files changed, 153 insertions(+)
> >>> create mode 100644
> >>> testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
> >>>
> >>> diff --git a/runtest/syscalls b/runtest/syscalls
> >>> index 97fc643..ee8850f 100644
> >>> --- a/runtest/syscalls
> >>> +++ b/runtest/syscalls
> >>> @@ -587,6 +587,7 @@ memcpy01 memcpy01
> >>>
> >>> migrate_pages01 migrate_pages01
> >>> migrate_pages02 migrate_pages02
> >>> +migrate_pages03 migrate_pages03
> >>>
> >>> mlockall01 mlockall01
> >>> mlockall02 mlockall02
> >>> diff --git a/testcases/kernel/syscalls/.gitignore
> >>> b/testcases/kernel/syscalls/.gitignore
> >>> index 12a136e..27e30b2 100644
> >>> --- a/testcases/kernel/syscalls/.gitignore
> >>> +++ b/testcases/kernel/syscalls/.gitignore
> >>> @@ -538,6 +538,7 @@
> >>> /memset/memset01
> >>> /migrate_pages/migrate_pages01
> >>> /migrate_pages/migrate_pages02
> >>> +/migrate_pages/migrate_pages03
> >>> /mincore/mincore01
> >>> /mincore/mincore02
> >>> /mkdir/mkdir01
> >>> diff --git a/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
> >>> b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
> >>> new file mode 100644
> >>> index 0000000..ecfc552
> >>> --- /dev/null
> >>> +++ b/testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
> >>> @@ -0,0 +1,151 @@
> >>> +/*
> >>> + * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
> >>> + * Author(s): Xiao Yang<yangx.jy@cn.fujitsu.com>
> >>> + * Jie Fei<feij.fnst@cn.fujitsu.com>
> >>> + *
> >>> + * 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.
> >>> + *
> >>> + * You should have received a copy of the GNU General Public License
> >>> + * along with this program, if not, see<http://www.gnu.org/licenses/>.
> >>> + */
> >>> +
> >>> +/*
> >>> + * Description:
> >>> + * This is a regression test for ksm page migration which is
> >>> miscalculated.
> >>> + *
> >>> + * The kernel bug has been fixed by:
> >>> + *
> >>> + * commit 4b0ece6fa0167b22c004ff69e137dc94ee2e469e
> >>> + * Author: Naoya Horiguchi<n-horiguchi@ah.jp.nec.com>
> >>> + * Date: Fri Mar 31 15:11:44 2017 -0700
> >>> + *
> >>> + * mm: migrate: fix remove_migration_pte() for ksm pages
> >>> + */
> >>> +
> >>> +#include<errno.h>
> >>> +#include<unistd.h>
> >>> +#include<stdlib.h>
> >>> +
> >>> +#include "tst_test.h"
> >>> +#include "lapi/syscalls.h"
> >>> +#include "lapi/mmap.h"
> >>> +#include "ksm_helper.h"
> >>> +#include "numa_helper.h"
> >>> +#include "migrate_pages_common.h"
> >>> +
> >>> +#ifdef HAVE_NUMA_V2
> >>> +#define N_PAGES 20
> >>> +#define N_LOOPS 600
> >>> +#define TEST_NODES 2
> >>> +
> >>> +static int orig_ksm_run = -1;
> >>> +static unsigned int page_size;
> >>> +static void *test_pages[N_PAGES];
> >>> +static int num_nodes, max_node;
> >>> +static int *nodes;
> >>> +static unsigned long *new_nodes[2];
> >>> +
> >>> +static void setup(void)
> >>> +{
> >>> + int n;
> >>> + unsigned long nodemask_size;
> >>> +
> >>> + if (access(PATH_KSM, F_OK))
> >>> + tst_brk(TCONF, "KSM configuration was not enabled");
> >>> +
> >>> + if (get_allowed_nodes_arr(NH_MEMS,&num_nodes,&nodes)< 0)
> >>> + tst_brk(TBROK | TERRNO, "get_allowed_nodes() failed");
> >>> +
> >>> + if (num_nodes< TEST_NODES) {
> >>> + tst_brk(TCONF, "requires NUMA with at least %d node",
> >>> + TEST_NODES);
> >>> + }
> >>> +
> >>> + max_node = LTP_ALIGN(get_max_node(), sizeof(unsigned long) * 8);
> >>> + nodemask_size = max_node / 8;
> >>> + new_nodes[0] = SAFE_MALLOC(nodemask_size);
> >>> + new_nodes[1] = SAFE_MALLOC(nodemask_size);
> >>> + memset(new_nodes[0], 0, nodemask_size);
> >>> + memset(new_nodes[1], 0, nodemask_size);
> >>> + set_bit(new_nodes[0], nodes[0], 1);
> >>> + set_bit(new_nodes[1], nodes[1], 1);
> >>> +
> >>> + page_size = getpagesize();
> >>> +
> >>> + for (n = 0; n< N_PAGES; n++) {
> >>> + test_pages[n] = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE |
> >>> PROT_EXEC,
> >>> + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
> >>> + if (madvise(test_pages[n], page_size, MADV_MERGEABLE)) {
> >>> + if (errno == EINVAL) {
> >>> + tst_brk(TCONF | TERRNO, "madvise() didn't "
> >>> + "support MADV_MERGEABLE");
> >>> + }
> >>> +
> >>> + tst_brk(TBROK | TERRNO,
> >>> + "madvise(MADV_MERGEABLE) failed");
> >>> + }
> >>> +
> >>> + if (mbind(test_pages[n], page_size, MPOL_BIND, new_nodes[0],
> >>> + max_node, 0))
> >>> + tst_brk(TBROK | TERRNO, "mbind(MPOL_BIND) failed");
> >>> +
> >>> + memset(test_pages[n], 0, page_size);
> >>> + }
> >>> +
> >>> + SAFE_FILE_SCANF(PATH_KSM "run", "%d",&orig_ksm_run);
> >>> + SAFE_FILE_PRINTF(PATH_KSM "run", "%d", 1);
> >>> + wait_ksmd_full_scan();
> >>> +}
> >>> +
> >>> +static void cleanup(void)
> >>> +{
> >>> + int n;
> >>> +
> >>> + for (n = 0; n< N_PAGES; n++) {
> >>> + if (test_pages[n])
> >>> + SAFE_MUNMAP(test_pages[n], page_size);
> >>> + }
> >>> +
> >>> + free(new_nodes[0]);
> >>> + free(new_nodes[1]);
> >>> +
> >>> + if (orig_ksm_run != -1)
> >>> + SAFE_FILE_PRINTF(PATH_KSM "run", "%d", orig_ksm_run);
> >>> +}
> >>> +
> >>> +static void migrate_test(void)
> >>> +{
> >>> + int loop, i, ret;
> >>> +
> >>> + for (loop = 0; loop< N_LOOPS; loop++) {
> >>> + i = loop % 2;
> >>> + ret = tst_syscall(__NR_migrate_pages, 0, max_node,
> >>> + new_nodes[i], new_nodes[i ? 0 : 1]);
> >>> + if (ret< 0) {
> >>> + tst_res(TFAIL | TERRNO, "migrate_pages() failed");
> >>> + return;
> >>> + }
> >>> + }
> >>> +
> >>> + tst_res(TPASS, "migrate_pages() passed");
> >>> +}
> >>> +
> >>> +static struct tst_test test = {
> >>> + .min_kver = "2.6.32",
> >>> + .needs_root = 1,
> >>> + .setup = setup,
> >>> + .cleanup = cleanup,
> >>> + .test_all = migrate_test,
> >>> +};
> >>> +
> >>> +#else
> >>> + TST_TEST_TCONF("require libnuma>= 2 and it's development packages");
> >>> +#endif
> >>
> >>
> >>
> >
> > .
> >
>
>
>
>
^ permalink raw reply [flat|nested] 24+ messages in thread
end of thread, other threads:[~2018-05-16 8:48 UTC | newest]
Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-28 10:07 [LTP] [PATCH] syscalls/migrate_pages03.c: Add new regression test Xiao Yang
2017-11-30 15:20 ` Cyril Hrubis
2017-12-21 10:03 ` [LTP] [PATCH v2] " Xiao Yang
2017-12-25 10:26 ` Xiao Yang
2017-12-25 10:37 ` xiao yang
2018-01-03 12:04 ` Jan Stancek
2018-01-03 14:38 ` Cyril Hrubis
2018-01-04 9:26 ` [LTP] [PATCH v3 1/2] lib/mem.c: factor out wait_ksmd_full_scan() xiao yang
2018-01-04 9:26 ` [LTP] [PATCH v3 2/2] syscalls/migrate_pages03.c: Add new regression test xiao yang
2018-01-04 9:34 ` [LTP] [PATCH v3 1/2] lib/mem.c: factor out wait_ksmd_full_scan() Xiao Yang
2018-01-04 9:44 ` [LTP] [PATCH v4 " xiao yang
2018-01-04 9:44 ` [LTP] [PATCH v4 2/2] syscalls/migrate_pages03.c: Add new regression test xiao yang
2018-01-04 15:30 ` Cyril Hrubis
2018-01-05 1:51 ` Xiao Yang
2018-01-05 2:48 ` [LTP] [PATCH v5 1/3] lib/mem.c: factor out wait_ksmd_full_scan() xiao yang
2018-01-05 2:48 ` [LTP] [PATCH v5 2/3] syscalls/migrate_pages*: Small cleanup xiao yang
2018-02-07 16:22 ` Cyril Hrubis
2018-01-05 2:48 ` [LTP] [PATCH v5 3/3] syscalls/migrate_pages03.c: Add new regression test xiao yang
2018-01-19 1:51 ` Xiao Yang
2018-02-02 8:11 ` Xiao Yang
2018-02-06 21:20 ` Jan Stancek
2018-05-15 8:30 ` Xiao Yang
2018-05-16 8:48 ` Jan Stancek
2018-03-20 9:18 ` Xiao Yang
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.