blob: fd1879c72ddc03233deff333b2e15a9174de9632 [file] [log] [blame]
Garrett Cooperecd667e2011-01-19 01:06:18 -08001#ifndef _MEM_H
2#define _MEM_H
Caspar Zhang45434382011-08-02 18:00:45 +08003#include "config.h"
Garrett Cooperecd667e2011-01-19 01:06:18 -08004#include "test.h"
Garrett Cooperecd667e2011-01-19 01:06:18 -08005
Caspar Zhang2031d3c2011-12-23 18:03:56 +08006#if defined(__powerpc__) || defined(__powerpc64__)
7#define MAXNODES 256
8#else
Garrett Cooperecd667e2011-01-19 01:06:18 -08009#define MAXNODES 512
Caspar Zhang2031d3c2011-12-23 18:03:56 +080010#endif
Garrett Cooperecd667e2011-01-19 01:06:18 -080011#define MB (1UL<<20)
Caspar Zhang3fa874a2011-12-28 14:16:20 +080012#define KB (1UL<<10)
Garrett Cooperecd667e2011-01-19 01:06:18 -080013#define PATH_SYS_SYSTEM "/sys/devices/system"
Caspar Zhang3fa874a2011-12-28 14:16:20 +080014#define PATH_SYSVM "/proc/sys/vm/"
Caspar Zhang233e1222011-12-23 13:02:56 +080015#define PATH_MEMINFO "/proc/meminfo"
Lans Zhangcb2967b2013-04-17 16:35:27 +080016#define BITS_PER_LONG (8 * sizeof(long))
17
18static inline void set_node(unsigned long *array, unsigned int node)
19{
20 array[node / BITS_PER_LONG] |= 1UL << (node % BITS_PER_LONG);
21}
Garrett Cooperecd667e2011-01-19 01:06:18 -080022
Zhouping Liu6b699d02013-05-13 16:43:27 +080023static inline void clean_node(unsigned long *array)
24{
Xiaoguang Wangf200be52014-04-28 16:47:13 +080025 unsigned int i;
Zhouping Liu6b699d02013-05-13 16:43:27 +080026
27 for (i = 0; i < MAXNODES / BITS_PER_LONG; i++)
28 array[i] &= 0UL;
29}
30
Caspar Zhanga7f0eed2012-02-28 15:44:04 +080031/* OOM */
Garrett Cooperecd667e2011-01-19 01:06:18 -080032
Caspar Zhanga7f0eed2012-02-28 15:44:04 +080033#define LENGTH (3UL<<30)
34#define TESTMEM (1UL<<30)
35#define OVERCOMMIT 1
36#define NORMAL 2
37#define MLOCK 3
38#define KSM 4
Caspar Zhangff74ba52012-02-27 16:13:18 +080039
40long overcommit;
Jan Stancek30ac84c2014-07-25 09:58:47 +020041void oom(int testcase, int lite, int retcode, int allow_sigkill);
42void testoom(int mempolicy, int lite, int retcode, int allow_sigkill);
Caspar Zhang6009edf2012-02-20 18:42:36 +080043
Caspar Zhanga7f0eed2012-02-28 15:44:04 +080044/* KSM */
45
46#define PATH_KSM "/sys/kernel/mm/ksm/"
47
Zhouping Liu65ca1bd2013-05-13 16:43:28 +080048void test_ksm_merge_across_nodes(unsigned long nr_pages);
49
Zhouping Liu0b341932013-04-16 22:30:07 +080050/* THP */
51
52#define PATH_THP "/sys/kernel/mm/transparent_hugepage/"
53#define PATH_KHPD PATH_THP "khugepaged/"
54
55int opt_nr_children, opt_nr_thps;
56char *opt_nr_children_str, *opt_nr_thps_str;
Zhouping Liud6b67f82013-04-16 22:30:08 +080057void test_transparent_hugepage(int nr_children, int nr_thps,
58 int hg_aligned, int mempolicy);
Zhouping Liu0b341932013-04-16 22:30:07 +080059void check_thp_options(int *nr_children, int *nr_thps);
60void thp_usage(void);
61
Wanlong Gao892153a2012-04-02 16:21:59 +080062/* HUGETLB */
63
64#define PATH_SHMMAX "/proc/sys/kernel/shmmax"
65
Garrett Cooperecd667e2011-01-19 01:06:18 -080066void write_memcg(void);
Caspar Zhang6009edf2012-02-20 18:42:36 +080067void create_same_memory(int size, int num, int unit);
Caspar Zhanga7f0eed2012-02-28 15:44:04 +080068int opt_num, opt_size, opt_unit;
69char *opt_numstr, *opt_sizestr, *opt_unitstr;
Caspar Zhang6009edf2012-02-20 18:42:36 +080070void check_ksm_options(int *size, int *num, int *unit);
71void ksm_usage(void);
72
Caspar Zhanga7f0eed2012-02-28 15:44:04 +080073/* cpuset/memcg */
Caspar Zhang6d4044f2012-02-28 16:12:15 +080074
Caspar Zhanga7f0eed2012-02-28 15:44:04 +080075#define CPATH "/dev/cpuset"
76#define CPATH_NEW CPATH "/1"
77#define MEMCG_PATH "/dev/cgroup"
78#define MEMCG_PATH_NEW MEMCG_PATH "/1"
Zhouping Liue0963392013-04-23 15:12:55 +080079#define MEMCG_LIMIT MEMCG_PATH_NEW "/memory.limit_in_bytes"
Zhouping Liu3f8c0022012-03-19 18:28:15 +080080#define MEMCG_SW_LIMIT MEMCG_PATH_NEW "/memory.memsw.limit_in_bytes"
Caspar Zhanga7f0eed2012-02-28 15:44:04 +080081#if HAVE_SYS_EVENTFD_H
82#define PATH_OOMCTRL MEMCG_PATH_NEW "/memory.oom_control"
83#define PATH_EVTCTRL MEMCG_PATH_NEW "/cgroup.event_control"
84#endif
Caspar Zhang6009edf2012-02-20 18:42:36 +080085
Caspar Zhangff92e942012-02-29 10:58:15 +080086void read_cpuset_files(char *prefix, char *filename, char *retbuf);
87void write_cpuset_files(char *prefix, char *filename, char *buf);
Caspar Zhanga7f0eed2012-02-28 15:44:04 +080088void write_cpusets(long nd);
89void mount_mem(char *name, char *fs, char *options, char *path, char *path_new);
90void umount_mem(char *path, char *path_new);
91
92/* shared */
Caspar Zhanga98ac192012-08-09 14:15:41 +080093unsigned int get_a_numa_node(void (*cleanup_fn)(void));
Caspar Zhang6009edf2012-02-20 18:42:36 +080094int path_exist(const char *path, ...);
95long read_meminfo(char *item);
Caspar Zhang3fa874a2011-12-28 14:16:20 +080096void set_sys_tune(char *sys_file, long tune, int check);
97long get_sys_tune(char *sys_file);
Caspar Zhang6009edf2012-02-20 18:42:36 +080098void cleanup(void);
99void setup(void);
100
Wanlong Gao892153a2012-04-02 16:21:59 +0800101void update_shm_size(size_t *shm_size);
102
Garrett Cooperecd667e2011-01-19 01:06:18 -0800103#endif