# HG changeset patch # User stuefe # Date 1571323185 -7200 # Node ID 2d5dd194c65c2c0337a70628fc22b9d38b942f54 # Parent a2d3074db7a9346b0eb516120764aaf36fc6fdac Lessen verification costs diff -r a2d3074db7a9 -r 2d5dd194c65c src/hotspot/share/memory/metaspace/chunkManager.cpp --- a/src/hotspot/share/memory/metaspace/chunkManager.cpp Wed Oct 16 17:41:03 2019 +0200 +++ b/src/hotspot/share/memory/metaspace/chunkManager.cpp Thu Oct 17 16:39:45 2019 +0200 @@ -33,6 +33,7 @@ #include "memory/metaspace/chunkManager.hpp" #include "memory/metaspace/internStat.hpp" #include "memory/metaspace/metachunk.hpp" +#include "memory/metaspace/metaDebug.hpp" #include "memory/metaspace/metaspaceCommon.hpp" #include "memory/metaspace/metaspaceStatistics.hpp" #include "memory/metaspace/virtualSpaceNode.hpp" @@ -110,7 +111,6 @@ DEBUG_ONLY(chklvl::check_valid_level(target_level);) DEBUG_ONLY(c->verify(true);) - DEBUG_ONLY(c->vsnode()->verify(true);) // Chunk must be outside of our freelists assert(_chunks.contains(c) == false, "Chunk is in freelist."); @@ -129,7 +129,7 @@ DEBUG_ONLY(verify_locked(true);) - DEBUG_ONLY(c->vsnode()->verify(true);) + SOMETIMES(c->vsnode()->verify(true);) return c; } @@ -238,6 +238,7 @@ c->set_in_use(); DEBUG_ONLY(verify_locked(false);) + SOMETIMES(c->vsnode()->verify(true);) log_debug(metaspace)("ChunkManager %s: handing out chunk " METACHUNK_FORMAT ".", _name, METACHUNK_FORMAT_ARGS(c)); @@ -263,8 +264,7 @@ log_debug(metaspace)("ChunkManager %s: returning chunk " METACHUNK_FORMAT ".", _name, METACHUNK_FORMAT_ARGS(c)); - DEBUG_ONLY(verify_locked(false);) - DEBUG_ONLY(c->verify(false);) + DEBUG_ONLY(c->verify(true);) assert(!_chunks.contains(c), "A chunk to be added to the freelist must not be in the freelist already."); @@ -308,7 +308,7 @@ return_chunk_simple(c); DEBUG_ONLY(verify_locked(false);) - DEBUG_ONLY(c->vsnode()->verify(true);) + SOMETIMES(c->vsnode()->verify(true);) DEBUG_ONLY(InternalStats::inc_num_chunks_returned_to_freelist();) diff -r a2d3074db7a9 -r 2d5dd194c65c src/hotspot/share/memory/metaspace/commitMask.cpp --- a/src/hotspot/share/memory/metaspace/commitMask.cpp Wed Oct 16 17:41:03 2019 +0200 +++ b/src/hotspot/share/memory/metaspace/commitMask.cpp Thu Oct 17 16:39:45 2019 +0200 @@ -24,7 +24,6 @@ */ -#include #include "precompiled.hpp" #include "memory/metaspace/commitMask.hpp" @@ -49,36 +48,44 @@ #ifdef ASSERT +// This is very expensive static const bool TEST_UNCOMMITTED_REGION = false; volatile u1 x; -void CommitMask::verify(bool slow, bool do_touch_test) const { +static void check_range_is_accessible(const MetaWord* p, size_t word_size) { + const MetaWord* const p_end = p + word_size; + u1 x2 = 0; + for (const MetaWord* q = p; q < p_end; q += os::vm_page_size() / BytesPerWord) { + x2 += *(u1*)q; + } + x = x2; +} + +void CommitMask::verify(bool slow) const { // Walk the whole commit mask. // For each 1 bit, check if the associated granule is accessible. // For each 0 bit, check if the associated granule is not accessible. Slow mode only. + assert(_base != NULL && _word_size > 0 && _words_per_bit > 0, "Sanity"); assert_is_aligned(_base, _words_per_bit * BytesPerWord); assert_is_aligned(_word_size, _words_per_bit); - if (do_touch_test) { + if (slow) { for (idx_t i = 0; i < size(); i ++) { const MetaWord* const p = _base + (i * _words_per_bit); if (at(i)) { // Should be accessible. Just touch it. - x ^= *(u1*)p; + check_range_is_accessible(p, _words_per_bit); } else { - // Should not be accessible. - if (slow) { - // Note: results may differ between platforms. On Linux, this should be true since - // we uncommit memory by setting protection to PROT_NONE. We may have to look if - // this works as expected on other platforms. - if (TEST_UNCOMMITTED_REGION && CanUseSafeFetch32()) { - assert(os::is_readable_pointer(p) == false, - "index %u, pointer " PTR_FORMAT ", should not be accessible.", - (unsigned)i, p2i(p)); - } + // Note: results may differ between platforms. On Linux, this should be true since + // we uncommit memory by setting protection to PROT_NONE. We may have to look if + // this works as expected on other platforms. + if (TEST_UNCOMMITTED_REGION && CanUseSafeFetch32()) { + assert(os::is_readable_pointer(p) == false, + "index %u, pointer " PTR_FORMAT ", should not be accessible.", + (unsigned)i, p2i(p)); } } } diff -r a2d3074db7a9 -r 2d5dd194c65c src/hotspot/share/memory/metaspace/commitMask.hpp --- a/src/hotspot/share/memory/metaspace/commitMask.hpp Wed Oct 16 17:41:03 2019 +0200 +++ b/src/hotspot/share/memory/metaspace/commitMask.hpp Thu Oct 17 16:39:45 2019 +0200 @@ -180,7 +180,7 @@ //// Debug stuff //// - DEBUG_ONLY(void verify(bool slow, bool do_touch_test = true) const;) + DEBUG_ONLY(void verify(bool slow) const;) void print_on(outputStream* st) const; diff -r a2d3074db7a9 -r 2d5dd194c65c src/hotspot/share/memory/metaspace/metaDebug.hpp --- a/src/hotspot/share/memory/metaspace/metaDebug.hpp Wed Oct 16 17:41:03 2019 +0200 +++ b/src/hotspot/share/memory/metaspace/metaDebug.hpp Thu Oct 17 16:39:45 2019 +0200 @@ -26,6 +26,7 @@ #define SHARE_MEMORY_METASPACE_METADEBUG_HPP #include "memory/allocation.hpp" +#include "runtime/globals.hpp" // For MetaspaceVerifyInterval namespace metaspace { diff -r a2d3074db7a9 -r 2d5dd194c65c src/hotspot/share/memory/metaspace/rootChunkArea.cpp --- a/src/hotspot/share/memory/metaspace/rootChunkArea.cpp Wed Oct 16 17:41:03 2019 +0200 +++ b/src/hotspot/share/memory/metaspace/rootChunkArea.cpp Thu Oct 17 16:39:45 2019 +0200 @@ -30,6 +30,7 @@ #include "memory/metaspace/chunkManager.hpp" #include "memory/metaspace/internStat.hpp" #include "memory/metaspace/metachunk.hpp" +#include "memory/metaspace/metaDebug.hpp" #include "memory/metaspace/metaspaceCommon.hpp" #include "memory/metaspace/rootChunkArea.hpp" #include "runtime/mutexLocker.hpp" @@ -81,8 +82,6 @@ // Returns NULL if chunk cannot be split at least once. Metachunk* RootChunkArea::split(chklvl_t target_level, Metachunk* c, MetachunkListCluster* freelists) { - DEBUG_ONLY(c->verify(true);) - // Splitting a chunk once works like this: // // For a given chunk we want to split: @@ -119,8 +118,6 @@ DEBUG_ONLY(chklvl::check_valid_level(target_level)); assert(target_level > c->level(), "Wrong target level"); - DEBUG_ONLY(verify(true);) - const chklvl_t starting_level = c->level(); Metachunk* result = c; @@ -423,8 +420,8 @@ void RootChunkArea::verify(bool slow) const { + assert_lock_strong(MetaspaceExpand_lock); - assert_is_aligned(_base, chklvl::MAX_CHUNK_BYTE_SIZE); // Iterate thru all chunks in this area. They must be ordered correctly, @@ -468,7 +465,7 @@ void RootChunkArea::verify_area_is_ideally_merged() const { - assert_lock_strong(MetaspaceExpand_lock); + SOMETIMES(assert_lock_strong(MetaspaceExpand_lock);) int num_chunk = 0; for (const Metachunk* c = _first_chunk; c != NULL; c = c->next_in_vs()) { diff -r a2d3074db7a9 -r 2d5dd194c65c src/hotspot/share/memory/metaspace/spaceManager.cpp --- a/src/hotspot/share/memory/metaspace/spaceManager.cpp Wed Oct 16 17:41:03 2019 +0200 +++ b/src/hotspot/share/memory/metaspace/spaceManager.cpp Thu Oct 17 16:39:45 2019 +0200 @@ -411,6 +411,7 @@ } SOMETIMES(out->verify();) + } #ifdef ASSERT diff -r a2d3074db7a9 -r 2d5dd194c65c src/hotspot/share/memory/metaspace/spaceManager.hpp --- a/src/hotspot/share/memory/metaspace/spaceManager.hpp Wed Oct 16 17:41:03 2019 +0200 +++ b/src/hotspot/share/memory/metaspace/spaceManager.hpp Thu Oct 17 16:39:45 2019 +0200 @@ -34,6 +34,7 @@ #include "memory/metaspace/metachunk.hpp" #include "memory/metaspace/metaspaceCommon.hpp" + class outputStream; class Mutex; diff -r a2d3074db7a9 -r 2d5dd194c65c test/hotspot/gtest/metaspace/test_commitmask.cpp --- a/test/hotspot/gtest/metaspace/test_commitmask.cpp Wed Oct 16 17:41:03 2019 +0200 +++ b/test/hotspot/gtest/metaspace/test_commitmask.cpp Thu Oct 17 16:39:45 2019 +0200 @@ -39,7 +39,7 @@ void verify_mask() { // Note: we omit the touch test since we operate on fictional // memory - DEBUG_ONLY(_mask.verify(true, false);) + DEBUG_ONLY(_mask.verify(false);) } // Return a random sub range within [_base.._base + word_size), @@ -258,7 +258,7 @@ }; -TEST(metaspace, commit_mask_basics) { +TEST_VM(metaspace, commit_mask_basics) { const MetaWord* const base = (const MetaWord*) 0x100000; @@ -282,7 +282,7 @@ } -TEST(metaspace, commit_mask_small) { +TEST_VM(metaspace, commit_mask_small) { const MetaWord* const base = (const MetaWord*) 0x100000; @@ -291,7 +291,7 @@ } -TEST(metaspace, commit_mask_range) { +TEST_VM(metaspace, commit_mask_range) { const MetaWord* const base = (const MetaWord*) 0x100000; const size_t len = Settings::commit_granule_words() * 4; @@ -329,7 +329,7 @@ } -TEST(metaspace, commit_mask_random) { +TEST_VM(metaspace, commit_mask_random) { for (int i = 0; i < 5; i ++) {