As with get_huge_pages it is appropriate to use MAP_HUGETLB for mappings that will hold the heap.
Signed-off-by: Eric B Munson <emun...@mgebm.net> --- morecore.c | 40 ++++++++++++++++++++++++++++++---------- 1 files changed, 30 insertions(+), 10 deletions(-) diff --git a/morecore.c b/morecore.c index e120d55..20c4860 100644 --- a/morecore.c +++ b/morecore.c @@ -73,6 +73,9 @@ static void *hugetlbfs_morecore(ptrdiff_t increment) void *p; long delta; int mmap_reserve = __hugetlb_opts.no_reserve ? MAP_NORESERVE : 0; + int mmap_hugetlb = 0; + int using_default_pagesize = + (hpage_size == kernel_default_hugepage_size()); INFO("hugetlbfs_morecore(%ld) = ...\n", (long)increment); @@ -88,14 +91,24 @@ static void *hugetlbfs_morecore(ptrdiff_t increment) /* align to multiple of hugepagesize. */ delta = ALIGN(delta, hpage_size); +#ifdef MAP_HUGETLB + mmap_hugetlb = MAP_HUGETLB; +#endif + if (delta > 0) { /* growing the heap */ INFO("Attempting to map %ld bytes\n", delta); /* map in (extend) more of the file at the end of our last map */ - p = mmap(heapbase + mapsize, delta, PROT_READ|PROT_WRITE, - MAP_PRIVATE|mmap_reserve, heap_fd, mapsize); + if (__hugetlb_opts.map_hugetlb && using_default_pagesize) + p = mmap(heapbase + mapsize, delta, PROT_READ|PROT_WRITE, + mmap_hugetlb|MAP_ANONYMOUS|MAP_PRIVATE|mmap_reserve, + heap_fd, mapsize); + else + p = mmap(heapbase + mapsize, delta, PROT_READ|PROT_WRITE, + MAP_PRIVATE|mmap_reserve, heap_fd, mapsize); + if (p == MAP_FAILED) { WARNING("New heap segment map at %p failed: %s\n", heapbase+mapsize, strerror(errno)); @@ -166,7 +179,7 @@ static void *hugetlbfs_morecore(ptrdiff_t increment) if (ret) { WARNING("Unmapping failed while shrinking heap: " "%s\n", strerror(errno)); - } else { + } else if (!__hugetlb_opts.map_hugetlb && !using_default_pagesize){ /* * Now shrink the hugetlbfs file. @@ -223,15 +236,22 @@ void hugetlbfs_setup_morecore(void) else WARNING("Hugepage size (%s)\n", strerror(errno)); return; - } else if (!hugetlbfs_find_path_for_size(hpage_size)) { - WARNING("Hugepage size %li unavailable", hpage_size); - return; } - heap_fd = hugetlbfs_unlinked_fd_for_size(hpage_size); - if (heap_fd < 0) { - WARNING("Couldn't open hugetlbfs file for morecore\n"); - return; + if(__hugetlb_opts.map_hugetlb && + hpage_size == kernel_default_hugepage_size()) { + heap_fd = -1; + } else { + if (!hugetlbfs_find_path_for_size(hpage_size)) { + WARNING("Hugepage size %li unavailable", hpage_size); + return; + } + + heap_fd = hugetlbfs_unlinked_fd_for_size(hpage_size); + if (heap_fd < 0) { + WARNING("Couldn't open hugetlbfs file for morecore\n"); + return; + } } if (__hugetlb_opts.heapbase) { -- 1.7.1 ------------------------------------------------------------------------------ Increase Visibility of Your 3D Game App & Earn a Chance To Win $500! Tap into the largest installed PC base & get more eyes on your game by optimizing for Intel(R) Graphics Technology. Get started today with the Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs. http://p.sf.net/sfu/intelisp-dev2dev _______________________________________________ Libhugetlbfs-devel mailing list Libhugetlbfs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libhugetlbfs-devel