• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright (c) 2018 Cyril Hrubis <chrubis@suse.cz>
3  */
4 
5 #ifndef TST_NUMA_H__
6 #define TST_NUMA_H__
7 
8 #include <string.h>
9 
10 /**
11  * Numa nodemap.
12  */
13 struct tst_nodemap {
14         /** Number of nodes in map */
15 	unsigned int cnt;
16 	/** Page allocation counters */
17 	unsigned int *counters;
18 	/** Array of numa ids */
19 	unsigned int map[];
20 };
21 
22 /**
23  * Clears numa counters. The counters are lazy-allocated on first call of this function.
24  *
25  * @nodes Numa nodemap.
26  */
27 void tst_nodemap_reset_counters(struct tst_nodemap *nodes);
28 
29 /**
30  * Prints pages allocated per each node.
31  *
32  * @nodes Numa nodemap.
33  */
34 void tst_nodemap_print_counters(struct tst_nodemap *nodes);
35 
36 /**
37  * Returns a name for a mempolicy/mbind mode.
38  *
39  * @mode Numa mempolicy mode.
40  */
41 const char *tst_mempolicy_mode_name(int mode);
42 
43 /**
44  * Maps pages into memory, if path is NULL the mapping is anonymous otherwise is backed by the file.
45  *
46  * @path Path to a file, if not NULL mapping is file based.
47  * @size Mapping size.
48  */
49 void *tst_numa_map(const char *path, size_t size);
50 
51 /*
52  * Writes to memory in order to get the pages faulted.
53  *
54  * @ptr Start of the mapping.
55  * @size Size of the mapping.
56  */
tst_numa_fault(void * ptr,size_t size)57 static inline void tst_numa_fault(void *ptr, size_t size)
58 {
59 	memset(ptr, 'a', size);
60 }
61 
62 /*
63  * Frees the memory.
64  *
65  * @ptr Start of the mapping.
66  * @size Size of the mapping.
67  */
tst_numa_unmap(void * ptr,size_t size)68 static inline void tst_numa_unmap(void *ptr, size_t size)
69 {
70 	SAFE_MUNMAP(ptr, size);
71 }
72 
73 /**
74  * Check on which numa node resides each page of the mapping starting at ptr
75  * and continuing pages long and increases nodemap counters accordingly.
76  *
77  * @nodes Nodemap with initialized counters.
78  * @ptr   Pointer to start of a mapping.
79  * @size  Size of the mapping.
80  */
81 void tst_nodemap_count_pages(struct tst_nodemap *nodes, void *ptr, size_t size);
82 
83 /**
84  * Frees nodemap.
85  *
86  * @nodes Numa nodemap to be freed.
87  */
88 void tst_nodemap_free(struct tst_nodemap *nodes);
89 
90 /**
91  * Bitflags for tst_get_nodemap() function.
92  */
93 enum tst_numa_types {
94 	TST_NUMA_ANY = 0x00,
95 	TST_NUMA_MEM = 0x01,
96 };
97 
98 /**
99  * Allocates and returns numa node map, which is an array of numa nodes which
100  * contain desired resources e.g. memory.
101  *
102  * @type       Bitflags of enum tst_numa_types specifying desired resources.
103  * @min_mem_kb Minimal free RAM on memory nodes, if given node has less than
104  *             requested amount of free+buffers memory it's not included in
105  *             the resulting list of nodes.
106  *
107  * @return On success returns allocated and initialized struct tst_nodemap which contains
108  *         array of numa node ids that contains desired resources.
109  */
110 struct tst_nodemap *tst_get_nodemap(int type, size_t min_mem_kb);
111 
112 #endif /* TST_NUMA_H__ */
113