From 4b359de75fe85f481d889d0c0ace4086cb130088 Mon Sep 17 00:00:00 2001 From: "Erik M. Bray" Date: Thu, 28 Feb 2019 12:15:26 +0100 Subject: [PATCH] Trac #27214: Patch GAP to allocate its memory pool using MAP_NORESERVE on Cygwin --- ...cPool-0-for-Cygwin-but-do-use-MAP_NO.patch | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 build/pkgs/gap/patches/0004-Don-t-set-SyAllocPool-0-for-Cygwin-but-do-use-MAP_NO.patch diff --git a/build/pkgs/gap/patches/0004-Don-t-set-SyAllocPool-0-for-Cygwin-but-do-use-MAP_NO.patch b/build/pkgs/gap/patches/0004-Don-t-set-SyAllocPool-0-for-Cygwin-but-do-use-MAP_NO.patch new file mode 100644 index 00000000000..262f16f68ad --- /dev/null +++ b/build/pkgs/gap/patches/0004-Don-t-set-SyAllocPool-0-for-Cygwin-but-do-use-MAP_NO.patch @@ -0,0 +1,78 @@ +From 78506f0a4fba05a238ec6e752c6d3cf2c8336bc8 Mon Sep 17 00:00:00 2001 +From: "Erik M. Bray" +Date: Tue, 26 Feb 2019 13:26:11 +0100 +Subject: [PATCH] Don't set SyAllocPool = 0 for Cygwin, but do use + MAP_NORESERVE for mmaps on Cygwin + +Using MAP_NORESERVE on Cygwin prevents the need to commit physical pages +for the entirety of mmap'd regions until they are actually used. +--- + src/sysmem.c | 16 +++++++++++----- + src/system.c | 4 ---- + 2 files changed, 11 insertions(+), 9 deletions(-) + +diff --git a/src/sysmem.c b/src/sysmem.c +index 68a397b2f..995765828 100644 +--- a/src/sysmem.c ++++ b/src/sysmem.c +@@ -282,6 +282,12 @@ int SyTryToIncreasePool(void) + #define MAP_ANONYMOUS MAP_ANON + #endif + ++#ifdef SYS_IS_CYGWIN32 ++#define GAP_MMAP_FLAGS MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE ++#else ++#define GAP_MMAP_FLAGS MAP_PRIVATE|MAP_ANONYMOUS ++#endif ++ + static void *SyMMapStart = NULL; /* Start of mmap'ed region for POOL */ + static void *SyMMapEnd; /* End of mmap'ed region for POOL */ + static void *SyMMapAdvised; /* We have already advised about non-usage +@@ -342,15 +348,15 @@ void *SyAnonMMap(size_t size) { + size = SyRoundUpToPagesize(size); + #ifdef SYS_IS_64_BIT + /* The following is at 16 Terabyte: */ +- result = mmap((void *) (16L*1024*1024*1024*1024), size, +- PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); ++ result = mmap((void *) (16L*1024*1024*1024*1024), size, ++ PROT_READ|PROT_WRITE, GAP_MMAP_FLAGS, -1, 0); + if (result == MAP_FAILED) { + result = mmap(NULL, size, PROT_READ|PROT_WRITE, +- MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); ++ GAP_MMAP_FLAGS, -1, 0); + } + #else + result = mmap(NULL, size, PROT_READ|PROT_WRITE, +- MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); ++ GAP_MMAP_FLAGS, -1, 0); + #endif + if (result == MAP_FAILED) + result = NULL; +@@ -371,7 +377,7 @@ int SyTryToIncreasePool(void) + size = (Int) SyMMapEnd - (Int) SyMMapStart; + newchunk = SyRoundUpToPagesize(size/2); + result = mmap(SyMMapEnd, newchunk, PROT_READ|PROT_WRITE, +- MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); ++ GAP_MMAP_FLAGS, -1, 0); + if (result == MAP_FAILED) return -1; + if (result != SyMMapEnd) { + munmap(result,newchunk); +diff --git a/src/system.c b/src/system.c +index 7423d76bc..6f4c03517 100644 +--- a/src/system.c ++++ b/src/system.c +@@ -1133,11 +1133,7 @@ void InitSystem ( + #else + SyStorMin = 64 * 1024L; + SyStorMax = 1024*1024L; /* This is in kB! */ +-#ifdef SYS_IS_CYGWIN32 +- SyAllocPool = 0; /* works better on cygwin */ +-#else + SyAllocPool = 1536L*1024*1024; /* Note this is in bytes! */ +-#endif + #endif + SyStorOverrun = 0; + SyStorKill = 0; +-- +2.15.1 +