From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Stancek Date: Tue, 6 Feb 2018 16:20:47 -0500 (EST) Subject: [LTP] [PATCH v5 3/3] syscalls/migrate_pages03.c: Add new regression test In-Reply-To: <5A741D46.20002@cn.fujitsu.com> References: <20180104153045.GA25335@rei> <1515120532-4372-1-git-send-email-yangx.jy@cn.fujitsu.com> <1515120532-4372-3-git-send-email-yangx.jy@cn.fujitsu.com> <5A741D46.20002@cn.fujitsu.com> Message-ID: <929250250.523494.1517952047314.JavaMail.zimbra@redhat.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: ltp@lists.linux.it ----- 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 > > --- > > 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 > > + * Jie Fei > > + * > > + * 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 . > > + */ > > + > > +/* > > + * 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 > > + * Date: Fri Mar 31 15:11:44 2017 -0700 > > + * > > + * mm: migrate: fix remove_migration_pte() for ksm pages > > + */ > > + > > +#include > > +#include > > +#include > > + > > +#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 > > > >