Пример #1
0
void
pmem_dump2console(void)
{
	struct pmem_region query, result;
	int status;

	query.start = 0;
	query.end = 0xfffffffffffffffful; /* ULONG_MAX */
	pmem_region_unset_all(&query);

	print("Physical Memory Map:\n");
	while ((status = pmem_query(&query, &result)) == 0) {
		print("  [%#016lx, %#016lx) %-10s numa_node=%d alloc=%d\n",
			result.start,
			result.end,
			(result.type_is_set)
				? pmem_type_to_string(result.type)
				: "UNSET",
			(result.numa_node_is_set)
				? (int) result.numa_node
				: -1,
			(result.allocated_is_set)
				? (int) result.allocated
				: -1 
		);
		query.start = result.end;
	}
}
Пример #2
0
/**
 * Frees pages previously allocated via palacios_allocate_pages().
 */
static void
palacios_free_pages(
        void *			page_paddr,
	int                     num_pages
) 
{
	struct pmem_region	query;
	struct pmem_region	result;
	int 			status;

	pmem_region_unset_all(&query);

	query.start		= (uintptr_t) page_paddr;
	query.end		= (uintptr_t) page_paddr + num_pages * PAGE_SIZE;
	query.allocated		= true;
	query.allocated_is_set	= true;

	status = pmem_query(&query, &result);
	if (status)
		panic("Freeing page %p failed! query status=%d",
		      page_paddr, status);

	result.allocated = false;
	status = pmem_update(&result);
	if (status)
		panic("Failed to free page %p! (status=%d)",
		      page_paddr, status);
}
Пример #3
0
int
pmem_alloc_umem(size_t size, size_t alignment, struct pmem_region *rgn)
{
	struct pmem_region constraint, result;

	/* Find and allocate a chunk of PMEM_TYPE_UMEM physical memory */
	pmem_region_unset_all(&constraint);
	constraint.start     = 0;
	constraint.end       = (paddr_t)(-1);
	constraint.type      = PMEM_TYPE_UMEM; constraint.type_is_set = true;
	constraint.allocated = false;          constraint.allocated_is_set = true;

	if (pmem_alloc(size, alignment, &constraint, &result))
		return -ENOMEM;

	*rgn = result;
	return 0;
}
Пример #4
0
static int
pmem_api_test(void)
{
	struct pmem_region query, result;
	unsigned long bytes_umem = 0;
	int status;

	printf("\n");
	printf("TEST BEGIN: Physical Memory Management\n");

	query.start = 0;
	query.end = ULONG_MAX;
	pmem_region_unset_all(&query);

	printf("  Physical Memory Map:\n");
	while ((status = pmem_query(&query, &result)) == 0) {
		printf("    [%#016lx, %#016lx) %-10s numa_node=%u\n",
			result.start,
			result.end,
			(result.type_is_set)
				? pmem_type_to_string(result.type)
				: "UNSET",
			(result.numa_node_is_set)
				? result.numa_node
				: 0
		);

		if (result.type == PMEM_TYPE_UMEM)
			bytes_umem += (result.end - result.start);

		query.start = result.end;
	}

	if (status != -ENOENT) {
		printf("ERROR: pmem_query() status=%d\n", status);
		return -1;
	}

	printf("  Total User-Level Managed Memory: %lu bytes\n", bytes_umem);

	printf("TEST END:   Physical Memory Management\n");
	return 0;
}
Пример #5
0
bool
pmem_is_type(pmem_type_t type, paddr_t start, size_t extent)
{
	struct pmem_region query, result;
	int status;

	pmem_region_unset_all(&query);
	query.start = start;
	query.end   = start + extent;
	query.type  = type; query.type_is_set = true; 
	result.end  = 0;

	while ((status = pmem_query(&query, &result)) == 0) {
		if (result.start != query.start)
			return false;
		if (result.end == query.end)
			break;
		query.start = result.end;
	}
	return (status) ? false : true;
}