You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
2.7 KiB
115 lines
2.7 KiB
/*
|
|
* 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__ */
|