1/* 2 * Copyright (C) 2010-2017 Red Hat, Inc. 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 12 * the GNU General Public License for more details. 13 * 14 * Kernel Samepage Merging (KSM) 15 * 16 * Basic tests were to start several programs with same and different 17 * memory contents and ensure only to merge the ones with the same 18 * contents. When changed the content of one of merged pages in a 19 * process and to the mode "unmerging", it should discard all merged 20 * pages there. Also tested it is possible to disable KSM. There are 21 * also command-line options to specify the memory allocation size, and 22 * number of processes have same memory contents so it is possible to 23 * test more advanced things like KSM + OOM etc. 24 * 25 * Prerequisites: 26 * 27 * 1) ksm and ksmtuned daemons need to be disabled. Otherwise, it could 28 * distrub the testing as they also change some ksm tunables depends 29 * on current workloads. 30 * 31 * The test steps are: 32 * - Check ksm feature and backup current run setting. 33 * - Change run setting to 1 - merging. 34 * - 3 memory allocation programs have the memory contents that 2 of 35 * them are all 'a' and one is all 'b'. 36 * - Check ksm statistics and verify the content. 37 * - 1 program changes the memory content from all 'a' to all 'b'. 38 * - Check ksm statistics and verify the content. 39 * - All programs change the memory content to all 'd'. 40 * - Check ksm statistics and verify the content. 41 * - Change one page of a process. 42 * - Check ksm statistics and verify the content. 43 * - Change run setting to 2 - unmerging. 44 * - Check ksm statistics and verify the content. 45 * - Change run setting to 0 - stop. 46 */ 47 48#include <sys/types.h> 49#include <sys/mman.h> 50#include <sys/stat.h> 51#include <sys/wait.h> 52#include <errno.h> 53#include <fcntl.h> 54#include <signal.h> 55#include <stdio.h> 56#include <stdlib.h> 57#include <string.h> 58#include <unistd.h> 59#include "mem.h" 60#include "ksm_common.h" 61 62static void verify_ksm(void) 63{ 64 create_same_memory(size, num, unit); 65} 66 67static void setup(void) 68{ 69 parse_ksm_options(opt_sizestr, &size, opt_numstr, &num, opt_unitstr, &unit); 70} 71 72static struct tst_test test = { 73 .needs_root = 1, 74 .forks_child = 1, 75 .options = (struct tst_option[]) { 76 {"n:", &opt_numstr, "Number of processes"}, 77 {"s:", &opt_sizestr, "Memory allocation size in MB"}, 78 {"u:", &opt_unitstr, "Memory allocation unit in MB"}, 79 {} 80 }, 81 .setup = setup, 82 .save_restore = (const struct tst_path_val[]) { 83 {"/sys/kernel/mm/ksm/run", NULL, TST_SR_TBROK}, 84 {"/sys/kernel/mm/ksm/sleep_millisecs", NULL, TST_SR_TBROK}, 85 {"/sys/kernel/mm/ksm/max_page_sharing", NULL, 86 TST_SR_SKIP_MISSING | TST_SR_TCONF_RO}, 87 {"/sys/kernel/mm/ksm/merge_across_nodes", "1", 88 TST_SR_SKIP_MISSING | TST_SR_TCONF_RO}, 89 {} 90 }, 91 .needs_kconfigs = (const char *const[]){ 92 "CONFIG_KSM=y", 93 NULL 94 }, 95 .test_all = verify_ksm, 96}; 97