|
Packit Service |
db5786 |
#include <assert.h>
|
|
Packit Service |
db5786 |
#include <errno.h>
|
|
Packit Service |
db5786 |
#include <limits.h>
|
|
Packit Service |
db5786 |
#include <unistd.h>
|
|
Packit Service |
db5786 |
#include <stdlib.h>
|
|
Packit Service |
db5786 |
#include <stdio.h>
|
|
Packit Service |
db5786 |
#include <sys/mman.h>
|
|
Packit Service |
db5786 |
#include "numa.h"
|
|
Packit Service |
db5786 |
#include "numaif.h"
|
|
Packit Service |
db5786 |
|
|
Packit Service |
db5786 |
#define DEFAULT_NR_PAGES 1024
|
|
Packit Service |
db5786 |
|
|
Packit Service |
db5786 |
static int parse_int(const char *str)
|
|
Packit Service |
db5786 |
{
|
|
Packit Service |
db5786 |
char *endptr;
|
|
Packit Service |
db5786 |
long ret = strtol(str, &endptr, 0);
|
|
Packit Service |
db5786 |
if (*endptr != '\0') {
|
|
Packit Service |
db5786 |
fprintf(stderr, "[error] strtol() failed: parse error: %s\n", endptr);
|
|
Packit Service |
db5786 |
exit(1);
|
|
Packit Service |
db5786 |
}
|
|
Packit Service |
db5786 |
|
|
Packit Service |
db5786 |
if (errno == ERANGE)
|
|
Packit Service |
db5786 |
fprintf(stderr, "[warning] strtol() out of range\n");
|
|
Packit Service |
db5786 |
|
|
Packit Service |
db5786 |
if (ret > INT_MAX || ret < INT_MIN) {
|
|
Packit Service |
db5786 |
fprintf(stderr, "[warning] parse_int() out of range\n");
|
|
Packit Service |
db5786 |
ret = (ret > 0) ? INT_MAX : INT_MIN;
|
|
Packit Service |
db5786 |
}
|
|
Packit Service |
db5786 |
|
|
Packit Service |
db5786 |
return (int) ret;
|
|
Packit Service |
db5786 |
}
|
|
Packit Service |
db5786 |
|
|
Packit Service |
db5786 |
int main(int argc, char **argv)
|
|
Packit Service |
db5786 |
{
|
|
Packit Service |
db5786 |
char *mem;
|
|
Packit Service |
db5786 |
int page_size = numa_pagesize();
|
|
Packit Service |
db5786 |
int node = 0;
|
|
Packit Service |
db5786 |
int nr_pages = DEFAULT_NR_PAGES;
|
|
Packit Service |
db5786 |
|
|
Packit Service |
db5786 |
if (numa_available() < 0) {
|
|
Packit Service |
db5786 |
fprintf(stderr, "numa is not available");
|
|
Packit Service |
db5786 |
exit(1);
|
|
Packit Service |
db5786 |
}
|
|
Packit Service |
db5786 |
|
|
Packit Service |
db5786 |
if (argc > 1)
|
|
Packit Service |
db5786 |
node = parse_int(argv[1]);
|
|
Packit Service |
db5786 |
if (argc > 2)
|
|
Packit Service |
db5786 |
nr_pages = parse_int(argv[2]);
|
|
Packit Service |
db5786 |
|
|
Packit Service |
db5786 |
mem = numa_alloc_onnode(page_size, node);
|
|
Packit Service |
db5786 |
|
|
Packit Service |
db5786 |
/* Store the policy of the newly allocated area */
|
|
Packit Service |
db5786 |
unsigned long nodemask;
|
|
Packit Service |
db5786 |
int mode;
|
|
Packit Service |
db5786 |
int nr_nodes = numa_num_possible_nodes();
|
|
Packit Service |
db5786 |
if (get_mempolicy(&mode, &nodemask, nr_nodes, mem,
|
|
Packit Service |
db5786 |
MPOL_F_NODE | MPOL_F_ADDR) < 0) {
|
|
Packit Service |
db5786 |
perror("get_mempolicy() failed");
|
|
Packit Service |
db5786 |
exit(1);
|
|
Packit Service |
db5786 |
}
|
|
Packit Service |
db5786 |
|
|
Packit Service |
db5786 |
/* Print some info */
|
|
Packit Service |
db5786 |
printf("Page size: %d\n", page_size);
|
|
Packit Service |
db5786 |
printf("Pages realloc'ed: %d\n", nr_pages);
|
|
Packit Service |
db5786 |
printf("Allocate data in node: %d\n", node);
|
|
Packit Service |
db5786 |
|
|
Packit Service |
db5786 |
int i;
|
|
Packit Service |
db5786 |
int nr_inplace = 0;
|
|
Packit Service |
db5786 |
int nr_moved = 0;
|
|
Packit Service |
db5786 |
for (i = 0; i < nr_pages; i++) {
|
|
Packit Service |
db5786 |
/* Enlarge mem with one more page */
|
|
Packit Service |
db5786 |
char *new_mem = numa_realloc(mem, (i+1)*page_size, (i+2)*page_size);
|
|
Packit Service |
db5786 |
if (!new_mem) {
|
|
Packit Service |
db5786 |
perror("numa_realloc() failed");
|
|
Packit Service |
db5786 |
exit(1);
|
|
Packit Service |
db5786 |
}
|
|
Packit Service |
db5786 |
|
|
Packit Service |
db5786 |
if (new_mem == mem)
|
|
Packit Service |
db5786 |
++nr_inplace;
|
|
Packit Service |
db5786 |
else
|
|
Packit Service |
db5786 |
++nr_moved;
|
|
Packit Service |
db5786 |
mem = new_mem;
|
|
Packit Service |
db5786 |
|
|
Packit Service |
db5786 |
/* Check the policy of the realloc'ed area */
|
|
Packit Service |
db5786 |
unsigned long realloc_nodemask;
|
|
Packit Service |
db5786 |
int realloc_mode;
|
|
Packit Service |
db5786 |
if (get_mempolicy(&realloc_mode, &realloc_nodemask,
|
|
Packit Service |
db5786 |
nr_nodes, mem, MPOL_F_NODE | MPOL_F_ADDR) < 0) {
|
|
Packit Service |
db5786 |
perror("get_mempolicy() failed");
|
|
Packit Service |
db5786 |
exit(1);
|
|
Packit Service |
db5786 |
}
|
|
Packit Service |
db5786 |
|
|
Packit Service |
db5786 |
assert(realloc_nodemask == nodemask &&
|
|
Packit Service |
db5786 |
realloc_mode == mode && "policy changed");
|
|
Packit Service |
db5786 |
}
|
|
Packit Service |
db5786 |
|
|
Packit Service |
db5786 |
/* Shrink to the original size */
|
|
Packit Service |
db5786 |
mem = numa_realloc(mem, (nr_pages + 1)*page_size, page_size);
|
|
Packit Service |
db5786 |
if (!mem) {
|
|
Packit Service |
db5786 |
perror("numa_realloc() failed");
|
|
Packit Service |
db5786 |
exit(1);
|
|
Packit Service |
db5786 |
}
|
|
Packit Service |
db5786 |
|
|
Packit Service |
db5786 |
numa_free(mem, page_size);
|
|
Packit Service |
db5786 |
printf("In-place reallocs: %d\n", nr_inplace);
|
|
Packit Service |
db5786 |
printf("Moved reallocs: %d\n", nr_moved);
|
|
Packit Service |
db5786 |
return 0;
|
|
Packit Service |
db5786 |
}
|