syscalls/migrate_pages03.c: Add new regression test
PATCH 1/1 syscalls/migrate_pages03.c: Add new regression test
The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
--- runtest/syscalls | 1 + testcases/kernel/syscalls/.gitignore | 1 + .../syscalls/migrate_pages/migrate_pages03.c | 176 +++++++++++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
runtest/syscalls +1 -0
@@ -587,6 +587,7 @@ memcpy01 memcpy01 migrate_pages01 migrate_pages01 migrate_pages02 migrate_pages02 +migrate_pages03 migrate_pages03 mlockall01 mlockall01 mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
@@ -538,6 +538,7 @@ /memset/memset01 /migrate_pages/migrate_pages01 /migrate_pages/migrate_pages02 +/migrate_pages/migrate_pages03 /mincore/mincore01 /mincore/mincore02 /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +176 -0
176 lines not on this page · raw message
Signature · 1 line
1.8.3.1
PATCH 1/1 syscalls/migrate_pages03.c: Add new regression test
Hi!
Quoted 8 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +8
-0+#include <errno.h> +#include <unistd.h> +#include <stdlib.h> +#if HAVE_NUMA_H +#include <numa.h> +#endif +#if HAVE_NUMAIF_H +#include <numaif.h>
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 50
Quoted 10 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +10
-0+#endif + +#include "config.h" +#include "lapi/syscalls.h" +#include "lapi/mmap.h" +#include "tst_test.h" +#include "numa_helper.h" +#include "migrate_pages_common.h" + +#if defined(HAVE_NUMA_V2 ) && defined(__NR_migrate_pages)
^
The lapi/syscalls.h defines fallback for this one, hence this macro is always defined. And the tst_syscall() will just do tst_brk(TCONF, ...) if the syscall number is not defined for a particular arch.
Quoted 11 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +11
-0+ +#define KSM_RUN_PATH "/sys/kernel/mm/ksm/run" +#define N_PAGES 20 +#define N_LOOPS 100 +#define TEST_NODES 2 + +static int orig_ksm_value; +static int restore_ksm_run; +static unsigned int page_size; +static void *test_pages[N_PAGES ]; +static int node1, node2;
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 71
Quoted 10 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +10
-0+static int num_nodes; +static int *nodes; + +static void setup (void ) +{ +int n, ret; + +if (access (KSM_RUN_PATH ,F_OK )) { +tst_brk (TCONF ,"KSM configuration was not enabled" ); + }else {
No need for else branch after tst_brk();
Quoted 7 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +7
-0+SAFE_FILE_SCANF (KSM_RUN_PATH ,"%d" , &orig_ksm_value); + restore_ksm_run =1 ; +SAFE_FILE_PRINTF (KSM_RUN_PATH ,"%d" ,1 ); + } + + ret =get_allowed_nodes_arr (NH_MEMS , &num_nodes, &nodes); +if (ret <0 )
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 88
Quoted 10 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +10
-0+tst_brk (TBROK |TERRNO ,"get_allowed_nodes() failed" ); + +if (num_nodes <TEST_NODES ) { +tst_brk (TCONF ,"requires NUMA with at least %d node" , +TEST_NODES ); + } + + ret =get_allowed_nodes (NH_MEMS ,TEST_NODES , &node1, &node2); +if (ret <0 ) +tst_brk (TBROK |TERRNO ,"get_allowed_nodes() failed" );
We already got array of nodes from the get_allowed_nodes_arr(), we can just use nodes[0] and nodes[1] instead of calling this again.
Or drop the get_allowed_nodes_arr() because get_allowed_nodes() returns negative number if number of nodes was less than count anyway.
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 96
Quoted 7 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +7
-0+ page_size =getpagesize (); + +for (n =0 ; n <N_PAGES ; n++) { + test_pages[n] =SAFE_MMAP (NULL , page_size,PROT_READ |PROT_WRITE |PROT_EXEC , +MAP_PRIVATE |MAP_ANONYMOUS ,-1 ,0 ); +memset (test_pages[n],0 , page_size); + errno =0 ;
Do we really have to reset the errno here?
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 99
Quoted 3 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +3
-0+if (madvise (test_pages[n], page_size,MADV_MERGEABLE )) { +if (errno ==EINVAL ) { + tst_brk(TCONF, "madvise() didn't support "
^ | TERRNO here please
Quoted 25 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +25
-0+ "MADV_MERGEABLE"); + } + +tst_brk (TBROK |TERRNO , +"madvise(MADV_MERGEABLE) failed" ); + } + } +} + +static void cleanup (void ) +{ +int n; + +for (n =0 ; n <N_PAGES ; n++) { +if (test_pages[n]) +SAFE_MUNMAP (test_pages[n], page_size); + } + +if (restore_ksm_run) +SAFE_FILE_PRINTF (KSM_RUN_PATH ,"%d" , orig_ksm_value); +} + +static void migrate_test (void ) +{ +int i, loop, max_node;
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 134
Quoted 10 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +10
-0+int ret1, ret2; +unsigned long *old_nodes, *new_node1, *new_node2; +unsigned long nodemask_size; + + max_node =LTP_ALIGN (get_max_node (),sizeof (unsigned long ) *8 ); + nodemask_size = max_node /8 ; + + old_nodes =SAFE_MALLOC (nodemask_size); + new_node1 =SAFE_MALLOC (nodemask_size); + new_node2 =SAFE_MALLOC (nodemask_size);
I guess that we can allocate and free the nodemasks in the test setup() and cleanup() as well, but that is minor.
Quoted 50 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +42
-0+memset (old_nodes,0 , nodemask_size); +memset (new_node1,0 , nodemask_size); +memset (new_node2,0 , nodemask_size); + +for (i =0 ; i < num_nodes; i++) +set_bit (old_nodes, nodes[i],1 ); +set_bit (new_node1, node1,1 ); +set_bit (new_node2, node2,1 ); + +for (loop =0 ; loop <N_LOOPS ; loop++) { + ret1 =tst_syscall (__NR_migrate_pages,0 , max_node, + old_nodes, new_node1); + ret2 =tst_syscall (__NR_migrate_pages,0 , max_node, + old_nodes, new_node2); +if (ret1 <0 || ret2 <0 ) { +tst_res (TFAIL |TERRNO ,"migrate_pages() failed" ); +free (old_nodes); +free (new_node1); +free (new_node2); +return ; + } + } + +tst_res (TPASS ,"migrate_pages() passed" ); + +free (old_nodes); +free (new_node1); + free(new_node2); +} + +static struct tst_test test = { + .min_kver ="2.6.32" , + .needs_root =1 , + .setup = setup, + .cleanup = cleanup, + .test_all = migrate_test, +}; + +#else +TST_TEST_TCONF ("System doesn't support __NR_migrate_pages or libnuma " +"or libnuma development packages are not available" ); +#endif Signature · 7 lines
1.8.3.1 -- Mailing list info: https://lists.linux.it/listinfo/ltp
Signature · 2 lines
Cyril Hrubis [email protected]
PATCH v2 1/1 syscalls/migrate_pages03.c: Add new regression test
The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
--- runtest/syscalls | 1 + testcases/kernel/syscalls/.gitignore | 1 + .../syscalls/migrate_pages/migrate_pages03.c | 156 +++++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
runtest/syscalls +1 -0
@@ -587,6 +587,7 @@ memcpy01 memcpy01 migrate_pages01 migrate_pages01 migrate_pages02 migrate_pages02 +migrate_pages03 migrate_pages03 mlockall01 mlockall01 mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
@@ -538,6 +538,7 @@ /memset/memset01 /migrate_pages/migrate_pages01 /migrate_pages/migrate_pages02 +/migrate_pages/migrate_pages03 /mincore/mincore01 /mincore/mincore02 /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +156 -0
156 lines not on this page · raw message
Signature · 1 line
1.8.3.1
PATCH v2 1/1 syscalls/migrate_pages03.c: Add new regression test
Hi,
I find there is something wrong with this patch. So please ignore it, and i will resend v2 patch.
Thanks,
Xiao Yang.
Quoted 197 lines · Xiao Yang
The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fixremove_migration_pte()for ksm pages")'Signed-off-by Xiao Yang <[email protected]>--- 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.cruntest/syscalls +1
-0@@ -587,6 +587,7 @@ memcpy01 memcpy01 migrate_pages01 migrate_pages01 migrate_pages02 migrate_pages02 +migrate_pages03 migrate_pages03 mlockall01 mlockall01 mlockall02 mlockall02testcases/kernel/syscalls/.gitignore +1
-0@@ -538,6 +538,7 @@ /memset/memset01 /migrate_pages/migrate_pages01 /migrate_pages/migrate_pages02 +/migrate_pages/migrate_pages03 /mincore/mincore01 /mincore/mincore02 /mkdir/mkdir01testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +156
-0@@ -0,0 +1,156 @@ +/* +* Copyright (c) 2017 FUJITSU LIMITED. All rights reserved. +* Author(s): Xiao Yang <[email protected]> +* Jie Fei <[email protected]> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program, if not, see <http://www.gnu.org/licenses/>. +*/ + +/* +* Description: +* This is a regression test for ksm page migration which is miscalculated. +* +* The kernel bug has been fixed by: +* +* commit 4b0ece6fa0167b22c004ff69e137dc94ee2e469e +* Author: Naoya Horiguchi <[email protected]> +* Date: Fri Mar 31 15:11:44 2017 -0700 +* +* mm: migrate: fix remove_migration_pte() for ksm pages +*/ + +#include <errno.h> +#include <unistd.h> +#include <stdlib.h> +#if HAVE_NUMA_H +#include <numa.h> +#endif +#if HAVE_NUMAIF_H +#include <numaif.h> +#endif + +#include "config.h" +#include "lapi/syscalls.h" +#include "lapi/mmap.h" +#include "tst_test.h" +#include "numa_helper.h" +#include "migrate_pages_common.h" + +#ifdef HAVE_NUMA_V2 +#define KSM_RUN_PATH "/sys/kernel/mm/ksm/run" +#define N_PAGES 20 +#define N_LOOPS 400 +#define TEST_NODES 2 + +static int orig_ksm_run =-1 ; +static unsigned int page_size; +static void *test_pages[N_PAGES ]; +static int num_nodes, max_node; +static int *nodes; +static unsigned long *new_nodes[2 ]; + +static void setup (void ) +{ +int n; +unsigned long nodemask_size; + +if (access (KSM_RUN_PATH ,F_OK )) +tst_brk (TCONF ,"KSM configuration was not enabled" ); + +if (get_allowed_nodes_arr (NH_MEMS , &num_nodes, &nodes) <0 ) +tst_brk (TBROK |TERRNO ,"get_allowed_nodes() failed" ); + +if (num_nodes <TEST_NODES ) { +tst_brk (TCONF ,"requires NUMA with at least %d node" , +TEST_NODES ); + } + + max_node =LTP_ALIGN (get_max_node (),sizeof (unsigned long ) *8 ); + nodemask_size = max_node /8 ; + new_nodes[0 ] =SAFE_MALLOC (nodemask_size); + new_nodes[1 ] =SAFE_MALLOC (nodemask_size); +memset (new_nodes[0 ],0 , nodemask_size); +memset (new_nodes[1 ],0 , nodemask_size); +set_bit (new_nodes[0 ], nodes[0 ],1 ); +set_bit (new_nodes[1 ], nodes[1 ],1 ); + + page_size =getpagesize (); + +for (n =0 ; n <N_PAGES ; n++) { + test_pages[n] =SAFE_MMAP (NULL , page_size,PROT_READ |PROT_WRITE |PROT_EXEC , +MAP_PRIVATE |MAP_ANONYMOUS ,-1 ,0 ); +if (madvise (test_pages[n], page_size,MADV_MERGEABLE )) { +if (errno ==EINVAL ) { +tst_brk (TCONF |TERRNO ,"madvise() didn't support " +"MADV_MERGEABLE" ); + } + +tst_brk (TBROK |TERRNO , +"madvise(MADV_MERGEABLE) failed" ); + } + +if (mbind (test_pages[n], page_size,MPOL_BIND , new_nodes[0 ], max_node,0 )) +tst_brk (TBROK |TERRNO ,"mbind" ); + +memset (test_pages[n],0 , page_size); + } + +SAFE_FILE_SCANF (KSM_RUN_PATH ,"%d" , &orig_ksm_run); +SAFE_FILE_PRINTF (KSM_RUN_PATH ,"%d" ,1 ); +} + +static void cleanup (void ) +{ +int n; + +for (n =0 ; n <N_PAGES ; n++) { +if (test_pages[n]) +SAFE_MUNMAP (test_pages[n], page_size); + } + +free (new_nodes[0 ]); +free (new_nodes[1 ]); + +if (orig_ksm_run !=-1 ) +SAFE_FILE_PRINTF (KSM_RUN_PATH ,"%d" , orig_ksm_run); +} + +static void migrate_test (void ) +{ +int loop, i, ret; + +for (loop =0 ; loop <N_LOOPS ; loop++) { + i = loop %2 ; + ret =tst_syscall (__NR_migrate_pages,0 , max_node, + new_nodes[i], new_nodes[i ?0 :1 ]); +if (ret <0 ) { +tst_res (TFAIL |TERRNO ,"migrate_pages() failed" ); +return ; + } + } + +tst_res (TPASS ,"migrate_pages() passed" ); +} + +static struct tst_test test = { + .min_kver ="2.6.32" , + .needs_root =1 , + .setup = setup, + .cleanup = cleanup, + .test_all = migrate_test, +}; + +#else +TST_TEST_TCONF ("require libnuma >= 2 and it's development packages" ); +#endif
PATCH v2 1/1 syscalls/migrate_pages03.c: Add new regression test
In reply to Cyril HrubisThe bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
--- runtest/syscalls | 1 + testcases/kernel/syscalls/.gitignore | 1 + .../syscalls/migrate_pages/migrate_pages03.c | 175 +++++++++++++++++++++ 3 files changed, 177 insertions(+) create mode 100644 testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
runtest/syscalls +1 -0
@@ -587,6 +587,7 @@ memcpy01 memcpy01 migrate_pages01 migrate_pages01 migrate_pages02 migrate_pages02 +migrate_pages03 migrate_pages03 mlockall01 mlockall01 mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
@@ -538,6 +538,7 @@ /memset/memset01 /migrate_pages/migrate_pages01 /migrate_pages/migrate_pages02 +/migrate_pages/migrate_pages03 /mincore/mincore01 /mincore/mincore02 /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +175 -0
175 lines not on this page · raw message
Signature · 1 line
1.8.3.1
PATCH v2 1/1 syscalls/migrate_pages03.c: Add new regression test
----- Original Message -----
Quoted 4 lines
The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fixremove_migration_pte()for ksm pages")'Signed-off-by xiao yang <[email protected]>
Looks good to me.
Regards,
Jan
PATCH v2 1/1 syscalls/migrate_pages03.c: Add new regression test
In reply to xiao yangHi!
Quoted 6 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +6
-0+/* Wait at least two full scans to guarantee merging */ +static void wait_ksmd_full_scan (void ) +{ +unsigned long exp_scans, get_scans; +int count =0 ; +
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 78
Quoted 10 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +10
-0+SAFE_FILE_SCANF (KSM_PATH "full_scans" ,"%lu" , &get_scans); + exp_scans = get_scans +3 ; +while (get_scans < exp_scans) { +sleep (1 ); + count++; +SAFE_FILE_SCANF (KSM_PATH "full_scans" ,"%lu" , &get_scans); + } + +tst_res (TINFO ,"ksmd takes %ds to run two full scans" , count); +}
I do not like that this piece of code has been copied from the lib/mem.c.
Cleaner solution will move the function to testcases/kernel/lib/ksm.c and create accompanying testcases/kernel/include/ksm.h header so that we can link againts it here and in the ksm testcases as well in order to retain only one copy of the function in the source tree.
Signature · 2 lines
Cyril Hrubis [email protected]
PATCH v3 1/2 lib/mem.c: factor out wait_ksmd_full_scan()
Move common wait_ksmd_full_scan() to kernel/lib/ksm_helper.c and create accompanying kernel/include/ksm_helper.h.
--- testcases/kernel/include/ksm_helper.h | 26 +++++++++++++++++++ testcases/kernel/lib/ksm_helper.c | 49 +++++++++++++++++++++++++++++++++++ testcases/kernel/mem/lib/mem.c | 28 +------------------- 3 files changed, 76 insertions(+), 27 deletions(-) create mode 100644 testcases/kernel/include/ksm_helper.h create mode 100644 testcases/kernel/lib/ksm_helper.c
testcases/kernel/include/ksm_helper.h new file +26 -0
@@ -0,0 +1,26 @@ +/* +* Copyright (c) 2018 FUJITSU LIMITED. All rights reserved. +* Author(s): Xiao Yang <[email protected]> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See +* the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program, if not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef KSM_HELPER_H +#define KSM_HELPER_H + +#define PATH_KSM "/sys/kernel/mm/ksm/" + +void wait_ksmd_full_scan (void ); + +#endif /* KSM_HELPER_H */
testcases/kernel/lib/ksm_helper.c new file +49 -0
49 lines not on this page · raw message
testcases/kernel/mem/lib/mem.c +1 -27
@@ -23,6 +23,7 @@#include <unistd.h> #include "mem.h" +#include "ksm_helper.h" #include "numa_helper.h" /* OOM */
@@ -268,33 +269,6 @@ static void check(char *path, long int value)tst_res (TPASS ,"%s is %ld." , path, actual_val); } -static void wait_ksmd_full_scan (void ) -{ -unsigned long full_scans, at_least_one_full_scan; -int count =0 ; - -SAFE_FILE_SCANF (PATH_KSM "full_scans" ,"%lu" , &full_scans); -/* -* The current scan is already in progress so we can't guarantee that -* the get_user_pages() is called on every existing rmap_item if we -* only waited for the remaining part of the scan. -* -* The actual merging happens after the unstable tree has been built so -* we need to wait at least two full scans to guarantee merging, hence -* wait full_scans to increment by 3 so that at least two full scans -* will run. -*/ - at_least_one_full_scan = full_scans +3 ; -while (full_scans < at_least_one_full_scan) { -sleep (1 ); - count++; -SAFE_FILE_SCANF (PATH_KSM "full_scans" ,"%lu" , &full_scans); - } - -tst_res (TINFO ,"ksm daemon takes %ds to run two full scans" , - count); -} -static void final_group_check (int run,int pages_shared,int pages_sharing,int pages_volatile,int pages_unshared,int sleep_millisecs,int pages_to_scan)
Signature · 1 line
1.8.3.1
PATCH v3 1/2 lib/mem.c: factor out wait_ksmd_full_scan()
Hi,
Sorry, there is duplicate code with this patch set. So please ignore it.
Thanks,
Xiao Yang
Quoted 145 lines · xiao yang
Move common
wait_ksmd_full_scan()tokernel/lib/ksm_helper.cand create accompanyingkernel/include/ksm_helper.h.Signed-off-by xiao yang <[email protected]>--- 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.ctestcases/kernel/include/ksm_helper.h new file +26
-0@@ -0,0 +1,26 @@ +/* +* Copyright (c) 2018 FUJITSU LIMITED. All rights reserved. +* Author(s): Xiao Yang <[email protected]> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See +* the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program, if not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef KSM_HELPER_H +#define KSM_HELPER_H + +#define PATH_KSM "/sys/kernel/mm/ksm/" + +void wait_ksmd_full_scan (void ); + +#endif /* KSM_HELPER_H */ testcases/kernel/lib/ksm_helper.c new file +49
-0@@ -0,0 +1,49 @@ +/* +* Copyright (c) 2018 FUJITSU LIMITED. All rights reserved. +* Author(s): Xiao Yang <[email protected]> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See +* the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program, if not, see <http://www.gnu.org/licenses/>. +*/ + +#define TST_NO_DEFAULT_MAIN + +#include <unistd.h> +#include "tst_test.h" +#include "ksm_helper.h" + +void wait_ksmd_full_scan (void ) +{ +unsigned long full_scans, at_least_one_full_scan; +int count =0 ; + +SAFE_FILE_SCANF (PATH_KSM "full_scans" ,"%lu" , &full_scans); +/* +* The current scan is already in progress so we can't guarantee that +* the get_user_pages() is called on every existing rmap_item if we +* only waited for the remaining part of the scan. +* +* The actual merging happens after the unstable tree has been built so +* we need to wait at least two full scans to guarantee merging, hence +* wait full_scans to increment by 3 so that at least two full scans +* will run. +*/ + at_least_one_full_scan = full_scans +3 ; +while (full_scans < at_least_one_full_scan) { +sleep (1 ); + count++; +SAFE_FILE_SCANF (PATH_KSM "full_scans" ,"%lu" , &full_scans); + } + +tst_res (TINFO ,"ksm daemon takes %ds to run two full scans" , count); +}testcases/kernel/mem/lib/mem.c +1
-27@@ -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)
PATCH v3 2/2 syscalls/migrate_pages03.c: Add new regression test
In reply to xiao yangThe bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
--- runtest/syscalls | 1 + testcases/kernel/syscalls/.gitignore | 1 + .../syscalls/migrate_pages/migrate_pages03.c | 158 +++++++++++++++++++++ 3 files changed, 160 insertions(+) create mode 100644 testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
runtest/syscalls +1 -0
@@ -587,6 +587,7 @@ memcpy01 memcpy01 migrate_pages01 migrate_pages01 migrate_pages02 migrate_pages02 +migrate_pages03 migrate_pages03 mlockall01 mlockall01 mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
@@ -538,6 +538,7 @@ /memset/memset01 /migrate_pages/migrate_pages01 /migrate_pages/migrate_pages02 +/migrate_pages/migrate_pages03 /mincore/mincore01 /mincore/mincore02 /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +158 -0
158 lines not on this page · raw message
Signature · 1 line
1.8.3.1
PATCH v4 1/2 lib/mem.c: factor out wait_ksmd_full_scan()
In reply to Cyril HrubisMove common wait_ksmd_full_scan() to kernel/lib/ksm_helper.c and create accompanying kernel/include/ksm_helper.h.
--- testcases/kernel/include/ksm_helper.h | 26 +++++++++++++++++++ testcases/kernel/lib/ksm_helper.c | 49 +++++++++++++++++++++++++++++++++++ testcases/kernel/mem/include/mem.h | 3 +-- testcases/kernel/mem/lib/mem.c | 27 ------------------- 4 files changed, 76 insertions(+), 29 deletions(-) create mode 100644 testcases/kernel/include/ksm_helper.h create mode 100644 testcases/kernel/lib/ksm_helper.c
testcases/kernel/include/ksm_helper.h new file +26 -0
@@ -0,0 +1,26 @@ +/* +* Copyright (c) 2018 FUJITSU LIMITED. All rights reserved. +* Author(s): Xiao Yang <[email protected]> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See +* the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program, if not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef KSM_HELPER_H +#define KSM_HELPER_H + +#define PATH_KSM "/sys/kernel/mm/ksm/" + +void wait_ksmd_full_scan (void ); + +#endif /* KSM_HELPER_H */
testcases/kernel/lib/ksm_helper.c new file +49 -0
49 lines not on this page · raw message
testcases/kernel/mem/include/mem.h +1 -2
@@ -2,6 +2,7 @@#define _MEM_H#include "config.h" #include "tst_test.h" +#include "ksm_helper.h" #if defined(__powerpc__) || defined(__powerpc64__)#define MAXNODES 256
@@ -42,8 +43,6 @@ void testoom(int mempolicy, int lite, int retcode, int allow_sigkill);/* KSM */ -#define PATH_KSM "/sys/kernel/mm/ksm/" -void create_same_memory (int size,int num,int unit);void save_max_page_sharing (void );void restore_max_page_sharing (void );
testcases/kernel/mem/lib/mem.c +0 -27
@@ -268,33 +268,6 @@ static void check(char *path, long int value)tst_res (TPASS ,"%s is %ld." , path, actual_val); } -static void wait_ksmd_full_scan (void ) -{ -unsigned long full_scans, at_least_one_full_scan; -int count =0 ; - -SAFE_FILE_SCANF (PATH_KSM "full_scans" ,"%lu" , &full_scans); -/* -* The current scan is already in progress so we can't guarantee that -* the get_user_pages() is called on every existing rmap_item if we -* only waited for the remaining part of the scan. -* -* The actual merging happens after the unstable tree has been built so -* we need to wait at least two full scans to guarantee merging, hence -* wait full_scans to increment by 3 so that@least two full scans -* will run. -*/ - at_least_one_full_scan = full_scans +3 ; -while (full_scans < at_least_one_full_scan) { -sleep (1 ); - count++; -SAFE_FILE_SCANF (PATH_KSM "full_scans" ,"%lu" , &full_scans); - } - -tst_res (TINFO ,"ksm daemon takes %ds to run two full scans" , - count); -} -static void final_group_check (int run,int pages_shared,int pages_sharing,int pages_volatile,int pages_unshared,int sleep_millisecs,int pages_to_scan)
Signature · 1 line
1.8.3.1
PATCH v4 2/2 syscalls/migrate_pages03.c: Add new regression test
The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
--- runtest/syscalls | 1 + testcases/kernel/syscalls/.gitignore | 1 + .../syscalls/migrate_pages/migrate_pages03.c | 158 +++++++++++++++++++++ 3 files changed, 160 insertions(+) create mode 100644 testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
runtest/syscalls +1 -0
@@ -587,6 +587,7 @@ memcpy01 memcpy01 migrate_pages01 migrate_pages01 migrate_pages02 migrate_pages02 +migrate_pages03 migrate_pages03 mlockall01 mlockall01 mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
@@ -538,6 +538,7 @@ /memset/memset01 /migrate_pages/migrate_pages01 /migrate_pages/migrate_pages02 +/migrate_pages/migrate_pages03 /mincore/mincore01 /mincore/mincore02 /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +158 -0
158 lines not on this page · raw message
Signature · 1 line
1.8.3.1
PATCH v4 2/2 syscalls/migrate_pages03.c: Add new regression test
Hi!
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 43
Quoted 11 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +11
-0+#include <errno.h> +#include <unistd.h> +#include <stdlib.h> +#if HAVE_NUMA_H +#include <numa.h> +#endif +#if HAVE_NUMAIF_H +#include <numaif.h> +#endif + +#include "config.h"
One small nit, the HAVE_NUMA* macros are defined in config.h so they are defined only after the config.h header is included. I wonder if these haders are needed to be included here at all, because they were not included at all.
Also it's customary to use #ifdef instead of #if for autoconf macros.
Signature · 2 lines
Cyril Hrubis [email protected]
PATCH v4 2/2 syscalls/migrate_pages03.c: Add new regression test
Quoted 16 lines · Cyril Hrubis
Hi!
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 43
Quoted 11 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +11
-0+#include <errno.h> +#include <unistd.h> +#include <stdlib.h> +#if HAVE_NUMA_H +#include <numa.h> +#endif +#if HAVE_NUMAIF_H +#include <numaif.h> +#endif + +#include "config.h" One small nit, the HAVE_NUMA* macros are defined in
config.hso they are defined only after theconfig.hheader is included. I wonder if these haders are needed to be included here at all, because they were not included at all.
Hi Cyril,
These headers has been included in numa_helper.h, so we can remove them.
Quoted 1 line
Also it's customary to use #ifdef instead of #if for autoconf macros.
Agreed.
Thanks,
Xiao Yang
PATCH v5 1/3 lib/mem.c: factor out wait_ksmd_full_scan()
In reply to Cyril HrubisMove common wait_ksmd_full_scan() to kernel/lib/ksm_helper.c and create accompanying kernel/include/ksm_helper.h.
--- testcases/kernel/include/ksm_helper.h | 26 +++++++++++++++++++ testcases/kernel/lib/ksm_helper.c | 49 +++++++++++++++++++++++++++++++++++ testcases/kernel/mem/include/mem.h | 3 +-- testcases/kernel/mem/lib/mem.c | 27 ------------------- 4 files changed, 76 insertions(+), 29 deletions(-) create mode 100644 testcases/kernel/include/ksm_helper.h create mode 100644 testcases/kernel/lib/ksm_helper.c
testcases/kernel/include/ksm_helper.h new file +26 -0
@@ -0,0 +1,26 @@ +/* +* Copyright (c) 2018 FUJITSU LIMITED. All rights reserved. +* Author(s): Xiao Yang <[email protected]> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See +* the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program, if not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef KSM_HELPER_H +#define KSM_HELPER_H + +#define PATH_KSM "/sys/kernel/mm/ksm/" + +void wait_ksmd_full_scan (void ); + +#endif /* KSM_HELPER_H */
testcases/kernel/lib/ksm_helper.c new file +49 -0
49 lines not on this page · raw message
testcases/kernel/mem/include/mem.h +1 -2
@@ -2,6 +2,7 @@#define _MEM_H#include "config.h" #include "tst_test.h" +#include "ksm_helper.h" #if defined(__powerpc__) || defined(__powerpc64__)#define MAXNODES 256
@@ -42,8 +43,6 @@ void testoom(int mempolicy, int lite, int retcode, int allow_sigkill);/* KSM */ -#define PATH_KSM "/sys/kernel/mm/ksm/" -void create_same_memory (int size,int num,int unit);void save_max_page_sharing (void );void restore_max_page_sharing (void );
testcases/kernel/mem/lib/mem.c +0 -27
@@ -268,33 +268,6 @@ static void check(char *path, long int value)tst_res (TPASS ,"%s is %ld." , path, actual_val); } -static void wait_ksmd_full_scan (void ) -{ -unsigned long full_scans, at_least_one_full_scan; -int count =0 ; - -SAFE_FILE_SCANF (PATH_KSM "full_scans" ,"%lu" , &full_scans); -/* -* The current scan is already in progress so we can't guarantee that -* the get_user_pages() is called on every existing rmap_item if we -* only waited for the remaining part of the scan. -* -* The actual merging happens after the unstable tree has been built so -* we need to wait at least two full scans to guarantee merging, hence -* wait full_scans to increment by 3 so that@least two full scans -* will run. -*/ - at_least_one_full_scan = full_scans +3 ; -while (full_scans < at_least_one_full_scan) { -sleep (1 ); - count++; -SAFE_FILE_SCANF (PATH_KSM "full_scans" ,"%lu" , &full_scans); - } - -tst_res (TINFO ,"ksm daemon takes %ds to run two full scans" , - count); -} -static void final_group_check (int run,int pages_shared,int pages_sharing,int pages_volatile,int pages_unshared,int sleep_millisecs,int pages_to_scan)
Signature · 1 line
1.8.3.1
PATCH v5 2/3 syscalls/migrate_pages*: Small cleanup
1) Remove unused code
2) Use #ifdef instead of #if
--- testcases/kernel/include/numa_helper.h | 8 ++++---- testcases/kernel/syscalls/migrate_pages/migrate_pages01.c | 10 ++-------- testcases/kernel/syscalls/migrate_pages/migrate_pages02.c | 9 +-------- 3 files changed, 7 insertions(+), 20 deletions(-)
testcases/kernel/include/numa_helper.h +4 -4
@@ -20,11 +20,11 @@#define NUMA_HELPER_H #include "config.h" -#if HAVE_NUMA_H -#include <numa.h> +#ifdef HAVE_NUMA_H +# include <numa.h> #endif -#if HAVE_NUMAIF_H -#include <numaif.h> +#ifdef HAVE_NUMAIF_H +# include <numaif.h> #endif #define NH_MEMS (1 << 0)
testcases/kernel/syscalls/migrate_pages/migrate_pages01.c +2 -8
@@ -30,18 +30,12 @@#include <sys/wait.h> #include <sys/mman.h> #include <errno.h> -#if HAVE_NUMA_H -#include <numa.h> -#endif -#if HAVE_NUMAIF_H -#include <numaif.h> -#endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pwd.h> -#include "config.h" +#include "test.h" #include "safe_macros.h" #include "lapi/syscalls.h"
@@ -55,7 +49,7 @@ option_t options[] = { {NULL, NULL, NULL} }; -#if defined(HAVE_NUMA_V2 ) && defined(__NR_migrate_pages) +#ifdef HAVE_NUMA_V2 static unsigned long *sane_old_nodes;static unsigned long *sane_new_nodes;
testcases/kernel/syscalls/migrate_pages/migrate_pages02.c +1 -8
@@ -35,18 +35,11 @@#include <sys/wait.h> #include <sys/mman.h> #include <errno.h> -#if HAVE_NUMA_H -#include <numa.h> -#endif -#if HAVE_NUMAIF_H -#include <numaif.h> -#endif #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pwd.h> -#include "config.h" #include "test.h" #include "safe_macros.h" #include "lapi/syscalls.h"
@@ -66,7 +59,7 @@char *TCID ="migrate_pages02" ;int TST_TOTAL =1 ; -#if defined(HAVE_NUMA_V2 ) && defined(__NR_migrate_pages) +#ifdef HAVE_NUMA_V2 static const char nobody_uid[] ="nobody" ;static struct passwd *ltpuser;
Signature · 1 line
1.8.3.1
PATCH v5 2/3 syscalls/migrate_pages*: Small cleanup
Hi!
I've pushed first two patches, so that Petr can rebase his fixes on the top of that and I'm looking at the test now. Thanks.
Signature · 2 lines
Cyril Hrubis [email protected]
PATCH v5 3/3 syscalls/migrate_pages03.c: Add new regression test
In reply to xiao yangThe bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fix remove_migration_pte() for ksm pages")'
--- runtest/syscalls | 1 + testcases/kernel/syscalls/.gitignore | 1 + .../syscalls/migrate_pages/migrate_pages03.c | 151 +++++++++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 testcases/kernel/syscalls/migrate_pages/migrate_pages03.c
runtest/syscalls +1 -0
@@ -587,6 +587,7 @@ memcpy01 memcpy01 migrate_pages01 migrate_pages01 migrate_pages02 migrate_pages02 +migrate_pages03 migrate_pages03 mlockall01 mlockall01 mlockall02 mlockall02
testcases/kernel/syscalls/.gitignore +1 -0
@@ -538,6 +538,7 @@ /memset/memset01 /migrate_pages/migrate_pages01 /migrate_pages/migrate_pages02 +/migrate_pages/migrate_pages03 /mincore/mincore01 /mincore/mincore02 /mkdir/mkdir01
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +151 -0
151 lines not on this page · raw message
Signature · 1 line
1.8.3.1
PATCH v5 3/3 syscalls/migrate_pages03.c: Add new regression test
Hi,
Ping. Thanks a lot. :-)
Thanks,
Xiao Yang
Quoted 192 lines · xiao yang
The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fixremove_migration_pte()for ksm pages")'Signed-off-by xiao yang <[email protected]>--- 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.cruntest/syscalls +1
-0@@ -587,6 +587,7 @@ memcpy01 memcpy01 migrate_pages01 migrate_pages01 migrate_pages02 migrate_pages02 +migrate_pages03 migrate_pages03 mlockall01 mlockall01 mlockall02 mlockall02testcases/kernel/syscalls/.gitignore +1
-0@@ -538,6 +538,7 @@ /memset/memset01 /migrate_pages/migrate_pages01 /migrate_pages/migrate_pages02 +/migrate_pages/migrate_pages03 /mincore/mincore01 /mincore/mincore02 /mkdir/mkdir01testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +151
-0@@ -0,0 +1,151 @@ +/* +* Copyright (c) 2017 FUJITSU LIMITED. All rights reserved. +* Author(s): Xiao Yang <[email protected]> +* Jie Fei <[email protected]> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program, if not, see <http://www.gnu.org/licenses/>. +*/ + +/* +* Description: +* This is a regression test for ksm page migration which is miscalculated. +* +* The kernel bug has been fixed by: +* +* commit 4b0ece6fa0167b22c004ff69e137dc94ee2e469e +* Author: Naoya Horiguchi <[email protected]> +* Date: Fri Mar 31 15:11:44 2017 -0700 +* +* mm: migrate: fix remove_migration_pte() for ksm pages +*/ + +#include <errno.h> +#include <unistd.h> +#include <stdlib.h> + +#include "tst_test.h" +#include "lapi/syscalls.h" +#include "lapi/mmap.h" +#include "ksm_helper.h" +#include "numa_helper.h" +#include "migrate_pages_common.h" + +#ifdef HAVE_NUMA_V2 +#define N_PAGES 20 +#define N_LOOPS 600 +#define TEST_NODES 2 + +static int orig_ksm_run =-1 ; +static unsigned int page_size; +static void *test_pages[N_PAGES ]; +static int num_nodes, max_node; +static int *nodes; +static unsigned long *new_nodes[2 ]; + +static void setup (void ) +{ +int n; +unsigned long nodemask_size; + +if (access (PATH_KSM ,F_OK )) +tst_brk (TCONF ,"KSM configuration was not enabled" ); + +if (get_allowed_nodes_arr (NH_MEMS , &num_nodes, &nodes) <0 ) +tst_brk (TBROK |TERRNO ,"get_allowed_nodes() failed" ); + +if (num_nodes <TEST_NODES ) { +tst_brk (TCONF ,"requires NUMA with at least %d node" , +TEST_NODES ); + } + + max_node =LTP_ALIGN (get_max_node (),sizeof (unsigned long ) *8 ); + nodemask_size = max_node /8 ; + new_nodes[0 ] =SAFE_MALLOC (nodemask_size); + new_nodes[1 ] =SAFE_MALLOC (nodemask_size); +memset (new_nodes[0 ],0 , nodemask_size); +memset (new_nodes[1 ],0 , nodemask_size); +set_bit (new_nodes[0 ], nodes[0 ],1 ); +set_bit (new_nodes[1 ], nodes[1 ],1 ); + + page_size =getpagesize (); + +for (n =0 ; n <N_PAGES ; n++) { + test_pages[n] =SAFE_MMAP (NULL , page_size,PROT_READ |PROT_WRITE |PROT_EXEC , +MAP_PRIVATE |MAP_ANONYMOUS ,-1 ,0 ); +if (madvise (test_pages[n], page_size,MADV_MERGEABLE )) { +if (errno ==EINVAL ) { +tst_brk (TCONF |TERRNO ,"madvise() didn't " +"support MADV_MERGEABLE" ); + } + +tst_brk (TBROK |TERRNO , +"madvise(MADV_MERGEABLE) failed" ); + } + +if (mbind (test_pages[n], page_size,MPOL_BIND , new_nodes[0 ], + max_node,0 )) +tst_brk (TBROK |TERRNO ,"mbind(MPOL_BIND) failed" ); + +memset (test_pages[n],0 , page_size); + } + +SAFE_FILE_SCANF (PATH_KSM "run" ,"%d" , &orig_ksm_run); +SAFE_FILE_PRINTF (PATH_KSM "run" ,"%d" ,1 ); +wait_ksmd_full_scan (); +} + +static void cleanup (void ) +{ +int n; + +for (n =0 ; n <N_PAGES ; n++) { +if (test_pages[n]) +SAFE_MUNMAP (test_pages[n], page_size); + } + +free (new_nodes[0 ]); +free (new_nodes[1 ]); + +if (orig_ksm_run !=-1 ) +SAFE_FILE_PRINTF (PATH_KSM "run" ,"%d" , orig_ksm_run); +} + +static void migrate_test (void ) +{ +int loop, i, ret; + +for (loop =0 ; loop <N_LOOPS ; loop++) { + i = loop %2 ; + ret =tst_syscall (__NR_migrate_pages,0 , max_node, + new_nodes[i], new_nodes[i ?0 :1 ]); +if (ret <0 ) { +tst_res (TFAIL |TERRNO ,"migrate_pages() failed" ); +return ; + } + } + +tst_res (TPASS ,"migrate_pages() passed" ); +} + +static struct tst_test test = { + .min_kver ="2.6.32" , + .needs_root =1 , + .setup = setup, + .cleanup = cleanup, + .test_all = migrate_test, +}; + +#else +TST_TEST_TCONF ("require libnuma >= 2 and it's development packages" ); +#endif
PATCH v5 3/3 syscalls/migrate_pages03.c: Add new regression test
In reply to xiao yangHi Jan, Cyril
Could you help me review the v5 patch set. Thanks a lot.
Thanks,
Xiao Yang
Quoted 192 lines · xiao yang
The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fixremove_migration_pte()for ksm pages")'Signed-off-by xiao yang <[email protected]>--- 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.cruntest/syscalls +1
-0@@ -587,6 +587,7 @@ memcpy01 memcpy01 migrate_pages01 migrate_pages01 migrate_pages02 migrate_pages02 +migrate_pages03 migrate_pages03 mlockall01 mlockall01 mlockall02 mlockall02testcases/kernel/syscalls/.gitignore +1
-0@@ -538,6 +538,7 @@ /memset/memset01 /migrate_pages/migrate_pages01 /migrate_pages/migrate_pages02 +/migrate_pages/migrate_pages03 /mincore/mincore01 /mincore/mincore02 /mkdir/mkdir01testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +151
-0@@ -0,0 +1,151 @@ +/* +* Copyright (c) 2017 FUJITSU LIMITED. All rights reserved. +* Author(s): Xiao Yang <[email protected]> +* Jie Fei <[email protected]> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program, if not, see <http://www.gnu.org/licenses/>. +*/ + +/* +* Description: +* This is a regression test for ksm page migration which is miscalculated. +* +* The kernel bug has been fixed by: +* +* commit 4b0ece6fa0167b22c004ff69e137dc94ee2e469e +* Author: Naoya Horiguchi <[email protected]> +* Date: Fri Mar 31 15:11:44 2017 -0700 +* +* mm: migrate: fix remove_migration_pte() for ksm pages +*/ + +#include <errno.h> +#include <unistd.h> +#include <stdlib.h> + +#include "tst_test.h" +#include "lapi/syscalls.h" +#include "lapi/mmap.h" +#include "ksm_helper.h" +#include "numa_helper.h" +#include "migrate_pages_common.h" + +#ifdef HAVE_NUMA_V2 +#define N_PAGES 20 +#define N_LOOPS 600 +#define TEST_NODES 2 + +static int orig_ksm_run =-1 ; +static unsigned int page_size; +static void *test_pages[N_PAGES ]; +static int num_nodes, max_node; +static int *nodes; +static unsigned long *new_nodes[2 ]; + +static void setup (void ) +{ +int n; +unsigned long nodemask_size; + +if (access (PATH_KSM ,F_OK )) +tst_brk (TCONF ,"KSM configuration was not enabled" ); + +if (get_allowed_nodes_arr (NH_MEMS , &num_nodes, &nodes) <0 ) +tst_brk (TBROK |TERRNO ,"get_allowed_nodes() failed" ); + +if (num_nodes <TEST_NODES ) { +tst_brk (TCONF ,"requires NUMA with at least %d node" , +TEST_NODES ); + } + + max_node =LTP_ALIGN (get_max_node (),sizeof (unsigned long ) *8 ); + nodemask_size = max_node /8 ; + new_nodes[0 ] =SAFE_MALLOC (nodemask_size); + new_nodes[1 ] =SAFE_MALLOC (nodemask_size); +memset (new_nodes[0 ],0 , nodemask_size); +memset (new_nodes[1 ],0 , nodemask_size); +set_bit (new_nodes[0 ], nodes[0 ],1 ); +set_bit (new_nodes[1 ], nodes[1 ],1 ); + + page_size =getpagesize (); + +for (n =0 ; n <N_PAGES ; n++) { + test_pages[n] =SAFE_MMAP (NULL , page_size,PROT_READ |PROT_WRITE |PROT_EXEC , +MAP_PRIVATE |MAP_ANONYMOUS ,-1 ,0 ); +if (madvise (test_pages[n], page_size,MADV_MERGEABLE )) { +if (errno ==EINVAL ) { +tst_brk (TCONF |TERRNO ,"madvise() didn't " +"support MADV_MERGEABLE" ); + } + +tst_brk (TBROK |TERRNO , +"madvise(MADV_MERGEABLE) failed" ); + } + +if (mbind (test_pages[n], page_size,MPOL_BIND , new_nodes[0 ], + max_node,0 )) +tst_brk (TBROK |TERRNO ,"mbind(MPOL_BIND) failed" ); + +memset (test_pages[n],0 , page_size); + } + +SAFE_FILE_SCANF (PATH_KSM "run" ,"%d" , &orig_ksm_run); +SAFE_FILE_PRINTF (PATH_KSM "run" ,"%d" ,1 ); +wait_ksmd_full_scan (); +} + +static void cleanup (void ) +{ +int n; + +for (n =0 ; n <N_PAGES ; n++) { +if (test_pages[n]) +SAFE_MUNMAP (test_pages[n], page_size); + } + +free (new_nodes[0 ]); +free (new_nodes[1 ]); + +if (orig_ksm_run !=-1 ) +SAFE_FILE_PRINTF (PATH_KSM "run" ,"%d" , orig_ksm_run); +} + +static void migrate_test (void ) +{ +int loop, i, ret; + +for (loop =0 ; loop <N_LOOPS ; loop++) { + i = loop %2 ; + ret =tst_syscall (__NR_migrate_pages,0 , max_node, + new_nodes[i], new_nodes[i ?0 :1 ]); +if (ret <0 ) { +tst_res (TFAIL |TERRNO ,"migrate_pages() failed" ); +return ; + } + } + +tst_res (TPASS ,"migrate_pages() passed" ); +} + +static struct tst_test test = { + .min_kver ="2.6.32" , + .needs_root =1 , + .setup = setup, + .cleanup = cleanup, + .test_all = migrate_test, +}; + +#else +TST_TEST_TCONF ("require libnuma >= 2 and it's development packages" ); +#endif
PATCH v5 3/3 syscalls/migrate_pages03.c: Add new regression test
----- Original Message -----
Quoted 3 lines
Hi Jan, Cyril
Could you help me review the v5 patch set. Thanks a lot.
Looks good to me - I didn't have a chance to test it though.
Regards,
Jan
Quoted 206 lines
Thanks,
Xiao YangQuoted 198 lines · xiao yang
The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fixremove_migration_pte()for ksm pages")'Signed-off-by xiao yang <[email protected]>--- 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.cruntest/syscalls +1
-0@@ -587,6 +587,7 @@ memcpy01 memcpy01 migrate_pages01 migrate_pages01 migrate_pages02 migrate_pages02 +migrate_pages03 migrate_pages03 mlockall01 mlockall01 mlockall02 mlockall02testcases/kernel/syscalls/.gitignore +1
-0@@ -538,6 +538,7 @@ /memset/memset01 /migrate_pages/migrate_pages01 /migrate_pages/migrate_pages02 +/migrate_pages/migrate_pages03 /mincore/mincore01 /mincore/mincore02 /mkdir/mkdir01testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +22
-0@@ -0,0 +1,151 @@ +/* +* Copyright (c) 2017 FUJITSU LIMITED. All rights reserved. +* Author(s): Xiao Yang <[email protected]> +* Jie Fei <[email protected]> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program, if not, see <http://www.gnu.org/licenses/>. +*/ + +/* +* Description: +* This is a regression test for ksm page migration which is miscalculated.
+ *
+ * The kernel bug has been fixed by:
+ *
+ * commit4b0ece6fa0167b22c004ff69e137dc94ee2e469e
+ * Author: Naoya Horiguchi <[email protected]>
+ * Date: Fri Mar 31 15:11:44 2017 -0700
+ *
+ * mm: migrate: fixremove_migration_pte()for ksm pages
+ */testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +53
-0+ +#include <errno.h> +#include <unistd.h> +#include <stdlib.h> + +#include "tst_test.h" +#include "lapi/syscalls.h" +#include "lapi/mmap.h" +#include "ksm_helper.h" +#include "numa_helper.h" +#include "migrate_pages_common.h" + +#ifdef HAVE_NUMA_V2 +#define N_PAGES 20 +#define N_LOOPS 600 +#define TEST_NODES 2 + +static int orig_ksm_run =-1 ; +static unsigned int page_size; +static void *test_pages[N_PAGES ]; +static int num_nodes, max_node; +static int *nodes; +static unsigned long *new_nodes[2 ]; + +static void setup (void ) +{ +int n; +unsigned long nodemask_size; + +if (access (PATH_KSM ,F_OK )) +tst_brk (TCONF ,"KSM configuration was not enabled" ); + +if (get_allowed_nodes_arr (NH_MEMS , &num_nodes, &nodes) <0 ) +tst_brk (TBROK |TERRNO ,"get_allowed_nodes() failed" ); + +if (num_nodes <TEST_NODES ) { +tst_brk (TCONF ,"requires NUMA with at least %d node" , +TEST_NODES ); + } + + max_node =LTP_ALIGN (get_max_node (),sizeof (unsigned long ) *8 ); + nodemask_size = max_node /8 ; + new_nodes[0 ] =SAFE_MALLOC (nodemask_size); + new_nodes[1 ] =SAFE_MALLOC (nodemask_size); +memset (new_nodes[0 ],0 , nodemask_size); +memset (new_nodes[1 ],0 , nodemask_size); +set_bit (new_nodes[0 ], nodes[0 ],1 ); +set_bit (new_nodes[1 ], nodes[1 ],1 ); + + page_size =getpagesize (); + +for (n =0 ; n <N_PAGES ; n++) { + test_pages[n] = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE |
PROT_EXEC,testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +67
-0+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); +if (madvise (test_pages[n], page_size,MADV_MERGEABLE )) { +if (errno ==EINVAL ) { +tst_brk (TCONF |TERRNO ,"madvise() didn't " +"support MADV_MERGEABLE" ); + } + +tst_brk (TBROK |TERRNO , +"madvise(MADV_MERGEABLE) failed" ); + } + +if (mbind (test_pages[n], page_size,MPOL_BIND , new_nodes[0 ], + max_node,0 )) +tst_brk (TBROK |TERRNO ,"mbind(MPOL_BIND) failed" ); + + memset(test_pages[n], 0, page_size); + } + +SAFE_FILE_SCANF (PATH_KSM "run" ,"%d" , &orig_ksm_run); +SAFE_FILE_PRINTF (PATH_KSM "run" ,"%d" ,1 ); +wait_ksmd_full_scan (); +} + +static void cleanup (void ) +{ +int n; + +for (n =0 ; n <N_PAGES ; n++) { +if (test_pages[n]) +SAFE_MUNMAP (test_pages[n], page_size); + } + +free (new_nodes[0 ]); +free (new_nodes[1 ]); + +if (orig_ksm_run !=-1 ) +SAFE_FILE_PRINTF (PATH_KSM "run" ,"%d" , orig_ksm_run); +} + +static void migrate_test (void ) +{ +int loop, i, ret; + +for (loop =0 ; loop <N_LOOPS ; loop++) { + i = loop %2 ; + ret =tst_syscall (__NR_migrate_pages,0 , max_node, + new_nodes[i], new_nodes[i ?0 :1 ]); +if (ret <0 ) { +tst_res (TFAIL |TERRNO ,"migrate_pages() failed" ); +return ; + } + } + +tst_res (TPASS ,"migrate_pages() passed" ); +} + +static struct tst_test test = { + .min_kver ="2.6.32" , + .needs_root =1 , + .setup = setup, + .cleanup = cleanup, + .test_all = migrate_test, +}; + +#else +TST_TEST_TCONF ("require libnuma >= 2 and it's development packages" ); +#endif
PATCH v5 3/3 syscalls/migrate_pages03.c: Add new regression test
Hi, Jan and Cyril,
Could you help me push the v5 patch ? Thanks a lot. :-)
Best Regards,
Xiao Yang
Quoted 217 lines · Jan Stancek
----- Original Message -----
Quoted 3 lines
Hi Jan, Cyril
Could you help me review the v5 patch set. Thanks a lot.
Looks good to me - I didn't have a chance to test it though.
Regards,
JanQuoted 193 lines
Thanks,
Xiao YangQuoted 190 lines · xiao yang
The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fixremove_migration_pte()for ksm pages")'Signed-off-by xiao yang<[email protected]>--- 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.cruntest/syscalls +1
-0@@ -587,6 +587,7 @@ memcpy01 memcpy01 migrate_pages01 migrate_pages01 migrate_pages02 migrate_pages02 +migrate_pages03 migrate_pages03 mlockall01 mlockall01 mlockall02 mlockall02testcases/kernel/syscalls/.gitignore +1
-0@@ -538,6 +538,7 @@ /memset/memset01 /migrate_pages/migrate_pages01 /migrate_pages/migrate_pages02 +/migrate_pages/migrate_pages03 /mincore/mincore01 /mincore/mincore02 /mkdir/mkdir01testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +22
-0@@ -0,0 +1,151 @@ +/* +* Copyright (c) 2017 FUJITSU LIMITED. All rights reserved. +* Author(s): Xiao Yang<[email protected]> +* Jie Fei<[email protected]> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program, if not, see<http://www.gnu.org/licenses/>. +*/ + +/* +* Description: +* This is a regression test for ksm page migration which is miscalculated.
+ *
+ * The kernel bug has been fixed by:
+ *
+ * commit4b0ece6fa0167b22c004ff69e137dc94ee2e469e
+ * Author: Naoya Horiguchi<[email protected]>
+ * Date: Fri Mar 31 15:11:44 2017 -0700
+ *
+ * mm: migrate: fixremove_migration_pte()for ksm pages
+ */testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +53
-0+ +#include <errno.h> +#include <unistd.h> +#include <stdlib.h> + +#include "tst_test.h" +#include "lapi/syscalls.h" +#include "lapi/mmap.h" +#include "ksm_helper.h" +#include "numa_helper.h" +#include "migrate_pages_common.h" + +#ifdef HAVE_NUMA_V2 +#define N_PAGES 20 +#define N_LOOPS 600 +#define TEST_NODES 2 + +static int orig_ksm_run =-1 ; +static unsigned int page_size; +static void *test_pages[N_PAGES ]; +static int num_nodes, max_node; +static int *nodes; +static unsigned long *new_nodes[2 ]; + +static void setup (void ) +{ +int n; +unsigned long nodemask_size; + +if (access (PATH_KSM ,F_OK )) +tst_brk (TCONF ,"KSM configuration was not enabled" ); + +if (get_allowed_nodes_arr (NH_MEMS ,&num_nodes,&nodes)<0 ) +tst_brk (TBROK |TERRNO ,"get_allowed_nodes() failed" ); + +if (num_nodes<TEST_NODES ) { +tst_brk (TCONF ,"requires NUMA with at least %d node" , +TEST_NODES ); + } + + max_node =LTP_ALIGN (get_max_node (),sizeof (unsigned long ) *8 ); + nodemask_size = max_node /8 ; + new_nodes[0 ] =SAFE_MALLOC (nodemask_size); + new_nodes[1 ] =SAFE_MALLOC (nodemask_size); +memset (new_nodes[0 ],0 , nodemask_size); +memset (new_nodes[1 ],0 , nodemask_size); +set_bit (new_nodes[0 ], nodes[0 ],1 ); +set_bit (new_nodes[1 ], nodes[1 ],1 ); + + page_size =getpagesize (); + +for (n =0 ; n<N_PAGES ; n++) { + test_pages[n] = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE |
PROT_EXEC,testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +59
-0+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); +if (madvise (test_pages[n], page_size,MADV_MERGEABLE )) { +if (errno ==EINVAL ) { +tst_brk (TCONF |TERRNO ,"madvise() didn't " +"support MADV_MERGEABLE" ); + } + +tst_brk (TBROK |TERRNO , +"madvise(MADV_MERGEABLE) failed" ); + } + +if (mbind (test_pages[n], page_size,MPOL_BIND , new_nodes[0 ], + max_node,0 )) +tst_brk (TBROK |TERRNO ,"mbind(MPOL_BIND) failed" ); + +memset (test_pages[n],0 , page_size); + } + +SAFE_FILE_SCANF (PATH_KSM "run" ,"%d" ,&orig_ksm_run); +SAFE_FILE_PRINTF (PATH_KSM "run" ,"%d" ,1 ); +wait_ksmd_full_scan (); +} + +static void cleanup (void ) +{ +int n; + +for (n =0 ; n<N_PAGES ; n++) { +if (test_pages[n]) +SAFE_MUNMAP (test_pages[n], page_size); + } + +free (new_nodes[0 ]); +free (new_nodes[1 ]); + +if (orig_ksm_run !=-1 ) +SAFE_FILE_PRINTF (PATH_KSM "run" ,"%d" , orig_ksm_run); +} + +static void migrate_test (void ) +{ +int loop, i, ret; + +for (loop =0 ; loop<N_LOOPS ; loop++) { + i = loop %2 ; + ret =tst_syscall (__NR_migrate_pages,0 , max_node, + new_nodes[i], new_nodes[i ?0 :1 ]); +if (ret<0 ) { +tst_res (TFAIL |TERRNO ,"migrate_pages() failed" ); +return ; + } + } + +tst_res (TPASS ,"migrate_pages() passed" ); +} + +static struct tst_test test = { + .min_kver ="2.6.32" , + .needs_root =1 ,Quoted 11 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 151
Quoted 8 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +8
-0+ .setup = setup, + .cleanup = cleanup, + .test_all = migrate_test, +}; + +#else +TST_TEST_TCONF ("require libnuma>= 2 and it's development packages" ); +#endif .
PATCH v5 3/3 syscalls/migrate_pages03.c: Add new regression test
----- Original Message -----
Quoted 3 lines
Hi, Jan and Cyril,
Could you help me push the v5 patch ? Thanks a lot. :-)
Rebased and pushed.
Regards,
Jan
Quoted 225 lines
Best Regards,
Xiao YangQuoted 217 lines · Jan Stancek
----- Original Message -----
Quoted 3 lines
Hi Jan, Cyril
Could you help me review the v5 patch set. Thanks a lot.
Looks good to me - I didn't have a chance to test it though.
Regards,
JanQuoted 193 lines
Thanks,
Xiao YangQuoted 190 lines · xiao yang
The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fixremove_migration_pte()for ksm pages")'Signed-off-by xiao yang<[email protected]>--- 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.cruntest/syscalls +1
-0@@ -587,6 +587,7 @@ memcpy01 memcpy01 migrate_pages01 migrate_pages01 migrate_pages02 migrate_pages02 +migrate_pages03 migrate_pages03 mlockall01 mlockall01 mlockall02 mlockall02testcases/kernel/syscalls/.gitignore +1
-0@@ -538,6 +538,7 @@ /memset/memset01 /migrate_pages/migrate_pages01 /migrate_pages/migrate_pages02 +/migrate_pages/migrate_pages03 /mincore/mincore01 /mincore/mincore02 /mkdir/mkdir01testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +22
-0@@ -0,0 +1,151 @@ +/* +* Copyright (c) 2017 FUJITSU LIMITED. All rights reserved. +* Author(s): Xiao Yang<[email protected]> +* Jie Fei<[email protected]> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program, if not, see<http://www.gnu.org/licenses/>. +*/ + +/* +* Description: +* This is a regression test for ksm page migration which is miscalculated.
+ *
+ * The kernel bug has been fixed by:
+ *
+ * commit4b0ece6fa0167b22c004ff69e137dc94ee2e469e
+ * Author: Naoya Horiguchi<[email protected]>
+ * Date: Fri Mar 31 15:11:44 2017 -0700
+ *
+ * mm: migrate: fixremove_migration_pte()for ksm pages
+ */testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +53
-0+ +#include <errno.h> +#include <unistd.h> +#include <stdlib.h> + +#include "tst_test.h" +#include "lapi/syscalls.h" +#include "lapi/mmap.h" +#include "ksm_helper.h" +#include "numa_helper.h" +#include "migrate_pages_common.h" + +#ifdef HAVE_NUMA_V2 +#define N_PAGES 20 +#define N_LOOPS 600 +#define TEST_NODES 2 + +static int orig_ksm_run =-1 ; +static unsigned int page_size; +static void *test_pages[N_PAGES ]; +static int num_nodes, max_node; +static int *nodes; +static unsigned long *new_nodes[2 ]; + +static void setup (void ) +{ +int n; +unsigned long nodemask_size; + +if (access (PATH_KSM ,F_OK )) +tst_brk (TCONF ,"KSM configuration was not enabled" ); + +if (get_allowed_nodes_arr (NH_MEMS ,&num_nodes,&nodes)<0 ) +tst_brk (TBROK |TERRNO ,"get_allowed_nodes() failed" ); + +if (num_nodes<TEST_NODES ) { +tst_brk (TCONF ,"requires NUMA with at least %d node" , +TEST_NODES ); + } + + max_node =LTP_ALIGN (get_max_node (),sizeof (unsigned long ) *8 ); + nodemask_size = max_node /8 ; + new_nodes[0 ] =SAFE_MALLOC (nodemask_size); + new_nodes[1 ] =SAFE_MALLOC (nodemask_size); +memset (new_nodes[0 ],0 , nodemask_size); +memset (new_nodes[1 ],0 , nodemask_size); +set_bit (new_nodes[0 ], nodes[0 ],1 ); +set_bit (new_nodes[1 ], nodes[1 ],1 ); + + page_size =getpagesize (); + +for (n =0 ; n<N_PAGES ; n++) { + test_pages[n] = SAFE_MMAP(NULL, page_size, PROT_READ | PROT_WRITE |
PROT_EXEC,testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +59
-0+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); +if (madvise (test_pages[n], page_size,MADV_MERGEABLE )) { +if (errno ==EINVAL ) { +tst_brk (TCONF |TERRNO ,"madvise() didn't " +"support MADV_MERGEABLE" ); + } + +tst_brk (TBROK |TERRNO , +"madvise(MADV_MERGEABLE) failed" ); + } + +if (mbind (test_pages[n], page_size,MPOL_BIND , new_nodes[0 ], + max_node,0 )) +tst_brk (TBROK |TERRNO ,"mbind(MPOL_BIND) failed" ); + +memset (test_pages[n],0 , page_size); + } + +SAFE_FILE_SCANF (PATH_KSM "run" ,"%d" ,&orig_ksm_run); +SAFE_FILE_PRINTF (PATH_KSM "run" ,"%d" ,1 ); +wait_ksmd_full_scan (); +} + +static void cleanup (void ) +{ +int n; + +for (n =0 ; n<N_PAGES ; n++) { +if (test_pages[n]) +SAFE_MUNMAP (test_pages[n], page_size); + } + +free (new_nodes[0 ]); +free (new_nodes[1 ]); + +if (orig_ksm_run !=-1 ) +SAFE_FILE_PRINTF (PATH_KSM "run" ,"%d" , orig_ksm_run); +} + +static void migrate_test (void ) +{ +int loop, i, ret; + +for (loop =0 ; loop<N_LOOPS ; loop++) { + i = loop %2 ; + ret =tst_syscall (__NR_migrate_pages,0 , max_node, + new_nodes[i], new_nodes[i ?0 :1 ]); +if (ret<0 ) { +tst_res (TFAIL |TERRNO ,"migrate_pages() failed" ); +return ; + } + } + +tst_res (TPASS ,"migrate_pages() passed" ); +} + +static struct tst_test test = { + .min_kver ="2.6.32" , + .needs_root =1 ,Quoted 11 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c line 151
Quoted 8 lines
testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +8
-0+ .setup = setup, + .cleanup = cleanup, + .test_all = migrate_test, +}; + +#else +TST_TEST_TCONF ("require libnuma>= 2 and it's development packages" ); +#endif .
PATCH v5 3/3 syscalls/migrate_pages03.c: Add new regression test
In reply to xiao yangHi,
Ping :-)
Thanks,
Xiao Yang
Quoted 192 lines · xiao yang
The bug has been fixed in kernel:
'4b0ece6fa016("mm: migrate: fixremove_migration_pte()for ksm pages")'Signed-off-by xiao yang <[email protected]>--- 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.cruntest/syscalls +1
-0@@ -587,6 +587,7 @@ memcpy01 memcpy01 migrate_pages01 migrate_pages01 migrate_pages02 migrate_pages02 +migrate_pages03 migrate_pages03 mlockall01 mlockall01 mlockall02 mlockall02testcases/kernel/syscalls/.gitignore +1
-0@@ -538,6 +538,7 @@ /memset/memset01 /migrate_pages/migrate_pages01 /migrate_pages/migrate_pages02 +/migrate_pages/migrate_pages03 /mincore/mincore01 /mincore/mincore02 /mkdir/mkdir01testcases/kernel/syscalls/migrate_pages/migrate_pages03.c new file +151
-0@@ -0,0 +1,151 @@ +/* +* Copyright (c) 2017 FUJITSU LIMITED. All rights reserved. +* Author(s): Xiao Yang <[email protected]> +* Jie Fei <[email protected]> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program, if not, see <http://www.gnu.org/licenses/>. +*/ + +/* +* Description: +* This is a regression test for ksm page migration which is miscalculated. +* +* The kernel bug has been fixed by: +* +* commit 4b0ece6fa0167b22c004ff69e137dc94ee2e469e +* Author: Naoya Horiguchi <[email protected]> +* Date: Fri Mar 31 15:11:44 2017 -0700 +* +* mm: migrate: fix remove_migration_pte() for ksm pages +*/ + +#include <errno.h> +#include <unistd.h> +#include <stdlib.h> + +#include "tst_test.h" +#include "lapi/syscalls.h" +#include "lapi/mmap.h" +#include "ksm_helper.h" +#include "numa_helper.h" +#include "migrate_pages_common.h" + +#ifdef HAVE_NUMA_V2 +#define N_PAGES 20 +#define N_LOOPS 600 +#define TEST_NODES 2 + +static int orig_ksm_run =-1 ; +static unsigned int page_size; +static void *test_pages[N_PAGES ]; +static int num_nodes, max_node; +static int *nodes; +static unsigned long *new_nodes[2 ]; + +static void setup (void ) +{ +int n; +unsigned long nodemask_size; + +if (access (PATH_KSM ,F_OK )) +tst_brk (TCONF ,"KSM configuration was not enabled" ); + +if (get_allowed_nodes_arr (NH_MEMS , &num_nodes, &nodes) <0 ) +tst_brk (TBROK |TERRNO ,"get_allowed_nodes() failed" ); + +if (num_nodes <TEST_NODES ) { +tst_brk (TCONF ,"requires NUMA with at least %d node" , +TEST_NODES ); + } + + max_node =LTP_ALIGN (get_max_node (),sizeof (unsigned long ) *8 ); + nodemask_size = max_node /8 ; + new_nodes[0 ] =SAFE_MALLOC (nodemask_size); + new_nodes[1 ] =SAFE_MALLOC (nodemask_size); +memset (new_nodes[0 ],0 , nodemask_size); +memset (new_nodes[1 ],0 , nodemask_size); +set_bit (new_nodes[0 ], nodes[0 ],1 ); +set_bit (new_nodes[1 ], nodes[1 ],1 ); + + page_size =getpagesize (); + +for (n =0 ; n <N_PAGES ; n++) { + test_pages[n] =SAFE_MMAP (NULL , page_size,PROT_READ |PROT_WRITE |PROT_EXEC , +MAP_PRIVATE |MAP_ANONYMOUS ,-1 ,0 ); +if (madvise (test_pages[n], page_size,MADV_MERGEABLE )) { +if (errno ==EINVAL ) { +tst_brk (TCONF |TERRNO ,"madvise() didn't " +"support MADV_MERGEABLE" ); + } + +tst_brk (TBROK |TERRNO , +"madvise(MADV_MERGEABLE) failed" ); + } + +if (mbind (test_pages[n], page_size,MPOL_BIND , new_nodes[0 ], + max_node,0 )) +tst_brk (TBROK |TERRNO ,"mbind(MPOL_BIND) failed" ); + +memset (test_pages[n],0 , page_size); + } + +SAFE_FILE_SCANF (PATH_KSM "run" ,"%d" , &orig_ksm_run); +SAFE_FILE_PRINTF (PATH_KSM "run" ,"%d" ,1 ); +wait_ksmd_full_scan (); +} + +static void cleanup (void ) +{ +int n; + +for (n =0 ; n <N_PAGES ; n++) { +if (test_pages[n]) +SAFE_MUNMAP (test_pages[n], page_size); + } + +free (new_nodes[0 ]); +free (new_nodes[1 ]); + +if (orig_ksm_run !=-1 ) +SAFE_FILE_PRINTF (PATH_KSM "run" ,"%d" , orig_ksm_run); +} + +static void migrate_test (void ) +{ +int loop, i, ret; + +for (loop =0 ; loop <N_LOOPS ; loop++) { + i = loop %2 ; + ret =tst_syscall (__NR_migrate_pages,0 , max_node, + new_nodes[i], new_nodes[i ?0 :1 ]); +if (ret <0 ) { +tst_res (TFAIL |TERRNO ,"migrate_pages() failed" ); +return ; + } + } + +tst_res (TPASS ,"migrate_pages() passed" ); +} + +static struct tst_test test = { + .min_kver ="2.6.32" , + .needs_root =1 , + .setup = setup, + .cleanup = cleanup, + .test_all = migrate_test, +}; + +#else +TST_TEST_TCONF ("require libnuma >= 2 and it's development packages" ); +#endif