Skip to content

Commit 5b5acde

Browse files
committed
Use small page size/flags for Sparse Virtual Memory
Currently Sparse Virtual Memory uses page size Object Heap is allocated with. We want to use small pages for Sparse Heap always regardless. Also Sparse Virtual Memory uses page flags "requested" for Object Heap. This is the bug. Page flags should be paired with the page size. Please note, that current MM_SparseVirtualMemory implementation can use double mapping instead of off-heap. This is an experimental feature never used in the code and not planned to be used. This feature uses hidden assumption that memory page size/flags should be the same for Object and Sparse heaps. This PR can break it potentially in the case memory page settings in the Object Heap and Sparse heap are different. We are going to be aware about this if we need another round of experimental testing with double mapping support. Signed-off-by: Dmitri Pivkine <[email protected]>
1 parent 80c9b37 commit 5b5acde

File tree

4 files changed

+22
-8
lines changed

4 files changed

+22
-8
lines changed

gc/base/GCExtensionsBase.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,10 @@ MM_GCExtensionsBase::initialize(MM_EnvironmentBase* env)
135135
gcmetadataPageSize = pageSizes[0];
136136
gcmetadataPageFlags = OMRPORT_VMEM_PAGE_FLAG_NOT_USED;
137137

138+
sparseHeapPageSize = pageSizes[0];
139+
sparseHeapPageFlags = OMRPORT_VMEM_PAGE_FLAG_NOT_USED;
140+
141+
138142
#define SIXTY_FOUR_KB ((uintptr_t)64 * 1024)
139143
#define ONE_MB ((uintptr_t)1 * 1024 * 1024)
140144
#define TWO_MB ((uintptr_t)2 * 1024 * 1024)
@@ -160,6 +164,10 @@ MM_GCExtensionsBase::initialize(MM_EnvironmentBase* env)
160164
gcmetadataPageFlags = pageFlags[0];
161165
}
162166

167+
if (!validateDefaultPageParameters(sparseHeapPageSize, sparseHeapPageFlags, pageSizes, pageFlags)) {
168+
sparseHeapPageSize = pageSizes[0];
169+
sparseHeapPageFlags = pageFlags[0];
170+
}
163171

164172
if (!_forge.initialize(env->getPortLibrary())) {
165173
goto failed;

gc/base/GCExtensionsBase.hpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -281,10 +281,13 @@ class MM_GCExtensionsBase : public MM_BaseVirtual {
281281
#endif /* OMR_GC_DOUBLE_MAP_ARRAYLETS */
282282
bool isVirtualLargeObjectHeapRequested;
283283
bool isVirtualLargeObjectHeapEnabled;
284-
uintptr_t requestedPageSize;
285-
uintptr_t requestedPageFlags;
286-
uintptr_t gcmetadataPageSize;
287-
uintptr_t gcmetadataPageFlags;
284+
285+
uintptr_t requestedPageSize; /**< Memory page size for Object Heap */
286+
uintptr_t requestedPageFlags; /**< Memory page flags for Object Heap */
287+
uintptr_t gcmetadataPageSize; /**< Memory page size for GC Meta data */
288+
uintptr_t gcmetadataPageFlags; /**< Memory page flags for GC Meta data */
289+
uintptr_t sparseHeapPageSize; /**< Memory page size for Sparse Object Heap */
290+
uintptr_t sparseHeapPageFlags; /**< Memory page flags for Sparse Object Heap */
288291

289292
#if defined(OMR_GC_MODRON_SCAVENGER)
290293
MM_SublistPool rememberedSet;
@@ -1516,6 +1519,8 @@ class MM_GCExtensionsBase : public MM_BaseVirtual {
15161519
, requestedPageFlags(OMRPORT_VMEM_PAGE_FLAG_NOT_USED)
15171520
, gcmetadataPageSize(0)
15181521
, gcmetadataPageFlags(OMRPORT_VMEM_PAGE_FLAG_NOT_USED)
1522+
, sparseHeapPageSize(0)
1523+
, sparseHeapPageFlags(OMRPORT_VMEM_PAGE_FLAG_NOT_USED)
15191524
#if defined(OMR_GC_MODRON_SCAVENGER)
15201525
, rememberedSet()
15211526
, oldHeapSizeOnLastGlobalGC(UDATA_MAX)

gc/base/SparseVirtualMemory.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,15 @@
4545
****************************************
4646
*/
4747

48-
MM_SparseVirtualMemory*
48+
MM_SparseVirtualMemory *
4949
MM_SparseVirtualMemory::newInstance(MM_EnvironmentBase* env, uint32_t memoryCategory, MM_Heap *in_heap)
5050
{
51+
MM_GCExtensionsBase *extensions = env->getExtensions();
5152
MM_SparseVirtualMemory* vmem = NULL;
5253
vmem = (MM_SparseVirtualMemory*)env->getForge()->allocate(sizeof(MM_SparseVirtualMemory), OMR::GC::AllocationCategory::FIXED, OMR_GET_CALLSITE());
5354

5455
if (vmem) {
55-
new (vmem) MM_SparseVirtualMemory(env, in_heap->getPageSize(), in_heap);
56+
new (vmem) MM_SparseVirtualMemory(env, extensions->sparseHeapPageSize, extensions->sparseHeapPageFlags, in_heap);
5657
if (!vmem->initialize(env, memoryCategory)) {
5758
vmem->kill(env);
5859
vmem = NULL;

gc/base/SparseVirtualMemory.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ class MM_SparseVirtualMemory : public MM_VirtualMemory {
8484
bool initialize(MM_EnvironmentBase* env, uint32_t memoryCategory);
8585
void tearDown(MM_EnvironmentBase *env);
8686

87-
MM_SparseVirtualMemory(MM_EnvironmentBase* env, uintptr_t pageSize, MM_Heap *in_heap)
88-
: MM_VirtualMemory(env, env->getExtensions()->heapAlignment, pageSize, env->getExtensions()->requestedPageFlags, 0, OMRPORT_VMEM_MEMORY_MODE_READ | OMRPORT_VMEM_MEMORY_MODE_WRITE)
87+
MM_SparseVirtualMemory(MM_EnvironmentBase* env, uintptr_t pageSize, uintptr_t pageFlags, MM_Heap *in_heap)
88+
: MM_VirtualMemory(env, env->getExtensions()->heapAlignment, pageSize, pageFlags, 0, OMRPORT_VMEM_MEMORY_MODE_READ | OMRPORT_VMEM_MEMORY_MODE_WRITE)
8989
, _heap(in_heap)
9090
, _sparseDataPool(NULL)
9191
, _largeObjectVirtualMemoryMutex(NULL)

0 commit comments

Comments
 (0)