Skip to content

fix: do not prepare/release NonMoving space in nursery GC - #1562

Merged
qinsoon merged 3 commits into
mmtk:masterfrom
playX18:ap-fix-nonmoving-gengc
Sep 4, 2026
Merged

qinsoon merged 3 commits into
mmtk:masterfrom
playX18:ap-fix-nonmoving-gengc

Conversation

@playX18

@playX18 playX18 commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Resolves #1560

@qinsoon qinsoon left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think modifying CommonGenPlan::prepare/release would be cleaner.

Have something like

    /// Prepare Gen. This should be called by a single thread in GC prepare work.
    pub fn prepare(&mut self, tls: VMWorkerThread) {
        let full_heap = !self.is_current_gc_nursery();
        if full_heap {
            self.full_heap_gc_count.lock().unwrap().inc();
            self.common.prepare(tls, full_heap);
        } else {
            self.los.prepare(full_heap);
        }
        self.nursery.prepare(true);
        self.nursery
            .set_copy_for_sft_trace(Some(CopySemantics::PromoteToMature));
    }

    /// Release Gen. This should be called by a single thread in GC release work.
    pub fn release(&mut self, tls: VMWorkerThread) {
        let full_heap = !self.is_current_gc_nursery();
        if full_heap {
            self.common.release(tls, full_heap);
         } else {
            self.common.los.release(tls, full_heap);
         }
        self.nursery.release();
    }

This would be doing the same thing as sticky Immix -- see how sticky Immix only prepares/releases LOS in a nursery GC and does not call common.prepare/release.

fn prepare(&mut self, tls: crate::util::VMWorkerThread) {
if self.is_current_gc_nursery() {
// Prepare both large object space and immix space
self.immix.immix_space.prepare(
false,
Some(StatsForDefrag::new(self)),
// We don't do anything special to unlog bits during nursery GC
// because ProcessModBuf will set the unlog bits back.
UnlogBitsOperation::NoOp,
);
self.immix.common.los.prepare(false);
} else {
self.full_heap_gc_count.lock().unwrap().inc();
self.immix.prepare_inner(
tls,
// We will reconstruct unlog bits during tracing.
UnlogBitsOperation::BulkClear,
);
}
}
fn release(&mut self, tls: crate::util::VMWorkerThread) {
if self.is_current_gc_nursery() {
self.immix.immix_space.release(
false,
// We don't do anything special to unlog bits during nursery GC
// because ProcessModBuf has set the unlog bits back.
UnlogBitsOperation::NoOp,
);
self.immix.common.los.release(false);
} else {
self.immix.release_inner(
tls,
// We reconstructred unlog bits during tracing. Keep them.
UnlogBitsOperation::NoOp,
);
}
}

@qinsoon

qinsoon commented Aug 24, 2026

Copy link
Copy Markdown
Member

The style checks for stable Rust failed, but they are irrelevant for this PR. No need to fix them here.

@playX18
playX18 requested a review from qinsoon September 2, 2026 07:36

@qinsoon qinsoon left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Thanks.

@qinsoon
qinsoon enabled auto-merge September 4, 2026 10:30
@qinsoon
qinsoon added this pull request to the merge queue Sep 4, 2026
Merged via the queue into mmtk:master with commit 20d110f Sep 4, 2026
34 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

NonMoving space objects are swept away in Nursery GC

2 participants