This kernel commit 90bd6fd31c809(ksm: allow trees per NUMA node) introduced a new KSM sysfs knob /sys/kernel/mm/ksm/merge_across_nodes, when it is set to zero, only pages from the same node are merged, which is different with the previous behavior, and ksm test cases sometimes will fail in NUMA system.
Signed-off-by: Zhouping Liu <[email protected]> --- Changed log: V1 to V2: updated some comments. testcases/kernel/mem/ksm/ksm01.c | 19 +++++++++++++++++++ testcases/kernel/mem/ksm/ksm02.c | 12 ++++++++++++ testcases/kernel/mem/ksm/ksm03.c | 12 ++++++++++++ testcases/kernel/mem/ksm/ksm04.c | 12 ++++++++++++ 4 files changed, 55 insertions(+) diff --git a/testcases/kernel/mem/ksm/ksm01.c b/testcases/kernel/mem/ksm/ksm01.c index 514d702..47a7753 100644 --- a/testcases/kernel/mem/ksm/ksm01.c +++ b/testcases/kernel/mem/ksm/ksm01.c @@ -73,6 +73,8 @@ char *TCID = "ksm01"; int TST_TOTAL = 1; +static int merge_across_nodes; + option_t ksm_options[] = { {"n:", &opt_num, &opt_numstr}, {"s:", &opt_size, &opt_sizestr}, @@ -108,11 +110,28 @@ void setup(void) if (access(PATH_KSM, F_OK) == -1) tst_brkm(TCONF, NULL, "KSM configuration is not enabled"); + /* + * kernel commit 90bd6fd introduced a new KSM sysfs knob + * /sys/kernel/mm/ksm/merge_across_nodes, setting it to '0' + * will prevent KSM pages being merged across numa nodes, + * which will cause the case fail, so we need to make sure + * it is enabled before testing. + */ + if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) { + SAFE_FILE_SCANF(NULL, PATH_KSM "merge_across_nodes", + "%d", &merge_across_nodes); + SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", "1"); + } + tst_sig(FORK, DEF_HANDLER, NULL); TEST_PAUSE; } void cleanup(void) { + if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) + SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", + "%d", merge_across_nodes); + TEST_CLEANUP; } diff --git a/testcases/kernel/mem/ksm/ksm02.c b/testcases/kernel/mem/ksm/ksm02.c index 6c96c74..e22a7a6 100644 --- a/testcases/kernel/mem/ksm/ksm02.c +++ b/testcases/kernel/mem/ksm/ksm02.c @@ -73,6 +73,8 @@ char *TCID = "ksm02"; int TST_TOTAL = 1; +static int merge_across_nodes; + #if HAVE_NUMA_H && HAVE_LINUX_MEMPOLICY_H && HAVE_NUMAIF_H \ && HAVE_MPOL_CONSTANTS option_t ksm_options[] = { @@ -123,6 +125,10 @@ int main(int argc, char *argv[]) void cleanup(void) { + if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) + SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", + "%d", merge_across_nodes); + umount_mem(CPATH, CPATH_NEW); TEST_CLEANUP; } @@ -136,6 +142,12 @@ void setup(void) if (access(PATH_KSM, F_OK) == -1) tst_brkm(TCONF, NULL, "KSM configuration is not enabled"); + if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) { + SAFE_FILE_SCANF(NULL, PATH_KSM "merge_across_nodes", + "%d", &merge_across_nodes); + SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", "1"); + } + tst_sig(FORK, DEF_HANDLER, cleanup); TEST_PAUSE; mount_mem("cpuset", "cpuset", NULL, CPATH, CPATH_NEW); diff --git a/testcases/kernel/mem/ksm/ksm03.c b/testcases/kernel/mem/ksm/ksm03.c index 4480399..a254b75 100644 --- a/testcases/kernel/mem/ksm/ksm03.c +++ b/testcases/kernel/mem/ksm/ksm03.c @@ -73,6 +73,8 @@ char *TCID = "ksm03"; int TST_TOTAL = 1; +static int merge_across_nodes; + option_t ksm_options[] = { {"n:", &opt_num, &opt_numstr}, {"s:", &opt_size, &opt_sizestr}, @@ -109,6 +111,12 @@ void setup(void) if (access(PATH_KSM, F_OK) == -1) tst_brkm(TCONF, NULL, "KSM configuration is not enabled"); + if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) { + SAFE_FILE_SCANF(NULL, PATH_KSM "merge_across_nodes", + "%d", &merge_across_nodes); + SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", "1"); + } + mount_mem("memcg", "cgroup", "memory", MEMCG_PATH, MEMCG_PATH_NEW); tst_sig(FORK, DEF_HANDLER, NULL); TEST_PAUSE; @@ -116,6 +124,10 @@ void setup(void) void cleanup(void) { + if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) + SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", + "%d", merge_across_nodes); + umount_mem(MEMCG_PATH, MEMCG_PATH_NEW); TEST_CLEANUP; } diff --git a/testcases/kernel/mem/ksm/ksm04.c b/testcases/kernel/mem/ksm/ksm04.c index ed5e0b3..6b3c71b 100644 --- a/testcases/kernel/mem/ksm/ksm04.c +++ b/testcases/kernel/mem/ksm/ksm04.c @@ -73,6 +73,8 @@ char *TCID = "ksm04"; int TST_TOTAL = 1; +static int merge_across_nodes; + #if HAVE_NUMA_H && HAVE_LINUX_MEMPOLICY_H && HAVE_NUMAIF_H \ && HAVE_MPOL_CONSTANTS option_t ksm_options[] = { @@ -125,6 +127,10 @@ int main(int argc, char *argv[]) void cleanup(void) { + if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) + SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", + "%d", merge_across_nodes); + umount_mem(CPATH, CPATH_NEW); umount_mem(MEMCG_PATH, MEMCG_PATH_NEW); TEST_CLEANUP; @@ -139,6 +145,12 @@ void setup(void) if (access(PATH_KSM, F_OK) == -1) tst_brkm(TCONF, NULL, "KSM configuration is not enabled"); + if (access(PATH_KSM "merge_across_nodes", F_OK) == 0) { + SAFE_FILE_SCANF(NULL, PATH_KSM "merge_across_nodes", + "%d", &merge_across_nodes); + SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes", "1"); + } + tst_sig(FORK, DEF_HANDLER, cleanup); TEST_PAUSE; mount_mem("cpuset", "cpuset", NULL, CPATH, CPATH_NEW); -- 1.7.11.7 ------------------------------------------------------------------------------ Learn Graph Databases - Download FREE O'Reilly Book "Graph Databases" is the definitive new guide to graph databases and their applications. This 200-page book is written by three acclaimed leaders in the field. The early access version is available now. Download your free book today! http://p.sf.net/sfu/neotech_d2d_may _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
