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; } }
/** * 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); }
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; }
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; }
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; }