diff --git a/src/main/java/org/cojen/tupl/io/PosixMappedPageArray.java b/src/main/java/org/cojen/tupl/io/PosixMappedPageArray.java index 4518aeeab..198e22a23 100644 --- a/src/main/java/org/cojen/tupl/io/PosixMappedPageArray.java +++ b/src/main/java/org/cojen/tupl/io/PosixMappedPageArray.java @@ -61,17 +61,7 @@ class PosixMappedPageArray extends MappedPageArray { long mappingSize = pageSize * pageCount; long addr = PosixFileIO.mmapFd(mappingSize, prot, flags, -1, 0); - if (mappingSize >= (1L << 30) && Platform.isLinux()) { - try { - PosixFileIO.madvisePtr(addr, mappingSize, 14); // 14 = MADV_HUGEPAGE - } catch (IOException e) { - if (listener != null) { - listener.notify - (EventType.CACHE_INIT_INFO, - "Unable to allocate using transparent huge pages"); - } - } - } + hugePages(addr, mappingSize, listener); setMappingPtr(addr); @@ -135,6 +125,12 @@ class PosixMappedPageArray extends MappedPageArray { if (options.contains(OpenOption.RANDOM_ACCESS)) { PosixFileIO.madvisePtr(addr, mappingSize, 1); // 1 = POSIX_MADV_RANDOM } + + if (options.contains(OpenOption.NON_DURABLE)) { + // Only works when /sys/kernel/mm/transparent_hugepage/shmem_enabled is set to + // 'advise' or some other appropriate value. + hugePages(addr, mappingSize, listener); + } } catch (IOException e) { try { PosixFileIO.closeFd(fd); @@ -149,6 +145,20 @@ class PosixMappedPageArray extends MappedPageArray { setMappingPtr(addr); } + private static void hugePages(long addr, long mappingSize, EventListener listener) { + if (mappingSize >= (1L << 30) && Platform.isLinux()) { + try { + PosixFileIO.madvisePtr(addr, mappingSize, 14); // 14 = MADV_HUGEPAGE + } catch (IOException e) { + if (listener != null) { + listener.notify + (EventType.CACHE_INIT_INFO, + "Unable to allocate using transparent huge pages"); + } + } + } + } + @Override public long pageCount() { return mEmpty ? 0 : super.pageCount();