From 484ca0d45783dc5caec8d6194bea0b6f90088bdc Mon Sep 17 00:00:00 2001 From: Christian Haeubl Date: Fri, 11 Jul 2025 17:23:34 +0200 Subject: [PATCH] Fix options ReservedAddressSpaceSize and MaxReservedAddressSpaceSize. --- .../genscavenge/AddressRangeCommittedMemoryProvider.java | 9 ++++++--- .../src/com/oracle/svm/core/IsolateArgumentParser.java | 9 ++++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/AddressRangeCommittedMemoryProvider.java b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/AddressRangeCommittedMemoryProvider.java index ed7c7c4b9c47..35d63d4bed6b 100644 --- a/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/AddressRangeCommittedMemoryProvider.java +++ b/substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/AddressRangeCommittedMemoryProvider.java @@ -144,13 +144,16 @@ public AddressRangeCommittedMemoryProvider() { @Override @Uninterruptible(reason = "Still being initialized.") public int initialize(WordPointer heapBasePointer, IsolateArguments arguments) { - UnsignedWord maxAddressSpaceSize = ReferenceAccess.singleton().getMaxAddressSpaceSize(); UnsignedWord reserved = Word.unsigned(IsolateArgumentAccess.readLong(arguments, IsolateArgumentParser.getOptionIndex(SubstrateGCOptions.ReservedAddressSpaceSize))); if (reserved.equal(0)) { - /* Reserve a 32 GB address space, except if a larger heap size was specified. */ + /* + * Reserve a 32 GB address space, except if a larger heap size was specified, or if the + * maximum address space size is less than that. + */ UnsignedWord maxHeapSize = Word.unsigned(IsolateArgumentAccess.readLong(arguments, IsolateArgumentParser.getOptionIndex(SubstrateGCOptions.MaxHeapSize))); - reserved = UnsignedUtils.clamp(maxHeapSize, Word.unsigned(MIN_RESERVED_ADDRESS_SPACE_SIZE), maxAddressSpaceSize); + reserved = UnsignedUtils.max(maxHeapSize, Word.unsigned(MIN_RESERVED_ADDRESS_SPACE_SIZE)); } + reserved = UnsignedUtils.min(reserved, ReferenceAccess.singleton().getMaxAddressSpaceSize()); UnsignedWord alignment = unsigned(Heap.getHeap().getPreferredAddressSpaceAlignment()); WordPointer beginOut = StackValue.get(WordPointer.class); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/IsolateArgumentParser.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/IsolateArgumentParser.java index 98085dd7cdd6..24de917ab0ed 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/IsolateArgumentParser.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/IsolateArgumentParser.java @@ -389,7 +389,14 @@ protected void initialize(IsolateArguments arguments, CEntryPointCreateIsolatePa arguments.setIsCompilationIsolate(false); } - writeLong(arguments, getOptionIndex(SubstrateGCOptions.ReservedAddressSpaceSize), parameters.reservedSpaceSize().rawValue()); + /* + * If a value for ReservedAddressSpaceSize is set in the isolate parameters, then this value + * has a higher priority than a default value that was set at build-time. + */ + UnsignedWord reservedAddressSpaceSize = parameters.reservedSpaceSize(); + if (reservedAddressSpaceSize.notEqual(0)) { + writeLong(arguments, getOptionIndex(SubstrateGCOptions.ReservedAddressSpaceSize), reservedAddressSpaceSize.rawValue()); + } } @Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)