-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256
Please recall that I reported about a month ago, a new problem, with allocateJITMemory(). That function is new since about late July 2021.
sqAllocateMemorySegmentOfSizeAboveAllocatedSizeInto mmap: Not enough space sqAllocateMemory: initial alloc failed!
This error happens on Solaris 11.3 and OpenIndiana, but not on Solaris 11.4.
It still happens with VMMaker.oscog-eem.3047 but I believe I have a patch now.
bash-4.4$ products/sqcogspursunosht/usr/bin/squeak $HOME/squeak/v5/Squeak6.0alpha-19843-32bit.image sqAllocateMemory: initial alloc failed!
bash-4.4$ products/sqcogspursunosht/usr/bin/squeak -version $HOME/squeak/v5/Squeak6.0alpha-19843-32bit.image 5.0-202108291033-OpenSmalltalk-Cog Sun Aug 29 13:27:29 CEST 2021 cc [Production Spur VM] CoInterpreter VMMaker.oscog-eem.3047 uuid: 548d0a5b-eb23-4df6-bbb1-0b431cc840b3 Aug 29 2021 StackToRegisterMappingCogit VMMaker.oscog-eem.3047 uuid: 548d0a5b-eb23-4df6-bbb1-0b431cc840b3 Aug 29 2021
I have been succesfully using a patch since about 3 weeks that seems to fix the issue.
All patches can be found at:
https://github.com/OpenIndiana/oi-userland/tree/oi/hipster/components/runtim...
In this case - it only affects the COG VM - the patch is:
09-sqUnixSpurMemory.patch
https://github.com/OpenIndiana/oi-userland/tree/oi/hipster/components/runtim...
Basically I copied old code which is doing alignment and pasted it into allocateJITMemory() :
+++ p0/opensmalltalk-vm-sun-v5.0.34/platforms/unix/vm/sqUnixSpurMemory.c Sun Aug 15 14:11:58 2021 @@ -277,16 +277,21 @@ { void *hint = sbrk(0); // a hint of the lowest possible address for mmap void *result; + char *address; + unsigned long alignment;
pageSize = getpagesize(); pageMask = ~(pageSize - 1);
+ alignment = max(pageSize,1024*1024); + address = (char *)(((usqInt)hint + alignment - 1) & ~(alignment - 1)); + #if !defined(MAP_JIT) # define MAP_JIT 0 #endif
*desiredSize = roundUpToPage(*desiredSize); - - result = mmap(hint, *desiredSize, + result = mmap(address, *desiredSize, #if DUAL_MAPPED_CODE_ZONE PROT_READ | PROT_EXEC, #else
I have been using this succesfully as follows.
bash-4.4$ patch -p1 < 09-sqUnixSpurMemory.patch patching file platforms/unix/vm/sqUnixSpurMemory.c
Basically when running this in "dbx"
(2) stop change `squeak`sqUnixSpurMemory.c`pageSize
=>[1] allocateJITMemory(desiredSize = 0x826710) (optimized), at 0x5627d5 (line ~ 282) in "sqUnixSpurMemory.c" [2] readImageFromFileHeapSizeStartingAt(f = 3, desiredHeapSize = <value unavai lable>, imageOffset = <value unavailable>) (optimized), at 0x4e1968 (line ~21170 ) in "cointerp.c" [3] imgInit() (optimized), at 0x4c8e84 (line ~1992) in "sqUnixMain.c" [4] main(argc = 2, argv = 0xffff80ffbfffed78, envp = <value unavailable>) (opt imized), at 0x4c8ffd (line ~2110) in "sqUnixMain.c"
I had the impression that allocateJITMemory() which is a new function, is not doing the same alignment computation as the old code which was working.
I compared with the alignment code in sqAllocateMemorySegmentOfSizeAboveAllocatedSizeInto()
sqAllocateMemorySegmentOfSizeAboveAllocatedSizeInto() is using a different, alignment computation ...
So out of considerations of symmetry or compatibility, I guessed that perhaps it could be related to alignment and the details of how mmap() works on Solaris 11.3 versus Solaris 11.4.
Indeed when copying/pasting the old alignment computation it works again, on OpenIndiana and Solaris 11.3.
With that SpurMemory.c patch, 32bit and 64bit work again, CoInterpreter VMMaker.oscog-eem.3047 uuid
Solaris 11.4 is not affected by the new issue, but I tested that the alignment fix also works on Solaris 11.4.
What do you think, is it a good fix, can this be added please to allocateJITMemory ?
Thanks, David Stes
vm-dev@lists.squeakfoundation.org