int main(int argc, char *argv[]) { int lc; int size = 128, num = 3, unit = 1; unsigned long nmask[MAXNODES / BITS_PER_LONG] = { 0 }; unsigned int node; tst_parse_opts(argc, argv, ksm_options, ksm_usage); node = get_a_numa_node(tst_exit); set_node(nmask, node); setup(); for (lc = 0; TEST_LOOPING(lc); lc++) { tst_count = 0; check_ksm_options(&size, &num, &unit); if (set_mempolicy(MPOL_BIND, nmask, MAXNODES) == -1) { if (errno != ENOSYS) tst_brkm(TBROK | TERRNO, cleanup, "set_mempolicy"); else tst_brkm(TCONF, cleanup, "set_mempolicy syscall is not " "implemented on your system."); } create_same_memory(size, num, unit); write_cpusets(node); create_same_memory(size, num, unit); } cleanup(); tst_exit(); }
void oom(int testcase, int mempolicy, int lite) { pid_t pid; int status; #if HAVE_NUMA_H && HAVE_LINUX_MEMPOLICY_H && HAVE_NUMAIF_H \ && HAVE_MPOL_CONSTANTS unsigned long nmask = 0; unsigned int node; if (mempolicy) node = get_a_numa_node(cleanup); nmask += 1 << node; #endif switch (pid = fork()) { case -1: tst_brkm(TBROK | TERRNO, cleanup, "fork"); case 0: #if HAVE_NUMA_H && HAVE_LINUX_MEMPOLICY_H && HAVE_NUMAIF_H \ && HAVE_MPOL_CONSTANTS if (mempolicy) if (set_mempolicy(MPOL_BIND, &nmask, MAXNODES) == -1) tst_brkm(TBROK | TERRNO, cleanup, "set_mempolicy"); #endif _test_alloc(testcase, lite); exit(0); default: break; } tst_resm(TINFO, "expected victim is %d.", pid); if (waitpid(-1, &status, 0) == -1) tst_brkm(TBROK | TERRNO, cleanup, "waitpid"); if (testcase == OVERCOMMIT) { if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) tst_resm(TFAIL, "the victim unexpectedly failed: %d", status); } else { if (!WIFSIGNALED(status) || WTERMSIG(status) != SIGKILL) tst_resm(TFAIL, "the victim unexpectedly failed: %d", status); } }
void testoom(int mempolicy, int lite, int numa) { long nodes[MAXNODES]; if (numa && !mempolicy) write_cpusets(get_a_numa_node(cleanup)); tst_resm(TINFO, "start normal OOM testing."); oom(NORMAL, mempolicy, lite); tst_resm(TINFO, "start OOM testing for mlocked pages."); oom(MLOCK, mempolicy, lite); if (access(PATH_KSM, F_OK) == -1) tst_brkm(TCONF, NULL, "KSM configuration is not enabled"); tst_resm(TINFO, "start OOM testing for KSM pages."); oom(KSM, mempolicy, lite); }