Skip to contentSkip to conversation

syscalls/migrate_pages03.c: Add new regression test

PATCH Superseded Xiao Yang 3 participants 24 messages Nov 28, 2017 – May 16, 2018

lore
Share & tools
lore

Xiao Yang

author
#0 lore raw

PATCH 1/1 syscalls/migrate_pages03.c: Add new regression test

The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'

---
 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
runtest/syscalls +1 -0
index 14089ac..51885d4 100644
@@ -587,6 +587,7 @@ memcpy01 memcpy01
 
 migrate_pages01 migrate_pages01
 migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
 
 mlockall01 mlockall01
 mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
index 12a136e..27e30b2 100644
@@ -538,6 +538,7 @@
 /memset/memset01
 /migrate_pages/migrate_pages01
 /migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
 /mincore/mincore01
 /mincore/mincore02
 /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +176 -0

176 lines not on this page · raw message

Signature · 1 line
1.8.3.1
#1 lore raw

PATCH 1/1 syscalls/migrate_pages03.c: Add new regression test

Hi!

Quoted 8 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +8 -0
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#if HAVE_NUMA_H
+#include <numa.h>
+#endif
+#if HAVE_NUMAIF_H
+#include <numaif.h>

testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 50

Quoted 10 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +10 -0
+#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.

Quoted 11 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +11 -0
+
+#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;

testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 71

Quoted 10 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +10 -0
+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();

Quoted 7 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +7 -0
+		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)

testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 88

Quoted 10 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +10 -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.

testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 96

Quoted 7 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +7 -0
+	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?

testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 99

Quoted 3 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +3 -0
+		if (madvise(test_pages[n], page_size, MADV_MERGEABLE)) {
+			if (errno == EINVAL) {
+				tst_brk(TCONF, "madvise() didn't support "

^ | TERRNO here please

Quoted 25 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +25 -0
+					"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;

testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 134

Quoted 10 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +10 -0
+	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.

Quoted 50 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +42 -0
+	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
Signature · 7 lines
1.8.3.1




-- 
Mailing list info: https://lists.linux.it/listinfo/ltp
Signature · 2 lines
Cyril Hrubis
[email protected]
author
#2 lore raw

PATCH v2 1/1 syscalls/migrate_pages03.c: Add new regression test

The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'

---
 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
runtest/syscalls +1 -0
index 97fc643..ee8850f 100644
@@ -587,6 +587,7 @@ memcpy01 memcpy01
 
 migrate_pages01 migrate_pages01
 migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
 
 mlockall01 mlockall01
 mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
index 12a136e..27e30b2 100644
@@ -538,6 +538,7 @@
 /memset/memset01
 /migrate_pages/migrate_pages01
 /migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
 /mincore/mincore01
 /mincore/mincore02
 /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +156 -0

156 lines not on this page · raw message

Signature · 1 line
1.8.3.1
author
#3 lore raw

PATCH v2 1/1 syscalls/migrate_pages03.c: Add new regression test

Hi,

I find there is something wrong with this patch. So please ignore it, and i will resend v2 patch.

Thanks,
Xiao Yang.

Quoted 197 lines · Xiao Yang

The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'

---
 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
runtest/syscalls +1 -0
index 97fc643..ee8850f 100644
@@ -587,6 +587,7 @@ memcpy01 memcpy01
 
 migrate_pages01 migrate_pages01
 migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
 
 mlockall01 mlockall01
 mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
index 12a136e..27e30b2 100644
@@ -538,6 +538,7 @@
 /memset/memset01
 /migrate_pages/migrate_pages01
 /migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
 /mincore/mincore01
 /mincore/mincore02
 /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +156 -0
new file mode 100644
index 0000000..f3c0c7d
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <[email protected]>
+ *            Jie Fei <[email protected]>
+ *
+ * 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 <[email protected]>
+ * 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
author
#4 lore raw

PATCH v2 1/1 syscalls/migrate_pages03.c: Add new regression test

In reply to Cyril Hrubis

The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'

---
 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
runtest/syscalls +1 -0
index 97fc643..ee8850f 100644
@@ -587,6 +587,7 @@ memcpy01 memcpy01
 
 migrate_pages01 migrate_pages01
 migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
 
 mlockall01 mlockall01
 mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
index 12a136e..27e30b2 100644
@@ -538,6 +538,7 @@
 /memset/memset01
 /migrate_pages/migrate_pages01
 /migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
 /mincore/mincore01
 /mincore/mincore02
 /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +175 -0

175 lines not on this page · raw message

Signature · 1 line
1.8.3.1
#5 lore raw

PATCH v2 1/1 syscalls/migrate_pages03.c: Add new regression test

----- Original Message -----

Quoted 4 lines

The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'

Looks good to me.

Regards,
Jan

#6 lore raw

PATCH v2 1/1 syscalls/migrate_pages03.c: Add new regression test

In reply to xiao yang

Hi!

Quoted 6 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +6 -0
+/* 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;
+

testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 78

Quoted 10 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +10 -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.

Signature · 2 lines
Cyril Hrubis
[email protected]
author
#7 lore raw

PATCH v3 1/2 lib/mem.c: factor out wait_ksmd_full_scan()

Move common wait_ksmd_full_scan() to kernel/lib/ksm_helper.c and create accompanying kernel/include/ksm_helper.h.

---
 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
testcases/kernel/include/ksm_helper.h new file +26 -0
new file mode 100644
index 0000000..0b35218
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <[email protected]>
+ *
+ * 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 */
testcases/kernel/lib/ksm_helper.c new file +49 -0

49 lines not on this page · raw message

testcases/kernel/mem/lib/mem.c +1 -27
index 7f2099b..4275f63 100644
@@ -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)
Signature · 1 line
1.8.3.1
author
#8 lore raw

PATCH v3 1/2 lib/mem.c: factor out wait_ksmd_full_scan()

Hi,

Sorry, there is duplicate code with this patch set. So please ignore it.

Thanks,
Xiao Yang

Quoted 145 lines · xiao yang

Move common wait_ksmd_full_scan() to kernel/lib/ksm_helper.c and create accompanying kernel/include/ksm_helper.h.

---
 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
testcases/kernel/include/ksm_helper.h new file +26 -0
new file mode 100644
index 0000000..0b35218
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <[email protected]>
+ *
+ * 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 */
testcases/kernel/lib/ksm_helper.c new file +49 -0
new file mode 100644
index 0000000..eba28d4
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <[email protected]>
+ *
+ * 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);
+}
testcases/kernel/mem/lib/mem.c +1 -27
index 7f2099b..4275f63 100644
@@ -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)
author
#9 lore raw

PATCH v3 2/2 syscalls/migrate_pages03.c: Add new regression test

In reply to xiao yang

The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'

---
 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
runtest/syscalls +1 -0
index 97fc643..ee8850f 100644
@@ -587,6 +587,7 @@ memcpy01 memcpy01
 
 migrate_pages01 migrate_pages01
 migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
 
 mlockall01 mlockall01
 mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
index 12a136e..27e30b2 100644
@@ -538,6 +538,7 @@
 /memset/memset01
 /migrate_pages/migrate_pages01
 /migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
 /mincore/mincore01
 /mincore/mincore02
 /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +158 -0

158 lines not on this page · raw message

Signature · 1 line
1.8.3.1
author
#10 lore raw

PATCH v4 1/2 lib/mem.c: factor out wait_ksmd_full_scan()

In reply to Cyril Hrubis

Move common wait_ksmd_full_scan() to kernel/lib/ksm_helper.c and create accompanying kernel/include/ksm_helper.h.

---
 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
testcases/kernel/include/ksm_helper.h new file +26 -0
new file mode 100644
index 0000000..0b35218
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <[email protected]>
+ *
+ * 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 */
testcases/kernel/lib/ksm_helper.c new file +49 -0

49 lines not on this page · raw message

testcases/kernel/mem/include/mem.h +1 -2
index 95d0bda..f7682f9 100644
@@ -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);
testcases/kernel/mem/lib/mem.c +0 -27
index 7f2099b..59138a0 100644
@@ -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)
Signature · 1 line
1.8.3.1
author
#11 lore raw

PATCH v4 2/2 syscalls/migrate_pages03.c: Add new regression test

The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'

---
 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
runtest/syscalls +1 -0
index 97fc643..ee8850f 100644
@@ -587,6 +587,7 @@ memcpy01 memcpy01
 
 migrate_pages01 migrate_pages01
 migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
 
 mlockall01 mlockall01
 mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
index 12a136e..27e30b2 100644
@@ -538,6 +538,7 @@
 /memset/memset01
 /migrate_pages/migrate_pages01
 /migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
 /mincore/mincore01
 /mincore/mincore02
 /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +158 -0

158 lines not on this page · raw message

Signature · 1 line
1.8.3.1
#12 lore raw

PATCH v4 2/2 syscalls/migrate_pages03.c: Add new regression test

Hi!

testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 43

Quoted 11 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +11 -0
+#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.

Signature · 2 lines
Cyril Hrubis
[email protected]
author
#13 lore raw

PATCH v4 2/2 syscalls/migrate_pages03.c: Add new regression test

Quoted 16 lines · Cyril Hrubis

Hi!

testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 43

Quoted 11 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +11 -0
+#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.

Quoted 1 line

Also it's customary to use #ifdef instead of #if for autoconf macros.

Agreed.

Thanks,
Xiao Yang

author
#14 lore raw

PATCH v5 1/3 lib/mem.c: factor out wait_ksmd_full_scan()

In reply to Cyril Hrubis

Move common wait_ksmd_full_scan() to kernel/lib/ksm_helper.c and create accompanying kernel/include/ksm_helper.h.

---
 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
testcases/kernel/include/ksm_helper.h new file +26 -0
new file mode 100644
index 0000000..0b35218
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <[email protected]>
+ *
+ * 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 */
testcases/kernel/lib/ksm_helper.c new file +49 -0

49 lines not on this page · raw message

testcases/kernel/mem/include/mem.h +1 -2
index 95d0bda..f7682f9 100644
@@ -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);
testcases/kernel/mem/lib/mem.c +0 -27
index 7f2099b..59138a0 100644
@@ -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)
Signature · 1 line
1.8.3.1
author
#15 lore raw

PATCH v5 2/3 syscalls/migrate_pages*: Small cleanup

1) Remove unused code
2) Use #ifdef instead of #if

---
 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(-)
testcases/kernel/include/numa_helper.h +4 -4
index 39cf7aa..ed45ec8 100644
@@ -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)
testcases/kernel/syscalls/migrate_pages/migrate_pages01.c +2 -8
index 01409f3..7cdcb31 100644
@@ -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;
testcases/kernel/syscalls/migrate_pages/migrate_pages02.c +1 -8
index faf96b6..800b575 100644
@@ -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;
Signature · 1 line
1.8.3.1
#16 lore raw

PATCH v5 2/3 syscalls/migrate_pages*: Small cleanup

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.

Signature · 2 lines
Cyril Hrubis
[email protected]
author
#17 lore raw

PATCH v5 3/3 syscalls/migrate_pages03.c: Add new regression test

In reply to xiao yang

The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'

---
 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
runtest/syscalls +1 -0
index 97fc643..ee8850f 100644
@@ -587,6 +587,7 @@ memcpy01 memcpy01
 
 migrate_pages01 migrate_pages01
 migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
 
 mlockall01 mlockall01
 mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
index 12a136e..27e30b2 100644
@@ -538,6 +538,7 @@
 /memset/memset01
 /migrate_pages/migrate_pages01
 /migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
 /mincore/mincore01
 /mincore/mincore02
 /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +151 -0

151 lines not on this page · raw message

Signature · 1 line
1.8.3.1
author
#18 lore raw

PATCH v5 3/3 syscalls/migrate_pages03.c: Add new regression test

Hi,

Ping. Thanks a lot. :-)

Thanks,
Xiao Yang

Quoted 192 lines · xiao yang

The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'

---
 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
runtest/syscalls +1 -0
index 97fc643..ee8850f 100644
@@ -587,6 +587,7 @@ memcpy01 memcpy01
 
 migrate_pages01 migrate_pages01
 migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
 
 mlockall01 mlockall01
 mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
index 12a136e..27e30b2 100644
@@ -538,6 +538,7 @@
 /memset/memset01
 /migrate_pages/migrate_pages01
 /migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
 /mincore/mincore01
 /mincore/mincore02
 /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +151 -0
new file mode 100644
index 0000000..ecfc552
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <[email protected]>
+ *            Jie Fei <[email protected]>
+ *
+ * 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 <[email protected]>
+ * 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
author
#19 lore raw

PATCH v5 3/3 syscalls/migrate_pages03.c: Add new regression test

In reply to xiao yang

Hi Jan, Cyril

Could you help me review the v5 patch set. Thanks a lot.

Thanks,
Xiao Yang

Quoted 192 lines · xiao yang

The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'

---
 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
runtest/syscalls +1 -0
index 97fc643..ee8850f 100644
@@ -587,6 +587,7 @@ memcpy01 memcpy01
 
 migrate_pages01 migrate_pages01
 migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
 
 mlockall01 mlockall01
 mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
index 12a136e..27e30b2 100644
@@ -538,6 +538,7 @@
 /memset/memset01
 /migrate_pages/migrate_pages01
 /migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
 /mincore/mincore01
 /mincore/mincore02
 /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +151 -0
new file mode 100644
index 0000000..ecfc552
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <[email protected]>
+ *            Jie Fei <[email protected]>
+ *
+ * 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 <[email protected]>
+ * 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
#20 lore raw

PATCH v5 3/3 syscalls/migrate_pages03.c: Add new regression test

----- Original Message -----

Quoted 3 lines

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

Quoted 206 lines

Thanks,
Xiao Yang

Quoted 198 lines · xiao yang

The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'

---
 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

runtest/syscalls +1 -0
index 97fc643..ee8850f 100644
@@ -587,6 +587,7 @@ memcpy01 memcpy01
 
 migrate_pages01 migrate_pages01
 migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
 
 mlockall01 mlockall01
 mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
index 12a136e..27e30b2 100644
@@ -538,6 +538,7 @@
 /memset/memset01
 /migrate_pages/migrate_pages01
 /migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
 /mincore/mincore01
 /mincore/mincore02
 /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +22 -0
new file mode 100644
index 0000000..ecfc552
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <[email protected]>
+ *            Jie Fei <[email protected]>
+ *
+ * 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 <[email protected]>
+ * Date: Fri Mar 31 15:11:44 2017 -0700
+ *
+ * mm: migrate: fix remove_migration_pte() for ksm pages
+ */

testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +53 -0
+
+#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,

testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +67 -0
+					  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
author
#21 lore raw

PATCH v5 3/3 syscalls/migrate_pages03.c: Add new regression test

Hi, Jan and Cyril,

Could you help me push the v5 patch ? Thanks a lot. :-)

Best Regards,
Xiao Yang

Quoted 217 lines · Jan Stancek

----- Original Message -----

Quoted 3 lines

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

Quoted 193 lines

Thanks,
Xiao Yang

Quoted 190 lines · xiao yang

The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'

---
  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

runtest/syscalls +1 -0
index 97fc643..ee8850f 100644
@@ -587,6 +587,7 @@ memcpy01 memcpy01
 
  migrate_pages01 migrate_pages01
  migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
 
  mlockall01 mlockall01
  mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
index 12a136e..27e30b2 100644
@@ -538,6 +538,7 @@
  /memset/memset01
  /migrate_pages/migrate_pages01
  /migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
  /mincore/mincore01
  /mincore/mincore02
  /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +22 -0
new file mode 100644
index 0000000..ecfc552
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang<[email protected]>
+ *            Jie Fei<[email protected]>
+ *
+ * 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<[email protected]>
+ * Date: Fri Mar 31 15:11:44 2017 -0700
+ *
+ * mm: migrate: fix remove_migration_pte() for ksm pages
+ */

testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +53 -0
+
+#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,

testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +59 -0
+					  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,
Quoted 11 lines

testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 151

Quoted 8 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +8 -0
+	.setup = setup,
+	.cleanup = cleanup,
+	.test_all = migrate_test,
+};
+
+#else
+	TST_TEST_TCONF("require libnuma>= 2 and it's development packages");
+#endif

.

#22 lore raw

PATCH v5 3/3 syscalls/migrate_pages03.c: Add new regression test

----- Original Message -----

Quoted 3 lines

Hi, Jan and Cyril,

Could you help me push the v5 patch ? Thanks a lot. :-)

Rebased and pushed.

Regards,
Jan

Quoted 225 lines

Best Regards,
Xiao Yang

Quoted 217 lines · Jan Stancek

----- Original Message -----

Quoted 3 lines

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

Quoted 193 lines

Thanks,
Xiao Yang

Quoted 190 lines · xiao yang

The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'

---
  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

runtest/syscalls +1 -0
index 97fc643..ee8850f 100644
@@ -587,6 +587,7 @@ memcpy01 memcpy01
 
  migrate_pages01 migrate_pages01
  migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
 
  mlockall01 mlockall01
  mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
index 12a136e..27e30b2 100644
@@ -538,6 +538,7 @@
  /memset/memset01
  /migrate_pages/migrate_pages01
  /migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
  /mincore/mincore01
  /mincore/mincore02
  /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +22 -0
new file mode 100644
index 0000000..ecfc552
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang<[email protected]>
+ *            Jie Fei<[email protected]>
+ *
+ * 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<[email protected]>
+ * Date: Fri Mar 31 15:11:44 2017 -0700
+ *
+ * mm: migrate: fix remove_migration_pte() for ksm pages
+ */

testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +53 -0
+
+#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,

testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +59 -0
+					  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,
Quoted 11 lines

testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 151

Quoted 8 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +8 -0
+	.setup = setup,
+	.cleanup = cleanup,
+	.test_all = migrate_test,
+};
+
+#else
+	TST_TEST_TCONF("require libnuma>= 2 and it's development packages");
+#endif

.

author
#23 lore raw

PATCH v5 3/3 syscalls/migrate_pages03.c: Add new regression test

In reply to xiao yang

Hi,

Ping :-)

Thanks,
Xiao Yang

Quoted 192 lines · xiao yang

The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'

---
 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
runtest/syscalls +1 -0
index 97fc643..ee8850f 100644
@@ -587,6 +587,7 @@ memcpy01 memcpy01
 
 migrate_pages01 migrate_pages01
 migrate_pages02 migrate_pages02
+migrate_pages03 migrate_pages03
 
 mlockall01 mlockall01
 mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
index 12a136e..27e30b2 100644
@@ -538,6 +538,7 @@
 /memset/memset01
 /migrate_pages/migrate_pages01
 /migrate_pages/migrate_pages02
+/migrate_pages/migrate_pages03
 /mincore/mincore01
 /mincore/mincore02
 /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +151 -0
new file mode 100644
index 0000000..ecfc552
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
+ * Author(s): Xiao Yang <[email protected]>
+ *            Jie Fei <[email protected]>
+ *
+ * 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 <[email protected]>
+ * 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