/* SPDX-License-Identifier: GPL-2.0-or-later * Copyright (c) 2018 Cyril Hrubis */ #ifndef TST_NUMA_H__ #define TST_NUMA_H__ #include /** * Numa nodemap. */ struct tst_nodemap { /** Number of nodes in map */ unsigned int cnt; /** Page allocation counters */ unsigned int *counters; /** Array of numa ids */ unsigned int map[]; }; /** * Clears numa counters. The counters are lazy-allocated on first call of this function. * * @nodes Numa nodemap. */ void tst_nodemap_reset_counters(struct tst_nodemap *nodes); /** * Prints pages allocated per each node. * * @nodes Numa nodemap. */ void tst_nodemap_print_counters(struct tst_nodemap *nodes); /** * Returns a name for a mempolicy/mbind mode. * * @mode Numa mempolicy mode. */ const char *tst_numa_mode_name(int mode); /** * Maps pages into memory, if path is NULL the mapping is anonymous otherwise is backed by the file. * * @path Path to a file, if not NULL mapping is file based. * @size Mapping size. */ void *tst_numa_map(const char *path, size_t size); /* * Writes to memory in order to get the pages faulted. * * @ptr Start of the mapping. * @size Size of the mapping. */ static inline void tst_numa_fault(void *ptr, size_t size) { memset(ptr, 'a', size); } /* * Frees the memory. * * @ptr Start of the mapping. * @size Size of the mapping. */ static inline void tst_numa_unmap(void *ptr, size_t size) { SAFE_MUNMAP(ptr, size); } /** * Check on which numa node resides each page of the mapping starting at ptr * and continuing pages long and increases nodemap counters accordingly. * * @nodes Nodemap with initialized counters. * @ptr Pointer to start of a mapping. * @size Size of the mapping. */ void tst_nodemap_count_pages(struct tst_nodemap *nodes, void *ptr, size_t size); /** * Frees nodemap. * * @nodes Numa nodemap to be freed. */ void tst_nodemap_free(struct tst_nodemap *nodes); /** * Bitflags for tst_get_nodemap() function. */ enum tst_numa_types { TST_NUMA_ANY = 0x00, TST_NUMA_MEM = 0x01, }; /** * Allocates and returns numa node map, which is an array of numa nodes which * contain desired resources e.g. memory. * * @type Bitflags of enum tst_numa_types specifying desired resources. * @min_mem_kb Minimal free RAM on memory nodes, if given node has less than * requested amount of free+buffers memory it's not included in * the resulting list of nodes. * * @return On success returns allocated and initialized struct tst_nodemap which contains * array of numa node ids that contains desired resources. */ struct tst_nodemap *tst_get_nodemap(int type, size_t min_mem_kb); #endif /* TST_NUMA_H__ */