RFR: JDK-8263455: NMT: assert on registering a region which completely engulfs an existing region

Zhengyu Gu zgu at openjdk.java.net
Mon Mar 15 18:11:09 UTC 2021


On Thu, 11 Mar 2021 16:49:06 GMT, Thomas Stuefe <stuefe at openjdk.org> wrote:

> I am testing a prototype for JDK-8256844 which makes NMT late initializable. One of the many benefits that will bring is that we can now run gtests with NMT enabled.
> 
> Which exercises NMT in new ways: we promptly crash in the metaspace tests, which do a lot of arbitrary, random, but entirely valid range commits as part of the VirtualSpaceNode stress tests:
> 
> [ RUN ] metaspace.virtual_space_node_test_5_vm
> # To suppress the following error report, specify this argument
> # after -XX: or in .hotspotrc: SuppressErrorAt=/virtualMemoryTracker.hpp:243
> assert failed: assert(rgn.base() >= end()) failed: Sanity#
> # A fatal error has been detected by the Java Runtime Environment:
> #
> # Internal Error (/shared/projects/openjdk/jdk-jdk/source/src/hotspot/share/services/virtualMemoryTracker.hpp:243), pid=183572, tid=183572
> # assert(rgn.base() >= end()) failed: Sanity
> #
> Stack:
> (gdb) bt
> #0 0x00007ffff5b36cca in VirtualMemoryRegion::compare (this=0x555555b02278, rgn=...) at /shared/projects/openjdk/jdk-jdk/source/src/hotspot/share/services/virtualMemoryTracker.hpp:243
> #1 0x00007ffff6cf6823 in compare_committed_region (r1=..., r2=...) at /shared/projects/openjdk/jdk-...
> (gdb) p *this
> $1 = {_base_address = 0x7fffb24c0000 "", _size = 1179648}
> (gdb) p rgn
> $2 = (const VirtualMemoryRegion &) @0x555555b02318: {_base_address = 0x7fffb2460000 "", _size = 2424832}
> As we can see, the new committed to-be-registered region [0x7fffb2460000...7FFFB26B0000) completely engulfs an existing region [0x7fffb24c0000...0x7FFFB25E0000).
> 
> This triggers an assert in VirtualMemoryRegion:
> 
>   inline int compare(const VirtualMemoryRegion& rgn) const {
>     if (overlap_region(rgn.base(), rgn.size())) {
>       return 0;
>     } else if (base() >= rgn.end()) {
>       return 1;
>     } else {
>       assert(rgn.base() >= end(), "Sanity"); <<<
>       return -1;
>     }
>   }
> which calls
>   inline bool overlap_region(address addr, size_t sz) const {
>     assert(sz > 0, "Invalid size");
>     assert(size() > 0, "Invalid size");
>     return contain_address(addr) ||
>            contain_address(addr + sz - 1);
>   }
> but VirtualMemoryRegion::overlap_region does not handle the engulfing case correctly.
> 
> --------------
> 
> Fix: fixed the overlap function to handle the engulfing case.
> 
> Tests: GAs; manually executed runtime/NMT; manually tested (with my prototype VM) that the gtest works after applying this fix.

Looks good.

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

Marked as reviewed by zgu (Reviewer).

PR: https://git.openjdk.java.net/jdk/pull/2942


More information about the hotspot-runtime-dev mailing list