RFR: 8344883: Do not use mtNone if we know the tag type [v2]

Stefan Karlsson stefank at openjdk.org
Fri Mar 28 08:28:23 UTC 2025


On Thu, 27 Mar 2025 19:47:56 GMT, Gerard Ziemski <gziemski at openjdk.org> wrote:

>> This is a follow-up to #21843. Here we are focusing on removing the mem tag paremeter with default value of mtNone, to force everyone to provide mem tag, if known.
>> 
>> I tried to fill in tag, when I was pretty certain that I had the right type.
>> 
>> At least one more follow-up will be needed after this, to change the remaining mtNone to valid values.
>
> Gerard Ziemski has updated the pull request incrementally with one additional commit since the last revision:
> 
>   work

I went over the patch and added suggestions for places where I think you're using the wrong tag, or where I think it is obvious that there's a better tag than mtNone. I've also suggested removal of the now redundant 'executable' argument, which I want to see as little of as possible given that it is a wart on the memory reservation APIs (IMHO).

src/hotspot/os/bsd/gc/z/zPhysicalMemoryBacking_bsd.cpp line 81:

> 79: 
> 80:   // Reserve address space for backing memory
> 81:   _base = (uintptr_t)os::reserve_memory(max_capacity, mtJavaHeap, false);

Suggestion:

  _base = (uintptr_t)os::reserve_memory(max_capacity, mtJavaHeap);

src/hotspot/os/windows/os_windows.cpp line 3261:

> 3259:   assert(extra_size >= size, "overflow, size is too large to allow alignment");
> 3260: 
> 3261: 

Suggestion:

src/hotspot/os/windows/os_windows.cpp line 3267:

> 3265:   for (int attempt = 0; attempt < max_attempts && aligned_base == nullptr; attempt ++) {
> 3266:     char* extra_base = file_desc != -1 ? os::map_memory_to_file(extra_size, file_desc, mem_tag) :
> 3267:                                          os::reserve_memory(extra_size, mem_tag, false);

Suggestion:

                                         os::reserve_memory(extra_size, mem_tag);

src/hotspot/os/windows/os_windows.cpp line 3284:

> 3282:     // Which may fail, hence the loop.
> 3283:     aligned_base = file_desc != -1 ? os::attempt_map_memory_to_file_at(aligned_base, size, file_desc, mem_tag) :
> 3284:                                      os::attempt_reserve_memory_at(aligned_base, size, mem_tag, false);

Suggestion:

                                     os::attempt_reserve_memory_at(aligned_base, size, mem_tag);

src/hotspot/os/windows/perfMemory_windows.cpp line 57:

> 55: 
> 56:   // allocate an aligned chuck of memory
> 57:   char* mapAddress = os::reserve_memory(size, mtNone);

To match with the other platforms:
Suggestion:

  char* mapAddress = os::reserve_memory(size, mtInternal);

src/hotspot/share/classfile/compactHashtable.cpp line 229:

> 227:     quit("Unable to open hashtable dump file", filename);
> 228:   }
> 229:   _base = os::map_memory(_fd, filename, 0, nullptr, _size, mtSymbol, true, false);

This seems to be used to read Symbols *OR* String. This probably needs to be something else. I suggest to revert to mtNone and figure out the appropriate tag later.
Suggestion:

  _base = os::map_memory(_fd, filename, 0, nullptr, _size, mtNone, true, false);

src/hotspot/share/gc/parallel/parMarkBitMap.cpp line 52:

> 50:                                              rs_align,
> 51:                                              page_sz,
> 52:                                              mtNone);

Suggestion:

                                             mtGC);

src/hotspot/share/gc/shenandoah/shenandoahCardTable.cpp line 62:

> 60:   _write_byte_map_base = _byte_map_base;
> 61: 
> 62:   ReservedSpace read_space = MemoryReserver::reserve(_byte_map_size, rs_align, _page_size, mtNone);

Suggestion:

  ReservedSpace read_space = MemoryReserver::reserve(_byte_map_size, rs_align, _page_size, mtGC);

src/hotspot/share/memory/allocation.inline.hpp line 61:

> 59:   size_t size = size_for(length);
> 60: 
> 61:   char* addr = os::reserve_memory(size, mem_tag, !ExecMem);

Suggestion:

  char* addr = os::reserve_memory(size, mem_tag);

src/hotspot/share/memory/allocation.inline.hpp line 78:

> 76:   size_t size = size_for(length);
> 77: 
> 78:   char* addr = os::reserve_memory(size, mem_tag, !ExecMem);

Suggestion:

  char* addr = os::reserve_memory(size, mem_tag);

src/hotspot/share/memory/metaspace/testHelpers.cpp line 85:

> 83:   if (reserve_limit > 0) {
> 84:     // have reserve limit -> non-expandable context
> 85:     _rs = MemoryReserver::reserve(reserve_limit * BytesPerWord, Metaspace::reserve_alignment(), os::vm_page_size(), mtNone);

Suggestion:

    _rs = MemoryReserver::reserve(reserve_limit * BytesPerWord, Metaspace::reserve_alignment(), os::vm_page_size(), mtTest);

src/hotspot/share/memory/metaspace/virtualSpaceNode.cpp line 259:

> 257:   ReservedSpace rs = MemoryReserver::reserve(word_size * BytesPerWord,
> 258:                                              Settings::virtual_space_node_reserve_alignment_words() * BytesPerWord,
> 259:                                              os::vm_page_size(), mtNone);

Suggestion:

                                             os::vm_page_size(), mtMetaspace);

src/hotspot/share/prims/jni.cpp line 2403:

> 2401:   if (bad_address == nullptr) {
> 2402:     size_t size = os::vm_allocation_granularity();
> 2403:     bad_address = os::reserve_memory(size, mtInternal, false);

Suggestion:

    bad_address = os::reserve_memory(size, mtInternal);

src/hotspot/share/prims/whitebox.cpp line 720:

> 718: 
> 719: WB_ENTRY(jlong, WB_NMTReserveMemory(JNIEnv* env, jobject o, jlong size))
> 720:   return (jlong)(uintptr_t)os::reserve_memory(size, mtTest, false);

Suggestion:

  return (jlong)(uintptr_t)os::reserve_memory(size, mtTest);

src/hotspot/share/prims/whitebox.cpp line 724:

> 722: 
> 723: WB_ENTRY(jlong, WB_NMTAttemptReserveMemoryAt(JNIEnv* env, jobject o, jlong addr, jlong size))
> 724:   return (jlong)(uintptr_t)os::attempt_reserve_memory_at((char*)(uintptr_t)addr, (size_t)size, mtTest, false);

Suggestion:

  return (jlong)(uintptr_t)os::attempt_reserve_memory_at((char*)(uintptr_t)addr, (size_t)size, mtTest);

src/hotspot/share/prims/whitebox.cpp line 1515:

> 1513:   static volatile char* p;
> 1514: 
> 1515:   p = os::reserve_memory(os::vm_allocation_granularity(), mtSymbol);

Suggestion:

  p = os::reserve_memory(os::vm_allocation_granularity(), mtTest);

src/hotspot/share/runtime/os.cpp line 2130:

> 2128:     log_trace(os, map)(ERRFMT, ERRFMTARGS);
> 2129:     log_debug(os, map)("successfully attached at " PTR_FORMAT, p2i(result));
> 2130:     MemTracker::record_virtual_memory_reserve((address)result, bytes, CALLER_PC, mtNone);

I think attempt_reserve_memory_between should provide the correct mem tag.

src/hotspot/share/runtime/os.cpp line 2336:

> 2334:   if (result != nullptr) {
> 2335:     // The memory is committed
> 2336:     MemTracker::record_virtual_memory_reserve_and_commit((address)result, size, CALLER_PC, mtNone);

reserve_memory_special should take a mem tag, but I guess you intend to do that as a follow-up RFE?

src/hotspot/share/runtime/safepointMechanism.cpp line 60:

> 58:     const size_t page_size = os::vm_page_size();
> 59:     const size_t allocation_size = 2 * page_size;
> 60:     char* polling_page = os::reserve_memory(allocation_size, mtSafepoint, !ExecMem);

Suggestion:

    char* polling_page = os::reserve_memory(allocation_size, mtSafepoint);

src/hotspot/share/utilities/debug.cpp line 715:

> 713: #ifdef CAN_SHOW_REGISTERS_ON_ASSERT
> 714: void initialize_assert_poison() {
> 715:   char* page = os::reserve_memory(os::vm_page_size(), mtInternal, !ExecMem);

Suggestion:

  char* page = os::reserve_memory(os::vm_page_size(), mtInternal);

test/hotspot/gtest/gc/g1/test_stressCommitUncommit.cpp line 86:

> 84:                                              os::vm_allocation_granularity(),
> 85:                                              os::vm_page_size(),
> 86:                                              mtNone);

Suggestion:

                                             mtTest);

test/hotspot/gtest/gc/g1/test_stressCommitUncommit.cpp line 113:

> 111:                                              os::vm_allocation_granularity(),
> 112:                                              os::vm_page_size(),
> 113:                                              mtNone);

Suggestion:

                                             mtTest);

test/hotspot/gtest/memory/test_virtualspace.cpp line 62:

> 60:     ASSERT_PRED2(is_size_aligned, size, os::vm_allocation_granularity());
> 61: 
> 62:     ReservedSpace rs = MemoryReserver::reserve(size, mtNone);

Why did you do this change?
Suggestion:

    ReservedSpace rs = MemoryReserver::reserve(size, mtTest);

test/hotspot/gtest/memory/test_virtualspace.cpp line 76:

> 74:     ASSERT_PRED2(is_size_aligned, size, alignment) << "Incorrect input parameters";
> 75:     size_t page_size = UseLargePages ? os::large_page_size() : os::vm_page_size();
> 76:     ReservedSpace rs = MemoryReserver::reserve(size, alignment, page_size, mtNone);

Suggestion:

    ReservedSpace rs = MemoryReserver::reserve(size, alignment, page_size, mtTest);

test/hotspot/gtest/memory/test_virtualspace.cpp line 104:

> 102:     size_t page_size = large ? os::large_page_size() : os::vm_page_size();
> 103: 
> 104:     ReservedSpace rs = MemoryReserver::reserve(size, alignment, page_size, mtNone);

Suggestion:

    ReservedSpace rs = MemoryReserver::reserve(size, alignment, page_size, mtTest);

test/hotspot/gtest/memory/test_virtualspace.cpp line 215:

> 213:       case Default:
> 214:       case Reserve:
> 215:         return MemoryReserver::reserve(reserve_size_aligned, mtNone);

Suggestion:

        return MemoryReserver::reserve(reserve_size_aligned, mtTest);

test/hotspot/gtest/memory/test_virtualspace.cpp line 221:

> 219:                                        os::vm_allocation_granularity(),
> 220:                                        os::vm_page_size(),
> 221:                                        mtNone);

Suggestion:

                                       mtTest);

test/hotspot/gtest/memory/test_virtualspace.cpp line 300:

> 298:   size_t large_page_size = os::large_page_size();
> 299: 
> 300:   ReservedSpace reserved = MemoryReserver::reserve(large_page_size, large_page_size, large_page_size, mtNone);

Suggestion:

  ReservedSpace reserved = MemoryReserver::reserve(large_page_size, large_page_size, large_page_size, mtTest);

test/hotspot/gtest/memory/test_virtualspace.cpp line 370:

> 368:                                                alignment,
> 369:                                                page_size,
> 370:                                                mtNone);

Suggestion:

                                               mtTest);

test/hotspot/gtest/memory/test_virtualspace.cpp line 388:

> 386:     ASSERT_TRUE(is_aligned(size, os::vm_allocation_granularity())) << "Must be at least AG aligned";
> 387: 
> 388:     ReservedSpace rs = MemoryReserver::reserve(size, mtNone);

Suggestion:

    ReservedSpace rs = MemoryReserver::reserve(size, mtTest);

test/hotspot/gtest/memory/test_virtualspace.cpp line 416:

> 414:                                                alignment,
> 415:                                                page_size,
> 416:                                                mtNone);

Suggestion:

                                               mtTest);

test/hotspot/gtest/memory/test_virtualspace.cpp line 521:

> 519:     case Reserve:
> 520:       return MemoryReserver::reserve(reserve_size_aligned,
> 521:                                      mtNone);

Suggestion:

                                     mtTest);

test/hotspot/gtest/memory/test_virtualspace.cpp line 527:

> 525:                                      os::vm_allocation_granularity(),
> 526:                                      os::vm_page_size(),
> 527:                                      mtNone);

Suggestion:

                                     mtTest);

test/hotspot/gtest/memory/test_virtualspace.cpp line 585:

> 583:                                                      large_page_size,
> 584:                                                      large_page_size,
> 585:                                                      mtNone);

Suggestion:

                                                     mtTest);

test/hotspot/gtest/nmt/test_nmt_locationprinting.cpp line 116:

> 114: 
> 115: static void test_for_mmap(size_t sz, ssize_t offset) {
> 116:   char* addr = os::reserve_memory(sz, mtTest, false);

Suggestion:

  char* addr = os::reserve_memory(sz, mtTest);

test/hotspot/gtest/runtime/test_committed_virtualmemory.cpp line 94:

> 92:     const size_t page_sz = os::vm_page_size();
> 93:     const size_t size = num_pages * page_sz;
> 94:     char* base = os::reserve_memory(size, mtThreadStack, !ExecMem);

Suggestion:

    char* base = os::reserve_memory(size, mtThreadStack);

test/hotspot/gtest/runtime/test_committed_virtualmemory.cpp line 162:

> 160:     const size_t num_pages = 4;
> 161:     const size_t size = num_pages * page_sz;
> 162:     char* base = os::reserve_memory(size, mtTest, !ExecMem);

Suggestion:

    char* base = os::reserve_memory(size, mtTest);

test/hotspot/gtest/runtime/test_committed_virtualmemory.cpp line 208:

> 206:     const size_t size = num_pages * page_sz;
> 207: 
> 208:     char* base = os::reserve_memory(size, mtTest, !ExecMem);

Suggestion:

    char* base = os::reserve_memory(size, mtTest);

test/hotspot/gtest/runtime/test_os.cpp line 261:

> 259:   // two pages, first one protected.
> 260:   const size_t ps = os::vm_page_size();
> 261:   char* two_pages = os::reserve_memory(ps * 2, mtTest, false);

Suggestion:

  char* two_pages = os::reserve_memory(ps * 2, mtTest);

test/hotspot/gtest/runtime/test_os.cpp line 533:

> 531:     size_t total_range_len = num_stripes * stripe_len;
> 532:     // Reserve a large contiguous area to get the address space...
> 533:     p = (address)os::reserve_memory(total_range_len, mtNone);

Suggestion:

    p = (address)os::reserve_memory(total_range_len, mtTest);

test/hotspot/gtest/runtime/test_os.cpp line 547:

> 545:       const bool executable = stripe % 2 == 0;
> 546: #endif
> 547:       q = (address)os::attempt_reserve_memory_at((char*)q, stripe_len, mtNone, executable);

Suggestion:

      q = (address)os::attempt_reserve_memory_at((char*)q, stripe_len, mtTest, executable);

test/hotspot/gtest/runtime/test_os.cpp line 567:

> 565:   assert(is_aligned(stripe_len, os::vm_allocation_granularity()), "Sanity");
> 566:   size_t total_range_len = num_stripes * stripe_len;
> 567:   address p = (address)os::reserve_memory(total_range_len, mtNone);

Suggestion:

  address p = (address)os::reserve_memory(total_range_len, mtTest);

test/hotspot/gtest/runtime/test_os.cpp line 634:

> 632: 
> 633:   // ...re-reserve the middle stripes. This should work unless release silently failed.
> 634:   address p2 = (address)os::attempt_reserve_memory_at((char*)p_middle_stripes, middle_stripe_len, mtNone);

Suggestion:

  address p2 = (address)os::attempt_reserve_memory_at((char*)p_middle_stripes, middle_stripe_len, mtTest);

test/hotspot/gtest/runtime/test_os.cpp line 657:

> 655: TEST_VM(os, release_bad_ranges) {
> 656: #endif
> 657:   char* p = os::reserve_memory(4 * M, mtNone);

Suggestion:

  char* p = os::reserve_memory(4 * M, mtTest);

test/hotspot/gtest/runtime/test_os.cpp line 692:

> 690:   // // make things even more difficult by trying to reserve at the border of the region
> 691:   address border = p + num_stripes * stripe_len;
> 692:   address p2 = (address)os::attempt_reserve_memory_at((char*)border, stripe_len, mtNone);

Suggestion:

  address p2 = (address)os::attempt_reserve_memory_at((char*)border, stripe_len, mtTest);

test/hotspot/gtest/runtime/test_os.cpp line 733:

> 731:   // Reserve a small range and fill it with a marker string, should show up
> 732:   // on implementations displaying range snippets
> 733:   char* p = os::reserve_memory(1 * M, mtInternal, false);

Suggestion:

  char* p = os::reserve_memory(1 * M, mtInternal);

test/hotspot/gtest/runtime/test_os.cpp line 757:

> 755:   // A simple allocation
> 756:   {
> 757:     address p = (address)os::reserve_memory(total_range_len, mtNone);

Suggestion:

    address p = (address)os::reserve_memory(total_range_len, mtTest);

test/hotspot/gtest/runtime/test_os.cpp line 1062:

> 1060: 
> 1061: TEST_VM(os, reserve_at_wish_address_shall_not_replace_mappings_smallpages) {
> 1062:   char* p1 = os::reserve_memory(M, mtTest, false);

Suggestion:

  char* p1 = os::reserve_memory(M, mtTest);

test/hotspot/gtest/runtime/test_os.cpp line 1072:

> 1070:   if (UseLargePages && !os::can_commit_large_page_memory()) { // aka special
> 1071:     const size_t lpsz = os::large_page_size();
> 1072:     char* p1 = os::reserve_memory_aligned(lpsz, lpsz, mtTest, false);

Suggestion:

    char* p1 = os::reserve_memory_aligned(lpsz, lpsz, mtTest);

test/hotspot/gtest/runtime/test_os.cpp line 1098:

> 1096:   const size_t size = pages * page_sz;
> 1097: 
> 1098:   char* base = os::reserve_memory(size, mtTest, false);

Suggestion:

  char* base = os::reserve_memory(size, mtTest);

test/hotspot/gtest/runtime/test_os_linux.cpp line 357:

> 355:   const bool useThp = UseTransparentHugePages;
> 356:   UseTransparentHugePages = true;
> 357:   char* const heap = os::reserve_memory(size, mtInternal, false);

Suggestion:

  char* const heap = os::reserve_memory(size, mtInternal);

-------------

Changes requested by stefank (Reviewer).

PR Review: https://git.openjdk.org/jdk/pull/24282#pullrequestreview-2724588390
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018111000
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018112894
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018113093
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018113247
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018114051
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018121233
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018121891
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018122312
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018122564
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018122715
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018123591
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018124074
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018125155
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018125568
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018125876
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018126443
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018128479
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018129358
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018098166
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018098617
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018098956
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018099157
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018100108
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018100521
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018100717
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018100870
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018101049
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018101200
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018101373
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018101541
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018101692
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018101911
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018102064
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018102298
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018102633
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018103596
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018103912
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018104093
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018104376
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018104743
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018105030
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018105216
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018105410
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018105552
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018105686
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018105792
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018105928
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018106123
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018106324
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018106474
PR Review Comment: https://git.openjdk.org/jdk/pull/24282#discussion_r2018107303


More information about the shenandoah-dev mailing list