From mboxrd@z Thu Jan 1 00:00:00 1970 From: Xiao Yang Date: Tue, 15 May 2018 16:30:17 +0800 Subject: [LTP] [PATCH v5 3/3] syscalls/migrate_pages03.c: Add new regression test In-Reply-To: <929250250.523494.1517952047314.JavaMail.zimbra@redhat.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> Message-ID: <5AFA9A99.8090509@cn.fujitsu.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: ltp@lists.linux.it 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 >>> --- >>> 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 >> >> >> > > . >