From 575b02f4c145767905681e67d948b7336aba81f8 Mon Sep 17 00:00:00 2001 From: Wenyu Zhao Date: Thu, 17 Aug 2023 15:13:12 +1000 Subject: [PATCH 1/5] Pass hotspot cmdline flags to mmtk --- mmtk/src/api.rs | 33 +++++++++++++++++++++++++++++ openjdk/mmtk.h | 3 +++ openjdk/mmtkHeap.cpp | 2 ++ openjdk/thirdPartyHeapArguments.cpp | 6 ++++++ 4 files changed, 44 insertions(+) diff --git a/mmtk/src/api.rs b/mmtk/src/api.rs index 25fb34af..0c7ea8de 100644 --- a/mmtk/src/api.rs +++ b/mmtk/src/api.rs @@ -18,6 +18,7 @@ use mmtk::MutatorContext; use once_cell::sync; use std::cell::RefCell; use std::ffi::{CStr, CString}; +use std::fmt::Display; use std::sync::atomic::Ordering; // Supported barriers: @@ -290,6 +291,38 @@ pub extern "C" fn process(name: *const c_char, value: *const c_char) -> bool { ) } +// We trust the name/value pointer is valid. +#[allow(clippy::not_unsafe_ptr_arg_deref)] +fn set_hotspot_flag_impl(name: *const c_char, value: T) { + let name_cstr: &CStr = unsafe { CStr::from_ptr(name) }; + let name = name_cstr.to_str().unwrap(); + println!("set {}={}", name, value); + let mut builder = BUILDER.lock().unwrap(); + let value_str = format!("{}", value); + let result = match name { + "ParallelGCThreads" => builder.set_option("threads", &value_str), + "UseTransparentHugePages" => builder.set_option("transparent_hugepages", &value_str), + _ => unimplemented!("Unsupported flag: {}", name), + }; + assert!( + result, + "Failed to pass hotspot flag {}={} to mmtk-core", + name, value + ); +} + +/// Pass a hotspot integer command line flag to mmtk +#[no_mangle] +pub extern "C" fn mmtk_set_hotspot_flag_uint(name: *const c_char, value: u32) { + set_hotspot_flag_impl(name, value) +} + +/// Pass a hotspot boolean command line flag to mmtk +#[no_mangle] +pub extern "C" fn mmtk_set_hotspot_flag_bool(name: *const c_char, value: bool) { + set_hotspot_flag_impl(name, value) +} + #[no_mangle] // We trust the name/value pointer is valid. #[allow(clippy::not_unsafe_ptr_arg_deref)] diff --git a/openjdk/mmtk.h b/openjdk/mmtk.h index ab47acca..7039da1b 100644 --- a/openjdk/mmtk.h +++ b/openjdk/mmtk.h @@ -211,6 +211,9 @@ extern void add_phantom_candidate(void* ref, void* referent); extern void mmtk_harness_begin_impl(); extern void mmtk_harness_end_impl(); +extern void mmtk_set_hotspot_flag_uint(const char* name, unsigned int value); +extern void mmtk_set_hotspot_flag_bool(const char* name, bool value); + #ifdef __cplusplus } #endif diff --git a/openjdk/mmtkHeap.cpp b/openjdk/mmtkHeap.cpp index 4197f64d..944ff37e 100644 --- a/openjdk/mmtkHeap.cpp +++ b/openjdk/mmtkHeap.cpp @@ -88,6 +88,8 @@ jint MMTkHeap::initialize() { bool set_options = process_bulk(strdup(ThirdPartyHeapOptions)); guarantee(set_options, "Failed to set MMTk options. Please check if the options are valid: %s\n", ThirdPartyHeapOptions); } + mmtk_set_hotspot_flag_uint("ParallelGCThreads", ParallelGCThreads); + mmtk_set_hotspot_flag_bool("UseTransparentHugePages", UseTransparentHugePages); // Set heap size bool set_heap_size = mmtk_set_heap_size(min_heap_size, max_heap_size); guarantee(set_heap_size, "Failed to set MMTk heap size. Please check if the heap size is valid: min = %ld, max = %ld\n", min_heap_size, max_heap_size); diff --git a/openjdk/thirdPartyHeapArguments.cpp b/openjdk/thirdPartyHeapArguments.cpp index 745250df..326b646f 100644 --- a/openjdk/thirdPartyHeapArguments.cpp +++ b/openjdk/thirdPartyHeapArguments.cpp @@ -45,6 +45,12 @@ void ThirdPartyHeapArguments::initialize() { FLAG_SET_DEFAULT(UseTLAB, false); FLAG_SET_DEFAULT(UseCompressedOops, false); FLAG_SET_DEFAULT(UseCompressedClassPointers, false); + FLAG_SET_DEFAULT(ParallelGCThreads, Abstract_VM_Version::parallel_worker_threads()); + if (ParallelGCThreads == 0) { + assert(!FLAG_IS_DEFAULT(ParallelGCThreads), "ParallelGCThreads should not be 0."); + vm_exit_during_initialization("The flag -XX:+UseUseThirdPartyHeap can not be combined with -XX:ParallelGCThreads=0", NULL); + } + } CollectedHeap* ThirdPartyHeapArguments::create_heap() { From 13c3d35ac350a3404f32db9d848ffb17853dadd9 Mon Sep 17 00:00:00 2001 From: Wenyu Zhao Date: Thu, 17 Aug 2023 15:18:43 +1000 Subject: [PATCH 2/5] lower hotspot flag priority --- openjdk/mmtkHeap.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openjdk/mmtkHeap.cpp b/openjdk/mmtkHeap.cpp index 944ff37e..8b6a0e2a 100644 --- a/openjdk/mmtkHeap.cpp +++ b/openjdk/mmtkHeap.cpp @@ -84,12 +84,12 @@ jint MMTkHeap::initialize() { // printf("policy max heap size %zu, min heap size %zu\n", heap_size, collector_policy()->min_heap_byte_size()); // Set options + mmtk_set_hotspot_flag_uint("ParallelGCThreads", ParallelGCThreads); + mmtk_set_hotspot_flag_bool("UseTransparentHugePages", UseTransparentHugePages); if (ThirdPartyHeapOptions != NULL) { bool set_options = process_bulk(strdup(ThirdPartyHeapOptions)); guarantee(set_options, "Failed to set MMTk options. Please check if the options are valid: %s\n", ThirdPartyHeapOptions); } - mmtk_set_hotspot_flag_uint("ParallelGCThreads", ParallelGCThreads); - mmtk_set_hotspot_flag_bool("UseTransparentHugePages", UseTransparentHugePages); // Set heap size bool set_heap_size = mmtk_set_heap_size(min_heap_size, max_heap_size); guarantee(set_heap_size, "Failed to set MMTk heap size. Please check if the heap size is valid: min = %ld, max = %ld\n", min_heap_size, max_heap_size); From d88e321a879548a8bfb2cc4b7af822be17bb5786 Mon Sep 17 00:00:00 2001 From: Wenyu Zhao Date: Thu, 17 Aug 2023 15:24:31 +1000 Subject: [PATCH 3/5] Remove println --- mmtk/src/api.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/mmtk/src/api.rs b/mmtk/src/api.rs index 0c7ea8de..4e42f452 100644 --- a/mmtk/src/api.rs +++ b/mmtk/src/api.rs @@ -296,7 +296,6 @@ pub extern "C" fn process(name: *const c_char, value: *const c_char) -> bool { fn set_hotspot_flag_impl(name: *const c_char, value: T) { let name_cstr: &CStr = unsafe { CStr::from_ptr(name) }; let name = name_cstr.to_str().unwrap(); - println!("set {}={}", name, value); let mut builder = BUILDER.lock().unwrap(); let value_str = format!("{}", value); let result = match name { From ca5ef5a53dcf8d42a2466a5424ac82be872dc7ca Mon Sep 17 00:00:00 2001 From: Wenyu Zhao Date: Thu, 17 Aug 2023 16:02:13 +1000 Subject: [PATCH 4/5] Use typed setter --- mmtk/src/api.rs | 34 ++++++++-------------------------- openjdk/mmtk.h | 4 ++-- openjdk/mmtkHeap.cpp | 4 ++-- 3 files changed, 12 insertions(+), 30 deletions(-) diff --git a/mmtk/src/api.rs b/mmtk/src/api.rs index 4e42f452..c0e8317d 100644 --- a/mmtk/src/api.rs +++ b/mmtk/src/api.rs @@ -18,7 +18,6 @@ use mmtk::MutatorContext; use once_cell::sync; use std::cell::RefCell; use std::ffi::{CStr, CString}; -use std::fmt::Display; use std::sync::atomic::Ordering; // Supported barriers: @@ -291,35 +290,18 @@ pub extern "C" fn process(name: *const c_char, value: *const c_char) -> bool { ) } -// We trust the name/value pointer is valid. -#[allow(clippy::not_unsafe_ptr_arg_deref)] -fn set_hotspot_flag_impl(name: *const c_char, value: T) { - let name_cstr: &CStr = unsafe { CStr::from_ptr(name) }; - let name = name_cstr.to_str().unwrap(); - let mut builder = BUILDER.lock().unwrap(); - let value_str = format!("{}", value); - let result = match name { - "ParallelGCThreads" => builder.set_option("threads", &value_str), - "UseTransparentHugePages" => builder.set_option("transparent_hugepages", &value_str), - _ => unimplemented!("Unsupported flag: {}", name), - }; - assert!( - result, - "Failed to pass hotspot flag {}={} to mmtk-core", - name, value - ); -} - -/// Pass a hotspot integer command line flag to mmtk +/// Pass hotspot `ParallelGCThreads` flag to mmtk #[no_mangle] -pub extern "C" fn mmtk_set_hotspot_flag_uint(name: *const c_char, value: u32) { - set_hotspot_flag_impl(name, value) +pub extern "C" fn mmtk_builder_set_threads(value: usize) { + let mut builder = BUILDER.lock().unwrap(); + builder.options.threads.set(value); } -/// Pass a hotspot boolean command line flag to mmtk +/// Pass hotspot `UseTransparentHugePages` flag to mmtk #[no_mangle] -pub extern "C" fn mmtk_set_hotspot_flag_bool(name: *const c_char, value: bool) { - set_hotspot_flag_impl(name, value) +pub extern "C" fn mmtk_builder_set_transparent_hugepages(value: bool) { + let mut builder = BUILDER.lock().unwrap(); + builder.options.transparent_hugepages.set(value); } #[no_mangle] diff --git a/openjdk/mmtk.h b/openjdk/mmtk.h index 7039da1b..3dacf6a9 100644 --- a/openjdk/mmtk.h +++ b/openjdk/mmtk.h @@ -211,8 +211,8 @@ extern void add_phantom_candidate(void* ref, void* referent); extern void mmtk_harness_begin_impl(); extern void mmtk_harness_end_impl(); -extern void mmtk_set_hotspot_flag_uint(const char* name, unsigned int value); -extern void mmtk_set_hotspot_flag_bool(const char* name, bool value); +extern void mmtk_builder_set_threads(size_t value); +extern void mmtk_builder_set_transparent_hugepages(bool value); #ifdef __cplusplus } diff --git a/openjdk/mmtkHeap.cpp b/openjdk/mmtkHeap.cpp index 8b6a0e2a..eb6f4e2e 100644 --- a/openjdk/mmtkHeap.cpp +++ b/openjdk/mmtkHeap.cpp @@ -84,8 +84,8 @@ jint MMTkHeap::initialize() { // printf("policy max heap size %zu, min heap size %zu\n", heap_size, collector_policy()->min_heap_byte_size()); // Set options - mmtk_set_hotspot_flag_uint("ParallelGCThreads", ParallelGCThreads); - mmtk_set_hotspot_flag_bool("UseTransparentHugePages", UseTransparentHugePages); + mmtk_builder_set_threads(ParallelGCThreads); + mmtk_builder_set_transparent_hugepages(UseTransparentHugePages); if (ThirdPartyHeapOptions != NULL) { bool set_options = process_bulk(strdup(ThirdPartyHeapOptions)); guarantee(set_options, "Failed to set MMTk options. Please check if the options are valid: %s\n", ThirdPartyHeapOptions); From 8ef4eafb78c81e5e2fea129c03acbe50491d7232 Mon Sep 17 00:00:00 2001 From: Wenyu Zhao Date: Thu, 17 Aug 2023 16:20:42 +1000 Subject: [PATCH 5/5] Update mmtk-core --- mmtk/Cargo.lock | 4 ++-- mmtk/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mmtk/Cargo.lock b/mmtk/Cargo.lock index 6d3db38b..e5c02fa6 100644 --- a/mmtk/Cargo.lock +++ b/mmtk/Cargo.lock @@ -436,7 +436,7 @@ dependencies = [ [[package]] name = "mmtk" version = "0.18.0" -source = "git+https://github.com/mmtk/mmtk-core.git?rev=04a47feb4598b2120598453c2cceec83986c2122#04a47feb4598b2120598453c2cceec83986c2122" +source = "git+https://github.com/mmtk/mmtk-core.git?rev=4873b4ab4016a2a5ef413463443856efa373e90c#4873b4ab4016a2a5ef413463443856efa373e90c" dependencies = [ "atomic", "atomic-traits", @@ -468,7 +468,7 @@ dependencies = [ [[package]] name = "mmtk-macros" version = "0.18.0" -source = "git+https://github.com/mmtk/mmtk-core.git?rev=04a47feb4598b2120598453c2cceec83986c2122#04a47feb4598b2120598453c2cceec83986c2122" +source = "git+https://github.com/mmtk/mmtk-core.git?rev=4873b4ab4016a2a5ef413463443856efa373e90c#4873b4ab4016a2a5ef413463443856efa373e90c" dependencies = [ "proc-macro-error", "proc-macro2", diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index 99244cd3..04e25c33 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -30,7 +30,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 = "04a47feb4598b2120598453c2cceec83986c2122" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "4873b4ab4016a2a5ef413463443856efa373e90c" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" }