MEMKIND_EXPORT void *memkind_default_mmap(struct memkind *kind, void *addr, size_t size) { void *result = MAP_FAILED; int err = 0; int flags; if (kind->ops->get_mmap_flags) { err = kind->ops->get_mmap_flags(kind, &flags); } else { err = memkind_default_get_mmap_flags(kind, &flags); } if (MEMKIND_LIKELY(!err)) { result = mmap(addr, size, PROT_READ | PROT_WRITE, flags, -1, 0); if (result == MAP_FAILED) { log_err("syscall mmap() returned: %p", result); return result; } } if (kind->ops->mbind) { err = kind->ops->mbind(kind, result, size); if (err) { munmap(result, size); result = MAP_FAILED; } } if (kind->ops->madvise) { err = kind->ops->madvise(kind, result, size); if (err) { munmap(result, size); result = MAP_FAILED; } } return result; }
MEMKIND_EXPORT int memkind_hbw_get_mbind_nodemask(struct memkind *kind, unsigned long *nodemask, unsigned long maxnode) { int cpu; struct bitmask nodemask_bm = {maxnode, nodemask}; struct memkind_hbw_closest_numanode_t *g = &memkind_hbw_closest_numanode_g; pthread_once(&memkind_hbw_closest_numanode_once_g, memkind_hbw_closest_numanode_init); if (MEMKIND_LIKELY(!g->init_err && nodemask)) { numa_bitmask_clearall(&nodemask_bm); cpu = sched_getcpu(); if (MEMKIND_LIKELY(cpu < g->num_cpu)) { numa_bitmask_setbit(&nodemask_bm, g->closest_numanode[cpu]); } else { return MEMKIND_ERROR_RUNTIME; } } return g->init_err; }