Skip to content

Commit

Permalink
swiper: add freed pages back to bit set
Browse files Browse the repository at this point in the history
  • Loading branch information
dinfuehr committed Jan 6, 2024
1 parent ba0aee6 commit 27648c4
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 33 deletions.
13 changes: 1 addition & 12 deletions dora-runtime/src/gc/swiper.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ use crate::gc::swiper::young::YoungGen;
use crate::gc::tlab;
use crate::gc::Collector;
use crate::gc::GcReason;
use crate::gc::{align_page_up, formatted_size, Address, Region, K};
use crate::gc::{align_page_up, Address, Region, K};
use crate::mem;
use crate::object::{Obj, VtblptrWordKind, OLD_BIT, REMEMBERED_BIT};
use crate::os::{self, MemoryPermission, Reservation};
Expand Down Expand Up @@ -164,17 +164,6 @@ impl Swiper {
);
let large = LargeSpace::new(large_start, large_end, config.clone());

if args.gc_verbose {
println!(
"GC: heap info: {}, semi {}, card {}, crossing {} (region {})",
formatted_size(max_heap_size),
formatted_size(semi_size),
formatted_size(card_size),
formatted_size(crossing_size),
Region::new(heap_start, heap_end),
);
}

let nworkers = args.gc_workers();

let emit_write_barrier = !args.disable_barrier;
Expand Down
22 changes: 4 additions & 18 deletions dora-runtime/src/gc/swiper/controller.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ pub fn start(
let mut config = config.lock();

config.gc_start = Some(Instant::now());
config.start_object_size = object_size(young, old, large);
config.start_memory_size = memory_size(young, old, large);
}

Expand All @@ -84,7 +83,7 @@ pub fn stop(
let mut config = config.lock();

let gc_duration = config.gc_start.expect("not started").elapsed();
let gc_duration_ms = gc_duration.as_secs_f32() / 1000.0f32;
let gc_duration_ms = gc_duration.as_secs_f32() * 1000.0f32;

let old_size = old.committed_size() + large.committed_size();
config.old_size = old_size;
Expand All @@ -111,7 +110,6 @@ pub fn stop(
config.old_limit = config.max_heap_size - young_size;
assert!(config.old_limit >= old_size);

config.end_object_size = object_size(young, old, large);
config.end_memory_size = memory_size(young, old, large);

assert!(young_size + config.old_limit <= config.max_heap_size);
Expand Down Expand Up @@ -145,12 +143,10 @@ fn print(config: &HeapController, kind: CollectionKind, reason: GcReason, gc_dur
match kind {
CollectionKind::Minor => {
println!(
"GC: {} ({}) {}/{} -> {}/{}; {:.2} ms; {} promoted; {} copied; {} garbage",
"GC: {} ({}) {} -> {}; {:.2} ms; {} promoted; {} copied; {} garbage",
kind,
reason,
formatted_size(config.start_object_size),
formatted_size(config.start_memory_size),
formatted_size(config.end_object_size),
formatted_size(config.end_memory_size),
gc_duration,
formatted_size(config.minor_promoted),
Expand All @@ -161,25 +157,19 @@ fn print(config: &HeapController, kind: CollectionKind, reason: GcReason, gc_dur

CollectionKind::Full => {
println!(
"GC: {} ({}) {}/{} -> {}/{}; {:.2} ms",
"GC: {} ({}) {} -> {}; {:.2} ms",
kind,
reason,
formatted_size(config.start_object_size),
formatted_size(config.start_memory_size),
formatted_size(config.end_object_size),
formatted_size(config.end_memory_size),
gc_duration,
);
}
}
}

fn object_size(young: &YoungGen, old: &dyn CommonOldGen, large: &LargeSpace) -> usize {
young.object_size() + old.active_size() + large.committed_size()
}

fn memory_size(young: &YoungGen, old: &dyn CommonOldGen, large: &LargeSpace) -> usize {
young.committed_size() + old.committed_size() + large.committed_size()
young.allocated_size() + old.committed_size() + large.committed_size()
}

pub struct HeapController {
Expand All @@ -192,9 +182,7 @@ pub struct HeapController {

gc_start: Option<Instant>,

start_object_size: usize,
start_memory_size: usize,
end_object_size: usize,
end_memory_size: usize,

pub minor_promoted: usize,
Expand Down Expand Up @@ -224,9 +212,7 @@ impl HeapController {

gc_start: None,

start_object_size: 0,
start_memory_size: 0,
end_object_size: 0,
end_memory_size: 0,

minor_promoted: 0,
Expand Down
5 changes: 4 additions & 1 deletion dora-runtime/src/gc/swiper/full.rs
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,10 @@ impl<'a> FullCollector<'a> {
return;
}

if let Some(new_region) = self.old_protected.allocate(self.vm, self.old, size, size) {
if let Some(new_region) = self
.old_protected
.allocate(self.vm, self.old, true, size, size)
{
let new_address = new_region.start();
let object_end = new_address.offset(size);

Expand Down
7 changes: 5 additions & 2 deletions dora-runtime/src/gc/swiper/old.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ impl CommonOldGen for OldGen {
impl GenerationAllocator for OldGen {
fn allocate(&self, vm: &VM, min_size: usize, max_size: usize) -> Option<Region> {
let mut protected = self.protected.lock();
protected.allocate(vm, self, min_size, max_size)
protected.allocate(vm, self, false, min_size, max_size)
}

fn free(&self, _region: Region) {
Expand Down Expand Up @@ -153,6 +153,7 @@ impl OldGenProtected {
&mut self,
vm: &VM,
old: &OldGen,
is_gc: bool,
min_size: usize,
max_size: usize,
) -> Option<Region> {
Expand Down Expand Up @@ -180,7 +181,7 @@ impl OldGenProtected {
return Some(region);
}

if !old.can_add_page() {
if !is_gc && !old.can_add_page() {
return None;
}

Expand Down Expand Up @@ -212,6 +213,8 @@ impl OldGenProtected {
.expect("missing page");
self.pages.swap_remove(idx);
self.size -= PAGE_SIZE;
let page_idx = page.start().offset_from(self.total.start()) / PAGE_SIZE;
self.free_pages.insert(page_idx);
os::discard(page.start(), page.size());
}

Expand Down

0 comments on commit 27648c4

Please sign in to comment.