/*
 * 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__ */
