From 3002c4113ee64f5317bc4242862216f0d241bd11 Mon Sep 17 00:00:00 2001 From: Martijn Dekker Date: Tue, 2 Feb 2021 05:33:24 +0000 Subject: [PATCH] vmalloc: better detect default region size on Linux This is a Linux-specific fix for vmalloc from OpenSUSE, for what that's still worth; we're not going to keep using vmalloc long term. https://build.opensuse.org/package/view_file/shells/ksh/ksh93-vm.dif --- src/lib/libast/vmalloc/vmhdr.h | 3 +++ src/lib/libast/vmalloc/vmmopen.c | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/lib/libast/vmalloc/vmhdr.h b/src/lib/libast/vmalloc/vmhdr.h index 3a70acd713d2..ae1f5fc7a936 100644 --- a/src/lib/libast/vmalloc/vmhdr.h +++ b/src/lib/libast/vmalloc/vmhdr.h @@ -152,6 +152,9 @@ extern void _vmmessage _ARG_((const char*, long, const char*, long)); #endif /*DEBUG*/ #define VMPAGESIZE 8192 +#if defined(__linux__) && !defined(_lib_getpagesize) +#define _lib_getpagesize 1 +#endif #if _lib_getpagesize #define GETPAGESIZE(x) ((x) ? (x) : ((x)=getpagesize()) ) #else diff --git a/src/lib/libast/vmalloc/vmmopen.c b/src/lib/libast/vmalloc/vmmopen.c index a59de04a3d58..765aeb83a9a2 100644 --- a/src/lib/libast/vmalloc/vmmopen.c +++ b/src/lib/libast/vmalloc/vmmopen.c @@ -63,8 +63,10 @@ void _STUB_vmmapopen(){} /* magic word signaling file/segment is ready */ #define MM_MAGIC ((unsigned int)(('P'<<24) | ('&'<<16) | ('N'<<8) | ('8')) ) +#ifndef __linux__ /* default minimum region size */ #define MM_MINSIZE (64*_Vmpagesize) +#endif /* macros to get the data section and size */ #define MMHEAD(file) ROUND(sizeof(Mmvm_t)+strlen(file), ALIGN) @@ -167,9 +169,18 @@ static int mminit(Mmdisc_t* mmdc) if(mmdc->mmvm) /* already done this */ return 0; +#ifndef __linux__ /* fixed size region so make it reasonably large */ if((size = mmdc->size) < MM_MINSIZE ) size = MM_MINSIZE; +#else /* on Linux */ + if (sizeof(void*) > 32) + extent = ROUND(0x80000,_Vmpagesize); + else + extent = ROUND(0x40000,_Vmpagesize); + if((size = mmdc->size) < extent) + size = extent; +#endif size += MMHEAD(mmdc->file) + ALIGN; size = ROUND(size, _Vmpagesize);