Skip to content

Commit 528f8c6

Browse files
qinsoonpaigereeves
andauthored
Mimalloc marksweep support (#180)
Co-authored-by: paigereeves <paigereeves006@gmail.com>
1 parent 3a3bde9 commit 528f8c6

14 files changed

+104
-9
lines changed

.github/scripts/ci-test-assertions.sh

+6
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ export MMTK_PLAN=NoGC
3939
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
4040
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
4141

42+
# --- MarkSweep ---
43+
export MMTK_PLAN=MarkSweep
44+
45+
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
46+
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
47+
4248
# -- PageProtect --
4349
sudo sysctl -w vm.max_map_count=655300
4450
export MMTK_PLAN=PageProtect

.github/scripts/ci-test-global-alloc-bit.sh

+7
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,13 @@ build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHea
4040
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
4141
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
4242

43+
# --- MarkSweep ---
44+
export MMTK_PLAN=MarkSweep
45+
46+
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
47+
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
48+
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
49+
4350
# --- NoGC ---
4451

4552
export MMTK_PLAN=NoGC

.github/scripts/ci-test-only-normal.sh

+17
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,23 @@ build/linux-x86_64-normal-server-$DEBUG_LEVEL/jdk/bin/java -XX:+UseThirdPartyHea
110110
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
111111
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
112112

113+
# --- MarkSweep ---
114+
export MMTK_PLAN=MarkSweep
115+
# Test - the benchmarks that are commented out do not work yet
116+
# 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.
117+
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
118+
#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
119+
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
120+
#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
121+
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
122+
#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
123+
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
124+
#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
125+
126+
# These benchmarks take 40s+ for slowdebug build, we may consider removing them from the CI
127+
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
128+
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
129+
113130
# --- PageProtect ---
114131
# Make sure this runs last in our tests unless we want to set it back to the default limit.
115132
sudo sysctl -w vm.max_map_count=655300

mmtk/Cargo.lock

+23-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mmtk/Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ once_cell = "1.10.0"
3030
# - change branch
3131
# - change repo name
3232
# But other changes including adding/removing whitespaces in commented lines may break the CI.
33-
mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "69b4fe46ee4353a2fdeb4911ba914b63a7ffa29a" }
33+
mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "6e1b4df8e6bf41f86c24824b4c664f05b2b9fbfb" }
3434
# Uncomment the following to build locally
3535
# mmtk = { path = "../repos/mmtk-core" }
3636

@@ -59,6 +59,6 @@ malloc_mark_sweep = ["mmtk/malloc_mark_sweep"]
5959
nogc = []
6060
semispace = []
6161
gencopy = []
62-
marksweep = ["mmtk/malloc_mark_sweep"]
62+
marksweep = []
6363
pageprotect = []
6464
immix = []

mmtk/src/api.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ pub extern "C" fn bind_mutator(tls: VMMutatorThread) -> *mut Mutator<OpenJDK> {
106106
// It is fine we turn the pointer back to box, as we turned a boxed value to the raw pointer in bind_mutator()
107107
#[allow(clippy::not_unsafe_ptr_arg_deref)]
108108
pub extern "C" fn destroy_mutator(mutator: *mut Mutator<OpenJDK>) {
109-
memory_manager::destroy_mutator(unsafe { Box::from_raw(mutator) })
109+
memory_manager::destroy_mutator(unsafe { &mut *mutator })
110110
}
111111

112112
#[no_mangle]

mmtk/src/lib.rs

+8
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ pub static GLOBAL_SIDE_METADATA_VM_BASE_ADDRESS: uintptr_t =
111111
pub static GLOBAL_ALLOC_BIT_ADDRESS: uintptr_t =
112112
mmtk::util::metadata::side_metadata::ALLOC_SIDE_METADATA_ADDR.as_usize();
113113

114+
#[no_mangle]
115+
pub static FREE_LIST_ALLOCATOR_SIZE: uintptr_t =
116+
std::mem::size_of::<mmtk::util::alloc::FreeListAllocator<OpenJDK>>();
117+
114118
#[derive(Default)]
115119
pub struct OpenJDK;
116120

@@ -130,6 +134,10 @@ impl VMBinding for OpenJDK {
130134

131135
type VMEdge = OpenJDKEdge;
132136
type VMMemorySlice = Range<Address>;
137+
138+
const MIN_ALIGNMENT: usize = 8;
139+
const MAX_ALIGNMENT: usize = 8;
140+
const USE_ALLOCATION_OFFSET: bool = false;
133141
}
134142

135143
use std::sync::atomic::AtomicBool;

mmtk/src/object_model.rs

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ impl ObjectModel<OpenJDK> for VMObjectModel {
1818
const LOCAL_MARK_BIT_SPEC: VMLocalMarkBitSpec = vm_metadata::MARKING_METADATA_SPEC;
1919
const LOCAL_LOS_MARK_NURSERY_SPEC: VMLocalLOSMarkNurserySpec = vm_metadata::LOS_METADATA_SPEC;
2020

21+
const UNIFIED_OBJECT_REFERENCE_ADDRESS: bool = true;
22+
const OBJECT_REF_OFFSET_LOWER_BOUND: isize = 0;
23+
2124
#[inline]
2225
fn copy(
2326
from: ObjectReference,

openjdk/mmtk.h

+2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ extern const uintptr_t GLOBAL_SIDE_METADATA_BASE_ADDRESS;
2222
extern const uintptr_t GLOBAL_SIDE_METADATA_VM_BASE_ADDRESS;
2323
extern const uintptr_t GLOBAL_ALLOC_BIT_ADDRESS;
2424
extern const size_t MMTK_MARK_COMPACT_HEADER_RESERVED_IN_BYTES;
25+
extern const uintptr_t FREE_LIST_ALLOCATOR_SIZE;
2526

2627
extern const char* get_mmtk_version();
2728

@@ -77,6 +78,7 @@ struct AllocatorSelector {
7778
#define TAG_MALLOC 2
7879
#define TAG_IMMIX 3
7980
#define TAG_MARK_COMPACT 4
81+
#define TAG_FREE_LIST 5
8082

8183
extern AllocatorSelector get_allocator_mapping(int allocator);
8284
extern size_t get_max_non_los_default_alloc_bytes();

openjdk/mmtkBarrierSet.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ void MMTkBarrierSet::resize_covered_region(MemRegion new_region) {
105105

106106
void MMTkBarrierSet::on_thread_destroy(Thread* thread) {
107107
thread->third_party_heap_mutator.flush();
108+
thread->third_party_heap_mutator.destroy();
108109
}
109110

110111
void MMTkBarrierSet::on_thread_attach(JavaThread* thread) {

openjdk/mmtkBarrierSetAssembler_x86.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ void MMTkBarrierSetAssembler::eden_allocate(MacroAssembler* masm, Register threa
6868
__ jcc(Assembler::aboveEqual, slow_case);
6969
}
7070

71-
if (selector.tag == TAG_MALLOC || selector.tag == TAG_LARGE_OBJECT) {
71+
if (selector.tag == TAG_MALLOC || selector.tag == TAG_LARGE_OBJECT || selector.tag == TAG_FREE_LIST) {
7272
__ jmp(slow_case);
7373
return;
7474
}

openjdk/mmtkBarrierSetC2.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ void MMTkBarrierSetC2::expand_allocate(PhaseMacroExpand* x,
132132

133133
if (x->C->env()->dtrace_alloc_probes() || !MMTK_ENABLE_ALLOCATION_FASTPATH
134134
// Malloc allocator has no fastpath
135-
|| (selector.tag == TAG_MALLOC || selector.tag == TAG_LARGE_OBJECT)) {
135+
|| (selector.tag == TAG_MALLOC || selector.tag == TAG_LARGE_OBJECT || selector.tag == TAG_FREE_LIST)) {
136136
// Force slow-path allocation
137137
always_slow = true;
138138
initial_slow_test = NULL;

openjdk/mmtkMutator.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
size_t MMTkMutatorContext::max_non_los_default_alloc_bytes = 0;
77

88
MMTkMutatorContext MMTkMutatorContext::bind(::Thread* current) {
9+
if (FREE_LIST_ALLOCATOR_SIZE != sizeof(FreeListAllocator)) {
10+
printf("ERROR: Unmatched free list allocator size: rs=%zu cpp=%zu\n", FREE_LIST_ALLOCATOR_SIZE, sizeof(FreeListAllocator));
11+
guarantee(false, "ERROR");
12+
}
913
return *((MMTkMutatorContext*) ::bind_mutator((void*) current));
1014
}
1115

@@ -34,3 +38,7 @@ HeapWord* MMTkMutatorContext::alloc(size_t bytes, Allocator allocator) {
3438
void MMTkMutatorContext::flush() {
3539
::flush_mutator((MMTk_Mutator) this);
3640
}
41+
42+
void MMTkMutatorContext::destroy() {
43+
::destroy_mutator((MMTk_Mutator) this);
44+
}

openjdk/mmtkMutator.hpp

+24
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ const int MAX_BUMP_ALLOCATORS = 6;
2323
const int MAX_LARGE_OBJECT_ALLOCATORS = 2;
2424
const int MAX_MALLOC_ALLOCATORS = 1;
2525
const int MAX_IMMIX_ALLOCATORS = 1;
26+
const int MAX_FREE_LIST_ALLOCATORS = 2;
2627
const int MAX_MARK_COMPACT_ALLOCATORS = 1;
2728

2829
// The following types should have the same layout as the types with the same name in MMTk core (Rust)
@@ -57,6 +58,27 @@ struct ImmixAllocator {
5758
uintptr_t line_opt;
5859
};
5960

61+
struct FLBlock {
62+
void* Address;
63+
};
64+
65+
struct FLBlockList {
66+
FLBlock first;
67+
FLBlock last;
68+
size_t size;
69+
char lock;
70+
};
71+
72+
struct FreeListAllocator {
73+
void* tls;
74+
void* space;
75+
RustDynPtr plan;
76+
FLBlockList* available_blocks;
77+
FLBlockList* available_blocks_stress;
78+
FLBlockList* unswept_blocks;
79+
FLBlockList* consumed_blocks;
80+
};
81+
6082
struct MallocAllocator {
6183
void* tls;
6284
void* space;
@@ -72,6 +94,7 @@ struct Allocators {
7294
LargeObjectAllocator large_object[MAX_LARGE_OBJECT_ALLOCATORS];
7395
MallocAllocator malloc[MAX_MALLOC_ALLOCATORS];
7496
ImmixAllocator immix[MAX_IMMIX_ALLOCATORS];
97+
FreeListAllocator free_list[MAX_FREE_LIST_ALLOCATORS];
7598
MarkCompactAllocator markcompact[MAX_MARK_COMPACT_ALLOCATORS];
7699
};
77100

@@ -92,6 +115,7 @@ struct MMTkMutatorContext {
92115
HeapWord* alloc(size_t bytes, Allocator allocator = AllocatorDefault);
93116

94117
void flush();
118+
void destroy();
95119

96120
static MMTkMutatorContext bind(::Thread* current);
97121
static bool is_ready_to_bind();

0 commit comments

Comments
 (0)