From f6b76141268e672650ad8d9291e5cac111f36faa Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Tue, 15 Mar 2022 11:16:01 +1100 Subject: [PATCH 01/16] WIP --- mmtk/Cargo.toml | 5 +++-- mmtk/src/abi.rs | 14 +++++++++++++- mmtk/src/lib.rs | 4 +++- mmtk/src/object_scanning.rs | 21 +++++++++++++++++---- mmtk/src/reference_glue.rs | 24 +++++++++++++----------- openjdk/mmtk.h | 1 + openjdk/mmtkUpcalls.cpp | 5 +++++ 7 files changed, 55 insertions(+), 19 deletions(-) diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index 44e20bc2..e6a8eb3f 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -20,15 +20,16 @@ openjdk_version = "67d5d2b16aacb2ea948552fab2323ebd0abbe924" [dependencies] libc = "0.2" lazy_static = "1.1" +log = {version = "0.4", features = ["max_level_trace", "release_max_level_off"] } # Be very careful to commit any changes to the following mmtk dependency, as our CI scripts (including mmtk-core CI) # rely on matching these lines to modify them: e.g. comment out the git dependency and use the local path. # These changes are safe: # - change branch # - change repo name # But other changes including adding/removing whitespaces in commented lines may break the CI. -mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "dbd152b29ff54c3f028318e73ac182d681deda9a" } +# mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "dbd152b29ff54c3f028318e73ac182d681deda9a" } # Uncomment the following to build locally -# mmtk = { path = "../repos/mmtk-core" } +mmtk = { path = "/home/yilin/Code/mmtk-core" } [features] default = [] diff --git a/mmtk/src/abi.rs b/mmtk/src/abi.rs index 444fa8c2..2c55075e 100644 --- a/mmtk/src/abi.rs +++ b/mmtk/src/abi.rs @@ -131,7 +131,7 @@ pub struct InstanceKlass { // #endif pub idnum_allocated_count: u16, pub init_state: u8, - pub reference_type: u8, + pub reference_type: ReferenceType, pub this_class_index: u16, // #if INCLUDE_JVMTI pub jvmti_cached_class_field_map: OpaquePointer, // JvmtiCachedClassFieldMap* @@ -147,6 +147,18 @@ pub struct InstanceKlass { pub fields: OpaquePointer, // Array* } +#[repr(u8)] +#[derive(Copy, Clone, Debug)] +#[allow(dead_code)] +pub enum ReferenceType { + None, // Regular class + Other, // Subclass of java/lang/ref/Reference, but not subclass of one of the classes below + Soft, // Subclass of java/lang/ref/SoftReference + Weak, // Subclass of java/lang/ref/WeakReference + Final, // Subclass of java/lang/ref/FinalReference + Phantom // Subclass of java/lang/ref/PhantomReference +} + impl InstanceKlass { const HEADER_SIZE: usize = mem::size_of::() / BYTES_IN_WORD; const VTABLE_START_OFFSET: usize = Self::HEADER_SIZE * BYTES_IN_WORD; diff --git a/mmtk/src/lib.rs b/mmtk/src/lib.rs index ad9758f2..ec855aea 100644 --- a/mmtk/src/lib.rs +++ b/mmtk/src/lib.rs @@ -9,6 +9,8 @@ extern crate libc; extern crate mmtk; #[macro_use] extern crate lazy_static; +#[macro_use] +extern crate log; use std::ptr::null_mut; @@ -83,7 +85,7 @@ pub struct OpenJDK_Upcalls { pub number_of_mutators: extern "C" fn() -> usize, pub schedule_finalizer: extern "C" fn(), pub prepare_for_roots_re_scanning: extern "C" fn(), - pub object_alignment: extern "C" fn() -> i32, + pub enqueue_reference: extern "C" fn(object: ObjectReference), } pub static mut UPCALLS: *const OpenJDK_Upcalls = null_mut(); diff --git a/mmtk/src/object_scanning.rs b/mmtk/src/object_scanning.rs index 7b2dfc2b..b1ae44c8 100644 --- a/mmtk/src/object_scanning.rs +++ b/mmtk/src/object_scanning.rs @@ -111,11 +111,24 @@ impl OopIterate for TypeArrayKlass { impl OopIterate for InstanceRefKlass { #[inline] fn oop_iterate(&self, oop: Oop, closure: &mut impl TransitiveClosure) { + use crate::api::{add_weak_candidate, add_soft_candidate, add_phantom_candidate}; + use crate::abi::*; self.instance_klass.oop_iterate(oop, closure); - let referent_addr = Self::referent_address(oop); - closure.process_edge(referent_addr); - let discovered_addr = Self::discovered_address(oop); - closure.process_edge(discovered_addr); + + let reference = ObjectReference::from(oop); + let referent = unsafe { Self::referent_address(oop).load::() }; + match self.instance_klass.reference_type { + ReferenceType::None => panic!("oop_iterate on InstanceRefKlass with reference_type as None"), + ReferenceType::Weak => add_weak_candidate(reference, referent), + ReferenceType::Soft => add_soft_candidate(reference, referent), + ReferenceType::Phantom => add_phantom_candidate(reference, referent), + _ => { + let referent_addr = Self::referent_address(oop); + closure.process_edge(referent_addr); + let discovered_addr = Self::discovered_address(oop); + closure.process_edge(discovered_addr); + } + } } } diff --git a/mmtk/src/reference_glue.rs b/mmtk/src/reference_glue.rs index 5950aa63..be5bc02a 100644 --- a/mmtk/src/reference_glue.rs +++ b/mmtk/src/reference_glue.rs @@ -1,23 +1,25 @@ use crate::OpenJDK; +use crate::abi::{InstanceRefKlass, Oop}; use mmtk::util::opaque_pointer::VMWorkerThread; use mmtk::util::ObjectReference; use mmtk::vm::ReferenceGlue; -use mmtk::TraceLocal; +use mmtk::scheduler::ProcessEdgesWork; +use crate::UPCALLS; pub struct VMReferenceGlue {} impl ReferenceGlue for VMReferenceGlue { - fn set_referent(_reff: ObjectReference, _referent: ObjectReference) { - unimplemented!() + fn set_referent(reff: ObjectReference, referent: ObjectReference) { + let oop = Oop::from(reff); + unsafe { InstanceRefKlass::referent_address(oop).store(referent) }; } - fn get_referent(_object: ObjectReference) -> ObjectReference { - unimplemented!() + fn get_referent(object: ObjectReference) -> ObjectReference { + let oop = Oop::from(object); + unsafe { InstanceRefKlass::referent_address(oop).load::() } } - fn process_reference( - _trace: &mut T, - _reference: ObjectReference, - _tls: VMWorkerThread, - ) -> ObjectReference { - unimplemented!() + fn enqueue_reference(object: ObjectReference) { + unsafe { + ((*UPCALLS).enqueue_reference)(object); + } } } diff --git a/openjdk/mmtk.h b/openjdk/mmtk.h index 7debccc2..9d289ea5 100644 --- a/openjdk/mmtk.h +++ b/openjdk/mmtk.h @@ -144,6 +144,7 @@ typedef struct { size_t (*number_of_mutators)(); void (*schedule_finalizer)(); void (*prepare_for_roots_re_scanning)(); + void (*enqueue_reference)(void* object); } OpenJDK_Upcalls; extern void openjdk_gc_init(OpenJDK_Upcalls *calls, size_t heap_size); diff --git a/openjdk/mmtkUpcalls.cpp b/openjdk/mmtkUpcalls.cpp index 760fa8e1..ce62463c 100644 --- a/openjdk/mmtkUpcalls.cpp +++ b/openjdk/mmtkUpcalls.cpp @@ -319,6 +319,10 @@ static void mmtk_prepare_for_roots_re_scanning() { #endif } +static void mmtk_enqueue_reference(void* object) { + printf("enqueue object: %p\n", object); +} + OpenJDK_Upcalls mmtk_upcalls = { mmtk_stop_all_mutators, mmtk_resume_mutators, @@ -360,4 +364,5 @@ OpenJDK_Upcalls mmtk_upcalls = { mmtk_number_of_mutators, mmtk_schedule_finalizer, mmtk_prepare_for_roots_re_scanning, + mmtk_enqueue_reference, }; From d3f21769de6a2bd80960e43b5fe1c351aa0b8814 Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Tue, 15 Mar 2022 15:29:23 +1100 Subject: [PATCH 02/16] Enqueue reference (slow) --- openjdk/mmtkUpcalls.cpp | 5 +++++ openjdk/mmtkVMCompanionThread.cpp | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/openjdk/mmtkUpcalls.cpp b/openjdk/mmtkUpcalls.cpp index ce62463c..0576f560 100644 --- a/openjdk/mmtkUpcalls.cpp +++ b/openjdk/mmtkUpcalls.cpp @@ -321,6 +321,11 @@ static void mmtk_prepare_for_roots_re_scanning() { static void mmtk_enqueue_reference(void* object) { printf("enqueue object: %p\n", object); + MutexLocker x(Heap_lock); + oop reff = (oop) object; + oop old = Universe::swap_reference_pending_list(reff); + HeapAccess::oop_store_at(reff, java_lang_ref_Reference::discovered_offset, old); + assert(Universe::has_reference_pending_list(), "Reference pending list is empty after swap"); } OpenJDK_Upcalls mmtk_upcalls = { diff --git a/openjdk/mmtkVMCompanionThread.cpp b/openjdk/mmtkVMCompanionThread.cpp index 934d544d..a7dd0d78 100644 --- a/openjdk/mmtkVMCompanionThread.cpp +++ b/openjdk/mmtkVMCompanionThread.cpp @@ -75,6 +75,12 @@ void MMTkVMCompanionThread::run() { _reached_state = _threads_resumed; _lock->notify_all(); } + { + MutexLocker x(Heap_lock); + if (Universe::has_reference_pending_list()) { + Heap_lock->notify_all(); + } + } } } From a1f0de29b6d130741e863e10593af6168edf257b Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Wed, 16 Mar 2022 09:33:11 +1100 Subject: [PATCH 03/16] Update mmtk-core, cargo fmt --- mmtk/Cargo.toml | 5 ++--- mmtk/src/abi.rs | 12 ++++++------ mmtk/src/lib.rs | 2 -- mmtk/src/object_scanning.rs | 10 +++++++--- mmtk/src/reference_glue.rs | 6 ++---- openjdk/mmtkUpcalls.cpp | 2 +- 6 files changed, 18 insertions(+), 19 deletions(-) diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index e6a8eb3f..783adadf 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -20,16 +20,15 @@ openjdk_version = "67d5d2b16aacb2ea948552fab2323ebd0abbe924" [dependencies] libc = "0.2" lazy_static = "1.1" -log = {version = "0.4", features = ["max_level_trace", "release_max_level_off"] } # Be very careful to commit any changes to the following mmtk dependency, as our CI scripts (including mmtk-core CI) # rely on matching these lines to modify them: e.g. comment out the git dependency and use the local path. # These changes are safe: # - change branch # - change repo name # But other changes including adding/removing whitespaces in commented lines may break the CI. -# mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "dbd152b29ff54c3f028318e73ac182d681deda9a" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "63e1fdace31caf8494c612f56e0aced7af7eb644" } # Uncomment the following to build locally -mmtk = { path = "/home/yilin/Code/mmtk-core" } +# mmtk = { path = "../repos/mmtk-core" } [features] default = [] diff --git a/mmtk/src/abi.rs b/mmtk/src/abi.rs index 2c55075e..c4f024e5 100644 --- a/mmtk/src/abi.rs +++ b/mmtk/src/abi.rs @@ -151,12 +151,12 @@ pub struct InstanceKlass { #[derive(Copy, Clone, Debug)] #[allow(dead_code)] pub enum ReferenceType { - None, // Regular class - Other, // Subclass of java/lang/ref/Reference, but not subclass of one of the classes below - Soft, // Subclass of java/lang/ref/SoftReference - Weak, // Subclass of java/lang/ref/WeakReference - Final, // Subclass of java/lang/ref/FinalReference - Phantom // Subclass of java/lang/ref/PhantomReference + None, // Regular class + Other, // Subclass of java/lang/ref/Reference, but not subclass of one of the classes below + Soft, // Subclass of java/lang/ref/SoftReference + Weak, // Subclass of java/lang/ref/WeakReference + Final, // Subclass of java/lang/ref/FinalReference + Phantom, // Subclass of java/lang/ref/PhantomReference } impl InstanceKlass { diff --git a/mmtk/src/lib.rs b/mmtk/src/lib.rs index ec855aea..26d11774 100644 --- a/mmtk/src/lib.rs +++ b/mmtk/src/lib.rs @@ -9,8 +9,6 @@ extern crate libc; extern crate mmtk; #[macro_use] extern crate lazy_static; -#[macro_use] -extern crate log; use std::ptr::null_mut; diff --git a/mmtk/src/object_scanning.rs b/mmtk/src/object_scanning.rs index b1ae44c8..5e45a5a5 100644 --- a/mmtk/src/object_scanning.rs +++ b/mmtk/src/object_scanning.rs @@ -111,18 +111,22 @@ impl OopIterate for TypeArrayKlass { impl OopIterate for InstanceRefKlass { #[inline] fn oop_iterate(&self, oop: Oop, closure: &mut impl TransitiveClosure) { - use crate::api::{add_weak_candidate, add_soft_candidate, add_phantom_candidate}; use crate::abi::*; + use crate::api::{add_phantom_candidate, add_soft_candidate, add_weak_candidate}; self.instance_klass.oop_iterate(oop, closure); let reference = ObjectReference::from(oop); let referent = unsafe { Self::referent_address(oop).load::() }; match self.instance_klass.reference_type { - ReferenceType::None => panic!("oop_iterate on InstanceRefKlass with reference_type as None"), + ReferenceType::None => { + panic!("oop_iterate on InstanceRefKlass with reference_type as None") + } ReferenceType::Weak => add_weak_candidate(reference, referent), ReferenceType::Soft => add_soft_candidate(reference, referent), ReferenceType::Phantom => add_phantom_candidate(reference, referent), - _ => { + // Process these two types normally (as if they are strong refs) + // We will handle final reference later + ReferenceType::Final | ReferenceType::Other => { let referent_addr = Self::referent_address(oop); closure.process_edge(referent_addr); let discovered_addr = Self::discovered_address(oop); diff --git a/mmtk/src/reference_glue.rs b/mmtk/src/reference_glue.rs index be5bc02a..653c0225 100644 --- a/mmtk/src/reference_glue.rs +++ b/mmtk/src/reference_glue.rs @@ -1,10 +1,8 @@ -use crate::OpenJDK; use crate::abi::{InstanceRefKlass, Oop}; -use mmtk::util::opaque_pointer::VMWorkerThread; +use crate::OpenJDK; +use crate::UPCALLS; use mmtk::util::ObjectReference; use mmtk::vm::ReferenceGlue; -use mmtk::scheduler::ProcessEdgesWork; -use crate::UPCALLS; pub struct VMReferenceGlue {} diff --git a/openjdk/mmtkUpcalls.cpp b/openjdk/mmtkUpcalls.cpp index 0576f560..5c917d86 100644 --- a/openjdk/mmtkUpcalls.cpp +++ b/openjdk/mmtkUpcalls.cpp @@ -320,7 +320,7 @@ static void mmtk_prepare_for_roots_re_scanning() { } static void mmtk_enqueue_reference(void* object) { - printf("enqueue object: %p\n", object); + // printf("enqueue object: %p\n", object); MutexLocker x(Heap_lock); oop reff = (oop) object; oop old = Universe::swap_reference_pending_list(reff); From cb498d93130b6f6b25be7e3ea3afaf3e34c5213f Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Wed, 16 Mar 2022 11:17:38 +1100 Subject: [PATCH 04/16] Update mmtk-core --- mmtk/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index 783adadf..a78e32d4 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -26,7 +26,7 @@ lazy_static = "1.1" # - change branch # - change repo name # But other changes including adding/removing whitespaces in commented lines may break the CI. -mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "63e1fdace31caf8494c612f56e0aced7af7eb644" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "40bcb3ed9ab5e00149cbfffe87f3f5a2ba685892" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } From 32c7dda84bce353c60130065ea650bf57e867247 Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Fri, 18 Mar 2022 11:49:57 +1100 Subject: [PATCH 05/16] Implement get_reference_when_copied_to --- mmtk/src/object_model.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mmtk/src/object_model.rs b/mmtk/src/object_model.rs index fdac8bcb..d4c9f10d 100644 --- a/mmtk/src/object_model.rs +++ b/mmtk/src/object_model.rs @@ -119,8 +119,8 @@ impl ObjectModel for VMObjectModel { start + bytes } - fn get_reference_when_copied_to(_from: ObjectReference, _to: Address) -> ObjectReference { - unimplemented!() + fn get_reference_when_copied_to(_from: ObjectReference, to: Address) -> ObjectReference { + unsafe { to.to_object_reference() } } fn get_current_size(object: ObjectReference) -> usize { From 93998de7f07d78e900fc9b2aee80cc31fcb34ff5 Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Mon, 21 Mar 2022 14:40:39 +1100 Subject: [PATCH 06/16] Update mmtk-core --- mmtk/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index a78e32d4..d2125335 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -26,7 +26,7 @@ lazy_static = "1.1" # - change branch # - change repo name # But other changes including adding/removing whitespaces in commented lines may break the CI. -mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "40bcb3ed9ab5e00149cbfffe87f3f5a2ba685892" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "f47e85bdf2b6bf95807b425b184135cfdbf4de14" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } From 8f188ce34ede1009f146250f1090896a254e24ef Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Tue, 22 Mar 2022 10:52:15 +1100 Subject: [PATCH 07/16] Bulk enqueue references --- mmtk/Cargo.toml | 2 +- mmtk/src/lib.rs | 2 +- mmtk/src/reference_glue.rs | 4 ++-- openjdk/mmtk.h | 2 +- openjdk/mmtkUpcalls.cpp | 25 +++++++++++++++++++------ 5 files changed, 24 insertions(+), 11 deletions(-) diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index d2125335..e8146862 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -26,7 +26,7 @@ lazy_static = "1.1" # - change branch # - change repo name # But other changes including adding/removing whitespaces in commented lines may break the CI. -mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "f47e85bdf2b6bf95807b425b184135cfdbf4de14" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "722546b37e7579aee9d093f51b97f5a729a553d5" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } diff --git a/mmtk/src/lib.rs b/mmtk/src/lib.rs index 26d11774..f16329b7 100644 --- a/mmtk/src/lib.rs +++ b/mmtk/src/lib.rs @@ -83,7 +83,7 @@ pub struct OpenJDK_Upcalls { pub number_of_mutators: extern "C" fn() -> usize, pub schedule_finalizer: extern "C" fn(), pub prepare_for_roots_re_scanning: extern "C" fn(), - pub enqueue_reference: extern "C" fn(object: ObjectReference), + pub enqueue_references: extern "C" fn(objects: &[ObjectReference], len: usize), } pub static mut UPCALLS: *const OpenJDK_Upcalls = null_mut(); diff --git a/mmtk/src/reference_glue.rs b/mmtk/src/reference_glue.rs index 653c0225..a6feefd8 100644 --- a/mmtk/src/reference_glue.rs +++ b/mmtk/src/reference_glue.rs @@ -15,9 +15,9 @@ impl ReferenceGlue for VMReferenceGlue { let oop = Oop::from(object); unsafe { InstanceRefKlass::referent_address(oop).load::() } } - fn enqueue_reference(object: ObjectReference) { + fn enqueue_references(references: &[ObjectReference]) { unsafe { - ((*UPCALLS).enqueue_reference)(object); + ((*UPCALLS).enqueue_references)(references, references.len()); } } } diff --git a/openjdk/mmtk.h b/openjdk/mmtk.h index 9d289ea5..19dd5386 100644 --- a/openjdk/mmtk.h +++ b/openjdk/mmtk.h @@ -144,7 +144,7 @@ typedef struct { size_t (*number_of_mutators)(); void (*schedule_finalizer)(); void (*prepare_for_roots_re_scanning)(); - void (*enqueue_reference)(void* object); + void (*enqueue_references)(void** objects, size_t len); } OpenJDK_Upcalls; extern void openjdk_gc_init(OpenJDK_Upcalls *calls, size_t heap_size); diff --git a/openjdk/mmtkUpcalls.cpp b/openjdk/mmtkUpcalls.cpp index 5c917d86..21839cb0 100644 --- a/openjdk/mmtkUpcalls.cpp +++ b/openjdk/mmtkUpcalls.cpp @@ -319,12 +319,25 @@ static void mmtk_prepare_for_roots_re_scanning() { #endif } -static void mmtk_enqueue_reference(void* object) { - // printf("enqueue object: %p\n", object); +static void mmtk_enqueue_references(void** objects, size_t len) { + if (len == 0) { + return; + } + MutexLocker x(Heap_lock); - oop reff = (oop) object; - oop old = Universe::swap_reference_pending_list(reff); - HeapAccess::oop_store_at(reff, java_lang_ref_Reference::discovered_offset, old); + + oop prev = NULL; + for (size_t i = 0; i < len; i++) { + oop reff = (oop) objects[i]; + printf("enqueue: %p\n", reff); + if (prev != NULL) { + HeapAccess::oop_store_at(prev, java_lang_ref_Reference::discovered_offset, reff); + } + prev = reff; + } + + oop old = Universe::swap_reference_pending_list(prev); + HeapAccess::oop_store_at(prev, java_lang_ref_Reference::discovered_offset, old); assert(Universe::has_reference_pending_list(), "Reference pending list is empty after swap"); } @@ -369,5 +382,5 @@ OpenJDK_Upcalls mmtk_upcalls = { mmtk_number_of_mutators, mmtk_schedule_finalizer, mmtk_prepare_for_roots_re_scanning, - mmtk_enqueue_reference, + mmtk_enqueue_references }; From d1d810e60651bc072bd9052be1157951d42c5be1 Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Wed, 23 Mar 2022 10:12:44 +1100 Subject: [PATCH 08/16] Update mmtk-core. --- mmtk/Cargo.toml | 2 +- openjdk/mmtkUpcalls.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index e8146862..41ab5151 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -26,7 +26,7 @@ lazy_static = "1.1" # - change branch # - change repo name # But other changes including adding/removing whitespaces in commented lines may break the CI. -mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "722546b37e7579aee9d093f51b97f5a729a553d5" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "a55db731e38618f2143a14b5152390dcc7ba4faf" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } diff --git a/openjdk/mmtkUpcalls.cpp b/openjdk/mmtkUpcalls.cpp index 21839cb0..cff2b003 100644 --- a/openjdk/mmtkUpcalls.cpp +++ b/openjdk/mmtkUpcalls.cpp @@ -329,7 +329,6 @@ static void mmtk_enqueue_references(void** objects, size_t len) { oop prev = NULL; for (size_t i = 0; i < len; i++) { oop reff = (oop) objects[i]; - printf("enqueue: %p\n", reff); if (prev != NULL) { HeapAccess::oop_store_at(prev, java_lang_ref_Reference::discovered_offset, reff); } From f93adacd17b728a9a6f208d305440439ccfa6ff3 Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Thu, 24 Mar 2022 15:07:08 +1100 Subject: [PATCH 09/16] Update mmtk-core --- mmtk/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index 27da93a6..336e5e69 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -26,7 +26,7 @@ lazy_static = "1.1" # - change branch # - change repo name # But other changes including adding/removing whitespaces in commented lines may break the CI. -mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "4ba3ed2b9be7dc94bc02c04c00f225f3be2274ad" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "dde48d1a056046459aabad0ffbd28fd400a28bf7" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } From f2bf3cc9c0322efa99cad529d8e7b75c81fcb5cf Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Fri, 25 Mar 2022 15:11:41 +1100 Subject: [PATCH 10/16] Update mmtk-core --- mmtk/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index 336e5e69..9e2b4ac0 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -26,7 +26,7 @@ lazy_static = "1.1" # - change branch # - change repo name # But other changes including adding/removing whitespaces in commented lines may break the CI. -mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "dde48d1a056046459aabad0ffbd28fd400a28bf7" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "612ee339ce909cca7b74857dc62e16da5eb5a3f3" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } From af76c629a21892526e06b91a309cbf6d6069f8aa Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Mon, 28 Mar 2022 15:39:09 +1100 Subject: [PATCH 11/16] Update mmtk-core --- mmtk/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index 9e2b4ac0..4fb89702 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -26,7 +26,7 @@ lazy_static = "1.1" # - change branch # - change repo name # But other changes including adding/removing whitespaces in commented lines may break the CI. -mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "612ee339ce909cca7b74857dc62e16da5eb5a3f3" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "4024354f125bc16f987023dcad4d359949f33546" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } From d6afe4494c85c858bf1900107091e47e62989b4f Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Tue, 29 Mar 2022 14:52:00 +1100 Subject: [PATCH 12/16] Update mmtk-core --- mmtk/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index 4fb89702..d0eac817 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -26,7 +26,7 @@ lazy_static = "1.1" # - change branch # - change repo name # But other changes including adding/removing whitespaces in commented lines may break the CI. -mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "4024354f125bc16f987023dcad4d359949f33546" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "3d29846b887431436cc8787d289353a7f7b06d4a" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } From f3daa8df5877307e45327bbdd3af5a8597c1f8db Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Tue, 5 Apr 2022 10:45:22 +1000 Subject: [PATCH 13/16] Allow no_reference_types --- mmtk/Cargo.toml | 2 +- mmtk/src/object_scanning.rs | 45 ++++++++++++++++++++++++------------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index d0eac817..2e80ce5a 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -26,7 +26,7 @@ lazy_static = "1.1" # - change branch # - change repo name # But other changes including adding/removing whitespaces in commented lines may break the CI. -mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "3d29846b887431436cc8787d289353a7f7b06d4a" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "4fd84690e27b6527c74fc75430ff8fdc93251cc3" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } diff --git a/mmtk/src/object_scanning.rs b/mmtk/src/object_scanning.rs index 5e45a5a5..b0796ff7 100644 --- a/mmtk/src/object_scanning.rs +++ b/mmtk/src/object_scanning.rs @@ -115,27 +115,40 @@ impl OopIterate for InstanceRefKlass { use crate::api::{add_phantom_candidate, add_soft_candidate, add_weak_candidate}; self.instance_klass.oop_iterate(oop, closure); - let reference = ObjectReference::from(oop); - let referent = unsafe { Self::referent_address(oop).load::() }; - match self.instance_klass.reference_type { - ReferenceType::None => { - panic!("oop_iterate on InstanceRefKlass with reference_type as None") - } - ReferenceType::Weak => add_weak_candidate(reference, referent), - ReferenceType::Soft => add_soft_candidate(reference, referent), - ReferenceType::Phantom => add_phantom_candidate(reference, referent), - // Process these two types normally (as if they are strong refs) - // We will handle final reference later - ReferenceType::Final | ReferenceType::Other => { - let referent_addr = Self::referent_address(oop); - closure.process_edge(referent_addr); - let discovered_addr = Self::discovered_address(oop); - closure.process_edge(discovered_addr); + if Self::should_scan_weak_refs() { + let reference = ObjectReference::from(oop); + let referent = unsafe { Self::referent_address(oop).load::() }; + match self.instance_klass.reference_type { + ReferenceType::None => { + panic!("oop_iterate on InstanceRefKlass with reference_type as None") + } + ReferenceType::Weak => add_weak_candidate(reference, referent), + ReferenceType::Soft => add_soft_candidate(reference, referent), + ReferenceType::Phantom => add_phantom_candidate(reference, referent), + // Process these two types normally (as if they are strong refs) + // We will handle final reference later + ReferenceType::Final | ReferenceType::Other => Self::process_ref_as_strong(oop, closure), } + } else { + Self::process_ref_as_strong(oop, closure); } } } +impl InstanceRefKlass { + #[inline] + fn should_scan_weak_refs() -> bool { + !*SINGLETON.get_options().no_reference_types + } + #[inline] + fn process_ref_as_strong(oop: Oop, closure: &mut impl TransitiveClosure) { + let referent_addr = Self::referent_address(oop); + closure.process_edge(referent_addr); + let discovered_addr = Self::discovered_address(oop); + closure.process_edge(discovered_addr); + } +} + #[allow(unused)] fn oop_iterate_slow(oop: Oop, closure: &mut impl TransitiveClosure, tls: OpaquePointer) { unsafe { From e46442ef96446724826403133285837d5d2dbe1a Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Thu, 7 Apr 2022 09:53:44 +1000 Subject: [PATCH 14/16] Add CI tests for weak refs. Update mmtk-core. --- .github/scripts/ci-test-weak-ref.sh | 174 ++++++++++++++++++++++++++++ .github/scripts/ci-test.sh | 2 + .github/workflows/ci.yml | 13 +++ mmtk/Cargo.toml | 2 +- mmtk/src/api.rs | 12 +- mmtk/src/object_scanning.rs | 11 +- mmtk/src/reference_glue.rs | 3 +- 7 files changed, 204 insertions(+), 13 deletions(-) create mode 100755 .github/scripts/ci-test-weak-ref.sh diff --git a/.github/scripts/ci-test-weak-ref.sh b/.github/scripts/ci-test-weak-ref.sh new file mode 100755 index 00000000..376591e5 --- /dev/null +++ b/.github/scripts/ci-test-weak-ref.sh @@ -0,0 +1,174 @@ +set -xe + +. $(dirname "$0")/common.sh + +unset JAVA_TOOL_OPTIONS + +# To OpenJDK folder +cd $OPENJDK_PATH + +# Choose build: use slowdebug for shorter build time (32m user time for release vs. 20m user time for slowdebug) +export DEBUG_LEVEL=fastdebug + +# Build +sh configure --disable-warnings-as-errors --with-debug-level=$DEBUG_LEVEL +make CONF=linux-x86_64-normal-server-$DEBUG_LEVEL THIRD_PARTY_HEAP=$BINDING_PATH/openjdk + +export MMTK_NO_REFERENCE_TYPES=false + +# --- SemiSpace --- +export MMTK_PLAN=SemiSpace + +# Test - the benchmarks that are commented out do not work yet +# Note: the command line options are necessary for now to ensure the benchmarks work. We may later change the options if we do not have these many constraints. +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar antlr +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar bloat - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar fop +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar jython - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar luindex +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar lusearch - validation failed +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar pmd +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar xalan - mmtk-core gets stuck in slowdebug build + +# These benchmarks take 40s+ for slowdebug build, we may consider removing them from the CI +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar hsqldb +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar eclipse + +# --- Immix --- +export MMTK_PLAN=Immix + +# Test - the benchmarks that are commented out do not work yet +# Note: the command line options are necessary for now to ensure the benchmarks work. We may later change the options if we do not have these many constraints. +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar antlr +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar bloat - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar fop +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar jython - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar luindex +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar lusearch - validation failed +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar pmd +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar xalan - mmtk-core gets stuck in slowdebug build + +# These benchmarks take 40s+ for slowdebug build, we may consider removing them from the CI +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar hsqldb +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar eclipse + +# --- Immix --- +export MMTK_PLAN=GenImmix + +# Test - the benchmarks that are commented out do not work yet +# Note: the command line options are necessary for now to ensure the benchmarks work. We may later change the options if we do not have these many constraints. +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar antlr +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar bloat - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar fop +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar jython - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar luindex +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar lusearch - validation failed +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar pmd +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar xalan - mmtk-core gets stuck in slowdebug build + +# These benchmarks take 40s+ for slowdebug build, we may consider removing them from the CI +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar hsqldb +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar eclipse + +# --- GenCopy --- +export MMTK_PLAN=GenCopy + +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar antlr +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar fop +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar luindex +# Fail non-deterministically +# build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar hsqldb + +# Fail with OOM (code 137) +# build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar pmd + +# This passes, but it takes horribly long time to run. We exclude it. +# build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar eclipse + +# --- NoGC --- + +# Build +export MMTK_PLAN=NoGC + +# Test - the benchmarks that are commented out do not work yet +# Note: We could increase heap size when mmtk core can work for larger heap. We may get more benchmarks running. + +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar antlr +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar bloat - does not work for stock build +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar eclipes - OOM +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar fop +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar hsqldb - OOM +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar jython - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar luindex +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar lusearch - OOM +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar pmd - OOM +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms1G -Xmx1G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar xalan - OOM + +# --- MarkCompact --- +export MMTK_PLAN=MarkCompact +# Test - the benchmarks that are commented out do not work yet +# Note: the command line options are necessary for now to ensure the benchmarks work. We may later change the options if we do not have these many constraints. +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar antlr +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar bloat - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar fop +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar jython - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar luindex +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar lusearch - validation failed +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar pmd +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar xalan - mmtk-core gets stuck in slowdebug build + +# These benchmarks take 40s+ for slowdebug build, we may consider removing them from the CI +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -XX:TieredStopAtLevel=1 -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar hsqldb +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -XX:TieredStopAtLevel=1 -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar eclipse + +# --- MarkSweep --- +export MMTK_PLAN=MarkSweep + +# Test - the benchmarks that are commented out do not work yet +# Note: the command line options are necessary for now to ensure the benchmarks work. We may later change the options if we do not have these many constraints. +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar antlr +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar bloat - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar fop +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar jython - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar luindex +# build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar lusearch +#- validation failed +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar pmd +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar xalan - mmtk-core gets stuck in slowdebug build + +# These benchmarks take 40s+ for slowdebug build, we may consider removing them from the CI +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar hsqldb +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar eclipse + +# Run benchmarks with the mark bit in the header now +unset MMTK_PLAN +MARK_IN_HEADER=1 make CONF=linux-x86_64-normal-server-$DEBUG_LEVEL THIRD_PARTY_HEAP=$BINDING_PATH/openjdk + +export MMTK_PLAN=MarkSweep + +# Test - the benchmarks that are commented out do not work yet +# Note: the command line options are necessary for now to ensure the benchmarks work. We may later change the options if we do not have these many constraints. +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar antlr +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar bloat - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar fop +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar jython - does not work for stock build +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar luindex +# build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar lusearch +#- validation failed +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar pmd +#build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar xalan - mmtk-core gets stuck in slowdebug build + +# These benchmarks take 40s+ for slowdebug build, we may consider removing them from the CI +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar hsqldb +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms500M -Xmx500M -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar eclipse + +# --- PageProtect --- +# Make sure this runs last in our tests unless we want to set it back to the default limit. +sudo sysctl -w vm.max_map_count=655300 + +export MMTK_PLAN=PageProtect + +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms4G -Xmx4G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar antlr +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms4G -Xmx4G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar fop +build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms4G -Xmx4G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar luindex +# build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHeap -server -XX:MetaspaceSize=100M -Xms4G -Xmx4G -jar $DACAPO_PATH/dacapo-2006-10-MR2.jar pmd diff --git a/.github/scripts/ci-test.sh b/.github/scripts/ci-test.sh index f264b804..7f23c905 100755 --- a/.github/scripts/ci-test.sh +++ b/.github/scripts/ci-test.sh @@ -7,3 +7,5 @@ cd $cur ./ci-test-assertions.sh cd $cur ./ci-test-global-alloc-bit.sh +cd $cur +./ci-test-weak-ref.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9f0a3443..cb2df40e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,6 +25,19 @@ jobs: - name: Style checks run: ./.github/scripts/ci-style.sh + test-weak-ref: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v2 + - name: Setup environments + run: | + ./.github/scripts/ci-checkout.sh + ./.github/scripts/ci-setup.sh + + # Run the tests + - name: Dacapo Tests with Weak ref + run: ./.github/scripts/ci-test-weak-ref.sh + msrv: runs-on: ubuntu-18.04 steps: diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index caf96d3c..5e3949cc 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -28,7 +28,7 @@ once_cell = "1.10.0" # - change branch # - change repo name # But other changes including adding/removing whitespaces in commented lines may break the CI. -mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "a90ab0f3194e744941dd15e6c8473c4a3c0373dd" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "1767b5272355ceb8171148672cffa0d4aa27b2c3" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } diff --git a/mmtk/src/api.rs b/mmtk/src/api.rs index 96c40dc9..9e5e67c5 100644 --- a/mmtk/src/api.rs +++ b/mmtk/src/api.rs @@ -179,18 +179,18 @@ pub extern "C" fn modify_check(object: ObjectReference) { } #[no_mangle] -pub extern "C" fn add_weak_candidate(reff: ObjectReference, referent: ObjectReference) { - memory_manager::add_weak_candidate(&SINGLETON, reff, referent) +pub extern "C" fn add_weak_candidate(reff: ObjectReference) { + memory_manager::add_weak_candidate(&SINGLETON, reff) } #[no_mangle] -pub extern "C" fn add_soft_candidate(reff: ObjectReference, referent: ObjectReference) { - memory_manager::add_soft_candidate(&SINGLETON, reff, referent) +pub extern "C" fn add_soft_candidate(reff: ObjectReference) { + memory_manager::add_soft_candidate(&SINGLETON, reff) } #[no_mangle] -pub extern "C" fn add_phantom_candidate(reff: ObjectReference, referent: ObjectReference) { - memory_manager::add_phantom_candidate(&SINGLETON, reff, referent) +pub extern "C" fn add_phantom_candidate(reff: ObjectReference) { + memory_manager::add_phantom_candidate(&SINGLETON, reff) } // The harness_begin()/end() functions are different than other API functions in terms of the thread state. diff --git a/mmtk/src/object_scanning.rs b/mmtk/src/object_scanning.rs index 751a4be1..011f6cb7 100644 --- a/mmtk/src/object_scanning.rs +++ b/mmtk/src/object_scanning.rs @@ -117,17 +117,18 @@ impl OopIterate for InstanceRefKlass { if Self::should_scan_weak_refs() { let reference = ObjectReference::from(oop); - let referent = unsafe { Self::referent_address(oop).load::() }; match self.instance_klass.reference_type { ReferenceType::None => { panic!("oop_iterate on InstanceRefKlass with reference_type as None") } - ReferenceType::Weak => add_weak_candidate(reference, referent), - ReferenceType::Soft => add_soft_candidate(reference, referent), - ReferenceType::Phantom => add_phantom_candidate(reference, referent), + ReferenceType::Weak => add_weak_candidate(reference), + ReferenceType::Soft => add_soft_candidate(reference), + ReferenceType::Phantom => add_phantom_candidate(reference), // Process these two types normally (as if they are strong refs) // We will handle final reference later - ReferenceType::Final | ReferenceType::Other => Self::process_ref_as_strong(oop, closure), + ReferenceType::Final | ReferenceType::Other => { + Self::process_ref_as_strong(oop, closure) + } } } else { Self::process_ref_as_strong(oop, closure); diff --git a/mmtk/src/reference_glue.rs b/mmtk/src/reference_glue.rs index a6feefd8..d3f1233b 100644 --- a/mmtk/src/reference_glue.rs +++ b/mmtk/src/reference_glue.rs @@ -1,6 +1,7 @@ use crate::abi::{InstanceRefKlass, Oop}; use crate::OpenJDK; use crate::UPCALLS; +use mmtk::util::opaque_pointer::VMWorkerThread; use mmtk::util::ObjectReference; use mmtk::vm::ReferenceGlue; @@ -15,7 +16,7 @@ impl ReferenceGlue for VMReferenceGlue { let oop = Oop::from(object); unsafe { InstanceRefKlass::referent_address(oop).load::() } } - fn enqueue_references(references: &[ObjectReference]) { + fn enqueue_references(references: &[ObjectReference], _tls: VMWorkerThread) { unsafe { ((*UPCALLS).enqueue_references)(references, references.len()); } From 9e92b4dcb413e85895b93ecfa730c4e504119479 Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Fri, 8 Apr 2022 10:16:12 +1000 Subject: [PATCH 15/16] Fix slice use in FFI. Update mmtk-core. --- mmtk/Cargo.toml | 2 +- mmtk/src/lib.rs | 2 +- mmtk/src/reference_glue.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index 5e3949cc..8bdf5cb0 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -28,7 +28,7 @@ once_cell = "1.10.0" # - change branch # - change repo name # But other changes including adding/removing whitespaces in commented lines may break the CI. -mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "1767b5272355ceb8171148672cffa0d4aa27b2c3" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "065377b3f0b32d0833c740fa5e179611fd176eed" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } diff --git a/mmtk/src/lib.rs b/mmtk/src/lib.rs index e134a776..6cafd30a 100644 --- a/mmtk/src/lib.rs +++ b/mmtk/src/lib.rs @@ -77,7 +77,7 @@ pub struct OpenJDK_Upcalls { pub number_of_mutators: extern "C" fn() -> usize, pub schedule_finalizer: extern "C" fn(), pub prepare_for_roots_re_scanning: extern "C" fn(), - pub enqueue_references: extern "C" fn(objects: &[ObjectReference], len: usize), + pub enqueue_references: extern "C" fn(objects: *const ObjectReference, len: usize), } pub static mut UPCALLS: *const OpenJDK_Upcalls = null_mut(); diff --git a/mmtk/src/reference_glue.rs b/mmtk/src/reference_glue.rs index d3f1233b..5e7c6309 100644 --- a/mmtk/src/reference_glue.rs +++ b/mmtk/src/reference_glue.rs @@ -18,7 +18,7 @@ impl ReferenceGlue for VMReferenceGlue { } fn enqueue_references(references: &[ObjectReference], _tls: VMWorkerThread) { unsafe { - ((*UPCALLS).enqueue_references)(references, references.len()); + ((*UPCALLS).enqueue_references)(references.as_ptr(), references.len()); } } } From 0a173e290fd181f844926968d1be3864dacc2d2c Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Thu, 28 Apr 2022 17:30:05 +1200 Subject: [PATCH 16/16] Update Cargo.toml --- mmtk/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index b6c8ad54..f8a6415d 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -28,7 +28,7 @@ once_cell = "1.10.0" # - change branch # - change repo name # But other changes including adding/removing whitespaces in commented lines may break the CI. -mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "4715b648c58e2cc4ffceddd634bc4f14a18d675c" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "21176127d1f0493444fd901ea7277099a24bcecc" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" }