From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Stancek Date: Wed, 16 May 2018 04:48:58 -0400 (EDT) Subject: [LTP] [PATCH v5 3/3] syscalls/migrate_pages03.c: Add new regression test In-Reply-To: <5AFA9A99.8090509@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> <929250250.523494.1517952047314.JavaMail.zimbra@redhat.com> <5AFA9A99.8090509@cn.fujitsu.com> Message-ID: <1248273908.19613427.1526460538191.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 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 > >>> --- > >>> 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 > >> > >> > >> > > > > . > > > > > >