#ifndef _NUMA_H
#define _NUMA_H 1
#define LIBNUMA_API_VERSION 2
#include <stddef.h>
#include <string.h>
#include <sys/types.h>
#include <stdlib.h>
#if defined(__x86_64__) || defined(__i386__)
#define NUMA_NUM_NODES 128
#else
#define NUMA_NUM_NODES 2048
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
unsigned long n[NUMA_NUM_NODES/(sizeof(unsigned long)*8)];
} nodemask_t;
struct bitmask {
unsigned long size;
unsigned long *maskp;
};
int numa_bitmask_isbitset(const struct bitmask *, unsigned int);
struct bitmask *numa_bitmask_setall(struct bitmask *);
struct bitmask *numa_bitmask_clearall(struct bitmask *);
struct bitmask *numa_bitmask_setbit(struct bitmask *, unsigned int);
struct bitmask *numa_bitmask_clearbit(struct bitmask *, unsigned int);
unsigned int numa_bitmask_nbytes(struct bitmask *);
unsigned int numa_bitmask_weight(const struct bitmask *);
struct bitmask *numa_bitmask_alloc(unsigned int);
void numa_bitmask_free(struct bitmask *);
int numa_bitmask_equal(const struct bitmask *, const struct bitmask *);
void copy_nodemask_to_bitmask(nodemask_t *, struct bitmask *);
void copy_bitmask_to_nodemask(struct bitmask *, nodemask_t *);
void copy_bitmask_to_bitmask(struct bitmask *, struct bitmask *);
static inline void nodemask_zero(nodemask_t *mask)
{
struct bitmask tmp;
tmp.maskp = (unsigned long *)mask;
tmp.size = sizeof(nodemask_t) * 8;
numa_bitmask_clearall(&tmp);
}
static inline void nodemask_zero_compat(nodemask_t *mask)
{
struct bitmask tmp;
tmp.maskp = (unsigned long *)mask;
tmp.size = sizeof(nodemask_t) * 8;
numa_bitmask_clearall(&tmp);
}
static inline void nodemask_set_compat(nodemask_t *mask, int node)
{
mask->n[node / (8*sizeof(unsigned long))] |=
(1UL<<(node%(8*sizeof(unsigned long))));
}
static inline void nodemask_clr_compat(nodemask_t *mask, int node)
{
mask->n[node / (8*sizeof(unsigned long))] &=
~(1UL<<(node%(8*sizeof(unsigned long))));
}
static inline int nodemask_isset_compat(const nodemask_t *mask, int node)
{
if ((unsigned)node >= NUMA_NUM_NODES)
return 0;
if (mask->n[node / (8*sizeof(unsigned long))] &
(1UL<<(node%(8*sizeof(unsigned long)))))
return 1;
return 0;
}
static inline int nodemask_equal(const nodemask_t *a, const nodemask_t *b)
{
struct bitmask tmp_a, tmp_b;
tmp_a.maskp = (unsigned long *)a;
tmp_a.size = sizeof(nodemask_t) * 8;
tmp_b.maskp = (unsigned long *)b;
tmp_b.size = sizeof(nodemask_t) * 8;
return numa_bitmask_equal(&tmp_a, &tmp_b);
}
static inline int nodemask_equal_compat(const nodemask_t *a, const nodemask_t *b)
{
struct bitmask tmp_a, tmp_b;
tmp_a.maskp = (unsigned long *)a;
tmp_a.size = sizeof(nodemask_t) * 8;
tmp_b.maskp = (unsigned long *)b;
tmp_b.size = sizeof(nodemask_t) * 8;
return numa_bitmask_equal(&tmp_a, &tmp_b);
}
int numa_available(void);
int numa_max_node(void);
int numa_max_possible_node(void);
int numa_preferred(void);
long long numa_node_size64(int node, long long *freep);
long numa_node_size(int node, long *freep);
int numa_pagesize(void);
extern struct bitmask *numa_all_nodes_ptr;
extern struct bitmask *numa_nodes_ptr;
extern nodemask_t numa_all_nodes;
extern struct bitmask *numa_all_cpus_ptr;
extern struct bitmask *numa_no_nodes_ptr;
extern nodemask_t numa_no_nodes;
void numa_bind(struct bitmask *nodes);
void numa_set_interleave_mask(struct bitmask *nodemask);
struct bitmask *numa_get_interleave_mask(void);
struct bitmask *numa_allocate_nodemask(void);
static inline void numa_free_nodemask(struct bitmask *b)
{
numa_bitmask_free(b);
}
void numa_set_preferred(int node);
void numa_set_localalloc(void);
void numa_set_membind(struct bitmask *nodemask);
struct bitmask *numa_get_membind(void);
struct bitmask *numa_get_mems_allowed(void);
int numa_get_interleave_node(void);
void *numa_alloc_interleaved_subset(size_t size, struct bitmask *nodemask);
void *numa_alloc_interleaved(size_t size);
void *numa_alloc_onnode(size_t size, int node);
void *numa_alloc_local(size_t size);
void *numa_alloc(size_t size);
void *numa_realloc(void *old_addr, size_t old_size, size_t new_size);
void numa_free(void *mem, size_t size);
void numa_interleave_memory(void *mem, size_t size, struct bitmask *mask);
void numa_tonode_memory(void *start, size_t size, int node);
void numa_tonodemask_memory(void *mem, size_t size, struct bitmask *mask);
void numa_setlocal_memory(void *start, size_t size);
void numa_police_memory(void *start, size_t size);
int numa_run_on_node_mask(struct bitmask *mask);
int numa_run_on_node_mask_all(struct bitmask *mask);
int numa_run_on_node(int node);
struct bitmask * numa_get_run_node_mask(void);
void numa_set_bind_policy(int strict);
void numa_set_strict(int flag);
int numa_num_possible_nodes();
int numa_num_possible_cpus();
int numa_num_configured_nodes();
int numa_num_configured_cpus();
int numa_num_task_cpus();
int numa_num_thread_cpus();
int numa_num_task_nodes();
int numa_num_thread_nodes();
struct bitmask *numa_allocate_cpumask();
static inline void numa_free_cpumask(struct bitmask *b)
{
numa_bitmask_free(b);
}
int numa_node_to_cpus(int, struct bitmask *);
int numa_node_of_cpu(int cpu);
int numa_distance(int node1, int node2);
void numa_error(char *where);
extern int numa_exit_on_error;
void numa_warn(int num, char *fmt, ...);
extern int numa_exit_on_warn;
int numa_migrate_pages(int pid, struct bitmask *from, struct bitmask *to);
int numa_move_pages(int pid, unsigned long count, void **pages,
const int *nodes, int *status, int flags);
int numa_sched_getaffinity(pid_t, struct bitmask *);
int numa_sched_setaffinity(pid_t, struct bitmask *);
struct bitmask *numa_parse_nodestring(const char *);
struct bitmask *numa_parse_nodestring_all(const char *);
struct bitmask *numa_parse_cpustring(const char *);
struct bitmask *numa_parse_cpustring_all(const char *);
static inline void numa_set_interleave_mask_compat(nodemask_t *nodemask)
{
struct bitmask tmp;
tmp.maskp = (unsigned long *)nodemask;
tmp.size = sizeof(nodemask_t) * 8;
numa_set_interleave_mask(&tmp);
}
static inline nodemask_t numa_get_interleave_mask_compat()
{
struct bitmask *tp;
nodemask_t mask;
tp = numa_get_interleave_mask();
copy_bitmask_to_nodemask(tp, &mask);
numa_bitmask_free(tp);
return mask;
}
static inline void numa_bind_compat(nodemask_t *mask)
{
struct bitmask *tp;
tp = numa_allocate_nodemask();
copy_nodemask_to_bitmask(mask, tp);
numa_bind(tp);
numa_bitmask_free(tp);
}
static inline void numa_set_membind_compat(nodemask_t *mask)
{
struct bitmask tmp;
tmp.maskp = (unsigned long *)mask;
tmp.size = sizeof(nodemask_t) * 8;
numa_set_membind(&tmp);
}
static inline nodemask_t numa_get_membind_compat()
{
struct bitmask *tp;
nodemask_t mask;
tp = numa_get_membind();
copy_bitmask_to_nodemask(tp, &mask);
numa_bitmask_free(tp);
return mask;
}
static inline void *numa_alloc_interleaved_subset_compat(size_t size,
const nodemask_t *mask)
{
struct bitmask tmp;
tmp.maskp = (unsigned long *)mask;
tmp.size = sizeof(nodemask_t) * 8;
return numa_alloc_interleaved_subset(size, &tmp);
}
static inline int numa_run_on_node_mask_compat(const nodemask_t *mask)
{
struct bitmask tmp;
tmp.maskp = (unsigned long *)mask;
tmp.size = sizeof(nodemask_t) * 8;
return numa_run_on_node_mask(&tmp);
}
static inline nodemask_t numa_get_run_node_mask_compat()
{
struct bitmask *tp;
nodemask_t mask;
tp = numa_get_run_node_mask();
copy_bitmask_to_nodemask(tp, &mask);
numa_bitmask_free(tp);
return mask;
}
static inline void numa_interleave_memory_compat(void *mem, size_t size,
const nodemask_t *mask)
{
struct bitmask tmp;
tmp.maskp = (unsigned long *)mask;
tmp.size = sizeof(nodemask_t) * 8;
numa_interleave_memory(mem, size, &tmp);
}
static inline void numa_tonodemask_memory_compat(void *mem, size_t size,
const nodemask_t *mask)
{
struct bitmask tmp;
tmp.maskp = (unsigned long *)mask;
tmp.size = sizeof(nodemask_t) * 8;
numa_tonodemask_memory(mem, size, &tmp);
}
static inline int numa_sched_getaffinity_compat(pid_t pid, unsigned len,
unsigned long *mask)
{
struct bitmask tmp;
tmp.maskp = (unsigned long *)mask;
tmp.size = len * 8;
return numa_sched_getaffinity(pid, &tmp);
}
static inline int numa_sched_setaffinity_compat(pid_t pid, unsigned len,
unsigned long *mask)
{
struct bitmask tmp;
tmp.maskp = (unsigned long *)mask;
tmp.size = len * 8;
return numa_sched_setaffinity(pid, &tmp);
}
static inline int numa_node_to_cpus_compat(int node, unsigned long *buffer,
int buffer_len)
{
struct bitmask tmp;
tmp.maskp = (unsigned long *)buffer;
tmp.size = buffer_len * 8;
return numa_node_to_cpus(node, &tmp);
}
#ifdef NUMA_VERSION1_COMPATIBILITY
#include <numacompat1.h>
#endif
#ifdef __cplusplus
}
#endif
#endif