* [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 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 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 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
* [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
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.