/* * vmem_create -- create a memory pool in a temp file */ VMEM * vmem_create(const char *dir, size_t size) { vmem_init(); LOG(3, "dir \"%s\" size %zu", dir, size); if (size < VMEM_MIN_POOL) { ERR("size %zu smaller than %zu", size, VMEM_MIN_POOL); errno = EINVAL; return NULL; } /* silently enforce multiple of page size */ size = roundup(size, Pagesize); void *addr; if ((addr = util_map_tmpfile(dir, size, 4 << 20)) == NULL) return NULL; /* store opaque info at beginning of mapped area */ struct vmem *vmp = addr; memset(&vmp->hdr, '\0', sizeof (vmp->hdr)); memcpy(vmp->hdr.signature, VMEM_HDR_SIG, POOL_HDR_SIG_LEN); vmp->addr = addr; vmp->size = size; vmp->caller_mapped = 0; /* Prepare pool for jemalloc */ if (je_vmem_pool_create((void *)((uintptr_t)addr + Header_size), size - Header_size, 1) == NULL) { ERR("pool creation failed"); util_unmap(vmp->addr, vmp->size); return NULL; } /* * If possible, turn off all permissions on the pool header page. * * The prototype PMFS doesn't allow this when large pages are in * use. It is not considered an error if this fails. */ util_range_none(addr, sizeof (struct pool_hdr)); LOG(3, "vmp %p", vmp); return vmp; }
/* * is_pmem -- checks if given path points to pmem-aware filesystem */ static int is_pmem(const char *path) { int ret; void *addr = util_map_tmpfile(path, SIZE, 0); if (addr == NULL) { fprintf(stderr, "file creation failed\n"); return -1; } if (pmem_is_pmem(addr, SIZE)) ret = 1; else ret = 0; util_unmap(addr, SIZE); return ret; }