Skip to content

Commit a7dc011

Browse files
committed
8366658: Add missing locks when accessing the VirtualMemoryTracker instance in tests and MemMapPrinter
Reviewed-by: azafari, phubner
1 parent 1cb1267 commit a7dc011

File tree

8 files changed

+49
-27
lines changed

8 files changed

+49
-27
lines changed

src/hotspot/share/nmt/memBaseline.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,9 @@ class VirtualMemoryAllocationWalker : public VirtualMemoryWalker {
138138

139139
void MemBaseline::baseline_summary() {
140140
MallocMemorySummary::snapshot(&_malloc_memory_snapshot);
141-
VirtualMemorySummary::snapshot(&_virtual_memory_snapshot);
142141
{
143142
MemTracker::NmtVirtualMemoryLocker nvml;
143+
VirtualMemorySummary::snapshot(&_virtual_memory_snapshot);
144144
MemoryFileTracker::Instance::summary_snapshot(&_virtual_memory_snapshot);
145145
}
146146

@@ -160,7 +160,7 @@ bool MemBaseline::baseline_allocation_sites() {
160160

161161
// Virtual memory allocation sites
162162
VirtualMemoryAllocationWalker virtual_memory_walker;
163-
if (!VirtualMemoryTracker::Instance::walk_virtual_memory(&virtual_memory_walker)) {
163+
if (!MemTracker::walk_virtual_memory(&virtual_memory_walker)) {
164164
return false;
165165
}
166166

src/hotspot/share/nmt/memMapPrinter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ class CachedNMTInformation : public VirtualMemoryWalker {
157157

158158
// Iterate all NMT virtual memory regions and fill this cache.
159159
bool fill_from_nmt() {
160-
return VirtualMemoryTracker::Instance::walk_virtual_memory(this);
160+
return MemTracker::walk_virtual_memory(this);
161161
}
162162
};
163163

src/hotspot/share/nmt/memTracker.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,13 @@ class MemTracker : AllStatic {
173173
}
174174
}
175175

176+
static inline bool walk_virtual_memory(VirtualMemoryWalker* walker) {
177+
assert_post_init();
178+
if (!enabled()) return false;
179+
MemTracker::NmtVirtualMemoryLocker nvml;
180+
return VirtualMemoryTracker::Instance::walk_virtual_memory(walker);
181+
}
182+
176183
static inline MemoryFileTracker::MemoryFile* register_file(const char* descriptive_name) {
177184
assert_post_init();
178185
if (!enabled()) return nullptr;

src/hotspot/share/nmt/nmtUsage.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "nmt/nmtCommon.hpp"
3030
#include "nmt/nmtUsage.hpp"
3131
#include "nmt/threadStackTracker.hpp"
32+
#include "runtime/mutexLocker.hpp"
3233

3334
// Enabled all options for snapshot.
3435
const NMTUsageOptions NMTUsage::OptionsAll = { true, true, true };
@@ -47,7 +48,9 @@ void NMTUsage::walk_thread_stacks() {
4748
// much memory had been committed if they are backed by virtual memory. This
4849
// needs to happen before we take the snapshot of the virtual memory since it
4950
// will update this information.
51+
MemTracker::NmtVirtualMemoryLocker locker;
5052
VirtualMemoryTracker::Instance::snapshot_thread_stacks();
53+
5154
}
5255

5356
void NMTUsage::update_malloc_usage() {

src/hotspot/share/nmt/virtualMemoryTracker.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,14 +208,15 @@ bool VirtualMemoryTracker::Instance::walk_virtual_memory(VirtualMemoryWalker* wa
208208
}
209209

210210
bool VirtualMemoryTracker::walk_virtual_memory(VirtualMemoryWalker* walker) {
211-
MemTracker::NmtVirtualMemoryLocker nvml;
211+
bool ret = true;
212212
tree()->visit_reserved_regions([&](ReservedMemoryRegion& rgn) {
213213
if (!walker->do_allocation_site(&rgn)) {
214+
ret = false;
214215
return false;
215216
}
216217
return true;
217218
});
218-
return true;
219+
return ret;
219220
}
220221

221222
size_t VirtualMemoryTracker::committed_size(const ReservedMemoryRegion* rmr) {
@@ -350,4 +351,4 @@ ReservedMemoryRegion RegionsTree::find_reserved_region(address addr) {
350351

351352
bool CommittedMemoryRegion::equals(const ReservedMemoryRegion& rmr) const {
352353
return size() == rmr.size() && call_stack()->equals(*(rmr.call_stack()));
353-
}
354+
}

src/hotspot/share/nmt/virtualMemoryTracker.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ class ReservedMemoryRegion : public VirtualMemoryRegion {
345345

346346
class VirtualMemoryWalker : public StackObj {
347347
public:
348-
virtual bool do_allocation_site(const ReservedMemoryRegion* rgn) { return false; }
348+
virtual bool do_allocation_site(const ReservedMemoryRegion* rgn) { return false; }
349349
};
350350

351351

@@ -409,4 +409,4 @@ class VirtualMemoryTracker {
409409
};
410410
};
411411

412-
#endif // SHARE_NMT_VIRTUALMEMORYTRACKER_HPP
412+
#endif // SHARE_NMT_VIRTUALMEMORYTRACKER_HPP

test/hotspot/gtest/runtime/test_committed_virtualmemory.cpp

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,12 @@ class CommittedVirtualMemoryTest {
3838

3939
MemTracker::record_thread_stack(stack_end, stack_size);
4040

41-
VirtualMemoryTracker::Instance::add_reserved_region(stack_end, stack_size, CALLER_PC, mtThreadStack);
42-
43-
// snapshot current stack usage
44-
VirtualMemoryTracker::Instance::snapshot_thread_stacks();
41+
{
42+
MemTracker::NmtVirtualMemoryLocker nvml;
43+
VirtualMemoryTracker::Instance::add_reserved_region(stack_end, stack_size, CALLER_PC, mtThreadStack);
44+
// snapshot current stack usage
45+
VirtualMemoryTracker::Instance::snapshot_thread_stacks();
46+
}
4547

4648
ReservedMemoryRegion rmr_found;
4749
{
@@ -106,23 +108,29 @@ class CommittedVirtualMemoryTest {
106108
}
107109

108110
// trigger the test
109-
VirtualMemoryTracker::Instance::snapshot_thread_stacks();
110-
111-
ReservedMemoryRegion rmr_found = VirtualMemoryTracker::Instance::tree()->find_reserved_region((address)base);
111+
ReservedMemoryRegion rmr_found;
112+
{
113+
MemTracker::NmtVirtualMemoryLocker nvml;
114+
VirtualMemoryTracker::Instance::snapshot_thread_stacks();
115+
rmr_found = VirtualMemoryTracker::Instance::tree()->find_reserved_region((address)base);
116+
}
112117
ASSERT_TRUE(rmr_found.is_valid());
113118
ASSERT_EQ(rmr_found.base(), (address)base);
114119

115120

116121
bool precise_tracking_supported = false;
117-
VirtualMemoryTracker::Instance::tree()->visit_committed_regions(rmr_found, [&](const CommittedMemoryRegion& cmr){
118-
if (cmr.size() == size) {
119-
return false;
120-
} else {
121-
precise_tracking_supported = true;
122-
check_covered_pages(cmr.base(), cmr.size(), (address)base, touch_pages, page_num);
123-
}
124-
return true;
125-
});
122+
{
123+
MemTracker::NmtVirtualMemoryLocker nvml;
124+
VirtualMemoryTracker::Instance::tree()->visit_committed_regions(rmr_found, [&](const CommittedMemoryRegion& cmr){
125+
if (cmr.size() == size) {
126+
return false;
127+
} else {
128+
precise_tracking_supported = true;
129+
check_covered_pages(cmr.base(), cmr.size(), (address)base, touch_pages, page_num);
130+
}
131+
return true;
132+
});
133+
}
126134

127135
if (precise_tracking_supported) {
128136
// All touched pages should be committed
@@ -133,8 +141,11 @@ class CommittedVirtualMemoryTest {
133141

134142
// Cleanup
135143
os::disclaim_memory(base, size);
136-
VirtualMemoryTracker::Instance::remove_released_region((address)base, size);
137-
rmr_found = VirtualMemoryTracker::Instance::tree()->find_reserved_region((address)base);
144+
{
145+
MemTracker::NmtVirtualMemoryLocker nvml;
146+
VirtualMemoryTracker::Instance::remove_released_region((address)base, size);
147+
rmr_found = VirtualMemoryTracker::Instance::tree()->find_reserved_region((address)base);
148+
}
138149
ASSERT_TRUE(!rmr_found.is_valid());
139150
}
140151

test/hotspot/gtest/runtime/test_virtualMemoryTracker.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ namespace {
5959

6060
static void diagnostic_print(VirtualMemoryTracker& vmt, const ReservedMemoryRegion& rmr) {
6161
LOG("In reserved region " PTR_FORMAT ", size %X:", p2i(rmr.base()), rmr.size());
62-
VirtualMemoryTracker::Instance::tree()->visit_committed_regions(rmr, [&](CommittedMemoryRegion& region) {
62+
vmt.tree()->visit_committed_regions(rmr, [&](CommittedMemoryRegion& region) {
6363
LOG(" committed region: " PTR_FORMAT ", size %X", p2i(region.base()), region.size());
6464
return true;
6565
});

0 commit comments

Comments
 (0)