All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.