Skip to content

Commit 4ca46e0

Browse files
authored
Merge pull request #19665 from pshipton/backout0.46
(0.46) Fixup continuation lists for concurrent scavenge backout case
2 parents ba26301 + e49f704 commit 4ca46e0

File tree

3 files changed

+48
-27
lines changed

3 files changed

+48
-27
lines changed

runtime/gc_glue_java/MarkingSchemeRootClearer.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ MM_MarkingSchemeRootClearer::scanContinuationObjects(MM_EnvironmentBase *env)
316316
/* allow the marking scheme to handle this */
317317
reportScanningStarted(RootScannerEntity_ContinuationObjects);
318318
GC_Environment *gcEnv = env->getGCEnvironment();
319+
bool const compressed = _extensions->compressObjectReferences();
319320

320321
MM_HeapRegionDescriptorStandard *region = NULL;
321322
GC_HeapRegionIteratorStandard regionIterator(_extensions->heap->getHeapRegionManager());
@@ -329,6 +330,27 @@ MM_MarkingSchemeRootClearer::scanContinuationObjects(MM_EnvironmentBase *env)
329330
while (NULL != object) {
330331
gcEnv->_markJavaStats._continuationCandidates += 1;
331332
omrobjectptr_t next = _extensions->accessBarrier->getContinuationLink(object);
333+
#if defined(OMR_GC_CONCURRENT_SCAVENGER)
334+
{
335+
/**
336+
* In case of CS backout make sure the list contains the new version of the objects or if there is only one version,
337+
* due to being self-forwarded, restore the self-forwarded bit.
338+
*/
339+
MM_ForwardedHeader forwardHeader(object, compressed);
340+
omrobjectptr_t forwardPtr = forwardHeader.getNonStrictForwardedObject();
341+
342+
if (NULL != forwardPtr) {
343+
Assert_MM_true(_extensions->isConcurrentScavengerEnabled() && _extensions->isScavengerBackOutFlagRaised());
344+
Assert_MM_false(_markingScheme->isMarked(object));
345+
if (forwardHeader.isSelfForwardedPointer()) {
346+
forwardHeader.restoreSelfForwardedPointer();
347+
} else {
348+
object = forwardPtr;
349+
}
350+
}
351+
}
352+
#endif /* OMR_GC_CONCURRENT_SCAVENGER */
353+
332354
if (_markingScheme->isMarked(object) && !VM_ContinuationHelpers::isFinished(*VM_ContinuationHelpers::getContinuationStateAddress((J9VMThread *)env->getLanguageVMThread() , object))) {
333355
/* object was already marked. */
334356
gcEnv->_continuationObjectBuffer->add(env, object);

runtime/gc_glue_java/ScavengerBackOutScanner.cpp

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -59,25 +59,22 @@ MM_ScavengerBackOutScanner::scanAllSlots(MM_EnvironmentBase *env)
5959
/* Walk roots fixing up pointers through reverse forwarding information */
6060
MM_RootScanner::scanAllSlots(env);
6161

62-
if (!_extensions->isConcurrentScavengerEnabled()) {
63-
/* Back out Ownable Synchronizer and Continuation Processing */
64-
MM_HeapRegionDescriptorStandard *region = NULL;
65-
GC_HeapRegionIteratorStandard regionIterator(_extensions->heapRegionManager);
66-
while (NULL != (region = regionIterator.nextRegion())) {
67-
MM_HeapRegionDescriptorStandardExtension *regionExtension = MM_ConfigurationDelegate::getHeapRegionDescriptorStandardExtension(env, region);
68-
for (uintptr_t i = 0; i < regionExtension->_maxListIndex; i++) {
69-
/**
70-
* For Ownable Synchronizers lists, back out all of regions (includes tenure region, which is backed up during startProcessing).
71-
* Tenure list might have gotten new elements during main Scavenge phase and it is important to restore the list, since it will be iterated later during Marking Clearable phase.
72-
*/
73-
regionExtension->_ownableSynchronizerObjectLists[i].backoutList();
74-
if ((MEMORY_TYPE_NEW == (region->getTypeFlags() & MEMORY_TYPE_NEW))) {
75-
/**
76-
* For Continuation lists, Consistent with startProcessing that was earlier (in this GC cycle) called only on NEW regions.
77-
* Tenure list cannot get new elements, since they are added only during Scavenge Clearable phase that cannot be reached if there was a Scavenge abort.
78-
*/
62+
/* Back out Ownable Synchronizer and Continuation Processing */
63+
MM_HeapRegionDescriptorStandard *region = NULL;
64+
GC_HeapRegionIteratorStandard regionIterator(_extensions->heapRegionManager);
65+
66+
while (NULL != (region = regionIterator.nextRegion())) {
67+
MM_HeapRegionDescriptorStandardExtension *regionExtension = MM_ConfigurationDelegate::getHeapRegionDescriptorStandardExtension(env, region);
68+
for (uintptr_t i = 0; i < regionExtension->_maxListIndex; i++) {
69+
if (_extensions->isConcurrentScavengerEnabled()) {
70+
if (_scavenger->isObjectInEvacuateMemory((omrobjectptr_t )region->getLowAddress())) {
71+
/* for concurrent scavenger case, only backout lists in Evacuate region. */
7972
regionExtension->_continuationObjectLists[i].backoutList();
8073
}
74+
} else {
75+
/* Back out all of regions (includes tenure region, which is backed up during startProcessing). */
76+
regionExtension->_ownableSynchronizerObjectLists[i].backoutList();
77+
regionExtension->_continuationObjectLists[i].backoutList();
8178
}
8279
}
8380
}

runtime/gc_glue_java/ScavengerRootScanner.cpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,15 @@
4848
void
4949
MM_ScavengerRootScanner::startContinuationProcessing(MM_EnvironmentBase *env)
5050
{
51-
if(J9MODRON_HANDLE_NEXT_WORK_UNIT(env)) {
51+
if (J9MODRON_HANDLE_NEXT_WORK_UNIT(env)) {
5252
_scavengerDelegate->setShouldScavengeContinuationObjects(false);
5353
_scavengerDelegate->setShouldIterateContinuationObjects(false);
5454

5555
MM_HeapRegionDescriptorStandard *region = NULL;
5656
GC_HeapRegionIteratorStandard regionIterator(env->getExtensions()->getHeap()->getHeapRegionManager());
57-
while(NULL != (region = regionIterator.nextRegion())) {
57+
while (NULL != (region = regionIterator.nextRegion())) {
5858
MM_HeapRegionDescriptorStandardExtension *regionExtension = MM_ConfigurationDelegate::getHeapRegionDescriptorStandardExtension(env, region);
59-
for (UDATA i = 0; i < regionExtension->_maxListIndex; i++) {
59+
for (uintptr_t i = 0; i < regionExtension->_maxListIndex; i++) {
6060
MM_ContinuationObjectList *list = &regionExtension->_continuationObjectLists[i];
6161
if (!list->isEmpty()) {
6262
_scavengerDelegate->setShouldIterateContinuationObjects(true);
@@ -66,6 +66,8 @@ MM_ScavengerRootScanner::startContinuationProcessing(MM_EnvironmentBase *env)
6666
if (!list->wasEmpty()) {
6767
_scavengerDelegate->setShouldScavengeContinuationObjects(true);
6868
}
69+
} else {
70+
list->backupList();
6971
}
7072
}
7173
}
@@ -76,15 +78,15 @@ MM_ScavengerRootScanner::startContinuationProcessing(MM_EnvironmentBase *env)
7678
void
7779
MM_ScavengerRootScanner::startUnfinalizedProcessing(MM_EnvironmentBase *env)
7880
{
79-
if(J9MODRON_HANDLE_NEXT_WORK_UNIT(env)) {
81+
if (J9MODRON_HANDLE_NEXT_WORK_UNIT(env)) {
8082
_scavengerDelegate->setShouldScavengeUnfinalizedObjects(false);
8183

8284
MM_HeapRegionDescriptorStandard *region = NULL;
8385
GC_HeapRegionIteratorStandard regionIterator(env->getExtensions()->getHeap()->getHeapRegionManager());
84-
while(NULL != (region = regionIterator.nextRegion())) {
86+
while (NULL != (region = regionIterator.nextRegion())) {
8587
if ((MEMORY_TYPE_NEW == (region->getTypeFlags() & MEMORY_TYPE_NEW))) {
8688
MM_HeapRegionDescriptorStandardExtension *regionExtension = MM_ConfigurationDelegate::getHeapRegionDescriptorStandardExtension(env, region);
87-
for (UDATA i = 0; i < regionExtension->_maxListIndex; i++) {
89+
for (uintptr_t i = 0; i < regionExtension->_maxListIndex; i++) {
8890
MM_UnfinalizedObjectList *list = &regionExtension->_unfinalizedObjectLists[i];
8991
list->startUnfinalizedProcessing();
9092
if (!list->wasEmpty()) {
@@ -99,7 +101,7 @@ MM_ScavengerRootScanner::startUnfinalizedProcessing(MM_EnvironmentBase *env)
99101
void
100102
MM_ScavengerRootScanner::scavengeFinalizableObjects(MM_EnvironmentStandard *env)
101103
{
102-
GC_FinalizeListManager * const finalizeListManager = _extensions->finalizeListManager;
104+
GC_FinalizeListManager *const finalizeListManager = _extensions->finalizeListManager;
103105
bool const compressed = _extensions->compressObjectReferences();
104106

105107
/* this code must be run single-threaded and we should only be here if work is actually required */
@@ -113,7 +115,7 @@ MM_ScavengerRootScanner::scavengeFinalizableObjects(MM_EnvironmentStandard *env)
113115
omrobjectptr_t systemObject = finalizeListManager->resetSystemFinalizableObjects();
114116
while (NULL != systemObject) {
115117
omrobjectptr_t next = NULL;
116-
if(_scavenger->isObjectInEvacuateMemory(systemObject)) {
118+
if (_scavenger->isObjectInEvacuateMemory(systemObject)) {
117119
MM_ForwardedHeader forwardedHeader(systemObject, compressed);
118120
if (!forwardedHeader.isForwardedPointer()) {
119121
next = _extensions->accessBarrier->getFinalizeLink(systemObject);
@@ -145,7 +147,7 @@ MM_ScavengerRootScanner::scavengeFinalizableObjects(MM_EnvironmentStandard *env)
145147
omrobjectptr_t defaultObject = finalizeListManager->resetDefaultFinalizableObjects();
146148
while (NULL != defaultObject) {
147149
omrobjectptr_t next = NULL;
148-
if(_scavenger->isObjectInEvacuateMemory(defaultObject)) {
150+
if (_scavenger->isObjectInEvacuateMemory(defaultObject)) {
149151
MM_ForwardedHeader forwardedHeader(defaultObject, compressed);
150152
if (!forwardedHeader.isForwardedPointer()) {
151153
next = _extensions->accessBarrier->getFinalizeLink(defaultObject);
@@ -177,7 +179,7 @@ MM_ScavengerRootScanner::scavengeFinalizableObjects(MM_EnvironmentStandard *env)
177179
omrobjectptr_t referenceObject = finalizeListManager->resetReferenceObjects();
178180
while (NULL != referenceObject) {
179181
omrobjectptr_t next = NULL;
180-
if(_scavenger->isObjectInEvacuateMemory(referenceObject)) {
182+
if (_scavenger->isObjectInEvacuateMemory(referenceObject)) {
181183
MM_ForwardedHeader forwardedHeader(referenceObject, compressed);
182184
if (!forwardedHeader.isForwardedPointer()) {
183185
next = _extensions->accessBarrier->getReferenceLink(referenceObject);

0 commit comments

Comments
 (0)