Blame test/realloc_test.c

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
}