/** * get_hugepage_region - Allocate an amount of memory backed by huge pages * * len: Size of the region to allocate * flags: Flags specifying the behaviour of the function * * This function allocates a region of memory backed by huge pages. Care should * be taken when using this function as a drop-in replacement for malloc() as * memory can be wasted if the length is not hugepage-aligned. This function * is more relaxed than get_huge_pages() in that it allows fallback to small * pages when requested. */ void *get_hugepage_region(size_t len, ghr_t flags) { size_t aligned_len, wastage; void *buf; /* Catch an altogether-too easy typo */ if (flags & GHP_MASK) ERROR("Improper use of GHP_* in get_hugepage_region()\n"); /* Align the len parameter to a hugepage boundary and allocate */ aligned_len = ALIGN(len, gethugepagesize()); buf = get_huge_pages(aligned_len, GHP_DEFAULT); if (buf == NULL && (flags & GHR_FALLBACK)) { aligned_len = ALIGN(len, getpagesize()); buf = fallback_base_pages(len, flags); } /* Calculate wastage for coloring */ wastage = aligned_len - len; if (wastage != 0 && !(flags & GHR_COLOR)) DEBUG("get_hugepage_region: Wasted %zd bytes due to alignment\n", wastage); /* Only colour if requested */ if (flags & GHR_COLOR) buf = cachecolor(buf, len, wastage); return buf; }
void* chpl_comm_ofi_hp_get_huge_pages(size_t size) { return get_huge_pages(size, GHP_DEFAULT); }