1 /* 2 * Out Of Memory (OOM) for mempolicy - need NUMA system support 3 * 4 * The program is designed to cope with unpredictable like amount and 5 * system physical memory, swap size and other VMM technology like KSM, 6 * memcg, memory hotplug and so on which may affect the OOM 7 * behaviours. It simply increase the memory consumption 3G each time 8 * until all the available memory is consumed and OOM is triggered. 9 * 10 * Copyright (C) 2010-2017 Red Hat, Inc. 11 * 12 * This program is free software; you can redistribute it and/or modify 13 * it under the terms of the GNU General Public License as published by 14 * the Free Software Foundation; either version 2 of the License, or 15 * (at your option) any later version. 16 * 17 * This program is distributed in the hope that it will be useful, 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 20 * the GNU General Public License for more details. 21 */ 22 23 #include "config.h" 24 #include <sys/types.h> 25 #include <sys/stat.h> 26 #include <errno.h> 27 #include <fcntl.h> 28 #include <stdio.h> 29 #if HAVE_NUMA_H 30 #include <numa.h> 31 #endif 32 33 #include "numa_helper.h" 34 #include "mem.h" 35 36 #ifdef HAVE_NUMA_V2 37 38 static void verify_oom(void) 39 { 40 #if __WORDSIZE == 32 41 tst_brk(TCONF, "test is not designed for 32-bit system."); 42 #endif 43 44 tst_res(TINFO, "OOM on MPOL_BIND mempolicy..."); 45 testoom(MPOL_BIND, 0, ENOMEM, 1); 46 47 tst_res(TINFO, "OOM on MPOL_INTERLEAVE mempolicy..."); 48 testoom(MPOL_INTERLEAVE, 0, ENOMEM, 1); 49 50 tst_res(TINFO, "OOM on MPOL_PREFERRED mempolicy..."); 51 testoom(MPOL_PREFERRED, 0, ENOMEM, 1); 52 } 53 54 static void setup(void) 55 { 56 if (!is_numa(NULL, NH_MEMS, 2)) 57 tst_brk(TCONF, "The case need a NUMA system."); 58 59 overcommit = get_sys_tune("overcommit_memory"); 60 set_sys_tune("overcommit_memory", 1, 1); 61 } 62 63 static void cleanup(void) 64 { 65 if (overcommit != -1) 66 set_sys_tune("overcommit_memory", overcommit, 0); 67 } 68 69 static struct tst_test test = { 70 .needs_root = 1, 71 .forks_child = 1, 72 .timeout = -1, 73 .setup = setup, 74 .cleanup = cleanup, 75 .test_all = verify_oom, 76 }; 77 78 #else 79 TST_TEST_TCONF(NUMA_ERROR_MSG); 80 #endif 81