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