blob: 4f980660254bf7b989424c8b060bf1d41f711287 [file] [log] [blame]
/*
* SPDX-License-Identifier: GPL-2.0-or-later
*
* Copyright (c) 2018 Cyril Hrubis <chrubis@suse.cz>
*/
#ifndef TST_NUMA_H__
#define TST_NUMA_H__
#include <string.h>
/**
* 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__ */