RFR: 8351661: NMT: VMATree should support separate call-stacks for reserve and commit operations [v2]

Afshin Zafari azafari at openjdk.org
Wed Apr 23 09:16:57 UTC 2025


On Tue, 18 Mar 2025 10:04:15 GMT, Johan Sjölen <jsjolen at openjdk.org> wrote:

>> The cases and their result:
>> 
>> // (address, size, callstack) arguments
>> 
>> // x == invalid stack == not-filled
>> 
>> # Case 1
>> tree.reserve(0, 100, s1);
>> tree.commit(25, 25 , s2);
>>     0       25         50         100
>> --------  --------  --------  --------
>> in   out  in   out  in   out  in   out 
>> x    s1   s1   s2   s2   x    s1   x
>> x    x    x    x    x    x     x   x
>> 
>> commit is not at start of the region.
>> 
>> # Case 2
>> tree.reserve(0, 100, s1);
>> tree.reserve(10, 10, s2);
>>     0       10         20         100
>> --------  --------  --------  --------
>> in   out  in   out  in   out  in   out 
>> x    s1   s1   s2   s2   x    s1   x
>> x    x    x    x    x    x     x   x
>> 
>> # Case 3
>> tree.commit(0, 100, s1);
>>     0       100  
>> --------  --------
>> in   out  in   out
>> x    s1   s1   x 
>> x    x    x    x  
>> 
>> it is not acceptable to commit a region without reserving it.
>> 
>> # Case 4
>> tree.commit(0, 100, s1);
>> tree.reserve(0, 100, s2);
>>     0       100  
>> --------  --------
>> in   out  in   out
>> x    s2   s2   x 
>> x    s1   s1   x
>
>> The cases and their result:
>> 
>> ```
>> // (address, size, callstack) arguments
>> 
>> // x == invalid stack == not-filled
>> 
>> # Case 1
>> tree.reserve(0, 100, s1);
>> tree.commit(25, 25 , s2);
>>     0       25         50         100
>> --------  --------  --------  --------
>> in   out  in   out  in   out  in   out 
>> x    s1   s1   s2   s2   x    s1   x
>> x    x    x    x    x    x     x   x
>> 
>> commit is not at start of the region.
>> 
>> # Case 2
>> tree.reserve(0, 100, s1);
>> tree.reserve(10, 10, s2);
>>     0       10         20         100
>> --------  --------  --------  --------
>> in   out  in   out  in   out  in   out 
>> x    s1   s1   s2   s2   x    s1   x
>> x    x    x    x    x    x     x   x
>> 
>> # Case 3
>> tree.commit(0, 100, s1);
>>     0       100  
>> --------  --------
>> in   out  in   out
>> x    s1   s1   x 
>> x    x    x    x  
>> 
>> it is not acceptable to commit a region without reserving it.
>> 
>> # Case 4
>> tree.commit(0, 100, s1);
>> tree.reserve(0, 100, s2);
>>     0       100  
>> --------  --------
>> in   out  in   out
>> x    s2   s2   x 
>> x    s1   s1   x  
>> ```
> 
> Let's go backwards:
> 
> # Case 4
> 
> This should only have the reserved stack s2, not the committed stack s1. Reserving after committing is the same as uncommitting. In fact, that is how we define `uncommit`.
> 
> # Case 3
> Committing without reserving is fine, and we must support it. This should be interpreted as reserving implicitly.
> 
> # Case 2
> 
> Oops, here I interpreted what I wrote incorrectly. Your results seem correct.
> 
> # Case 1
> 
> Aha, so here the inner region actually ignores the outer reserved region. That doesn't seem right, how are you supposed to know what the reserved call stack is?
> 
> Consider this:
> 
> 
> tree.reserve(0, 100, s1);
> tree.commit(50, 25, s2);
> tree.commit(51, 5, s3);
> tree.reserve(0, 50, s4);
> tree.reserve(56, 100 - 56, s4);
> produce_report();
> 
> 
> How is the reporter supposed to know what the reserved stack is of the innermost region `[51, 56)`? It can't,because we've lost that information.
> 
> We need a better definition of what is supposed to happen in these cases.

@jdksjolen and @gerard-ziemski , your re-review is needed. TIA.

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

PR Comment: https://git.openjdk.org/jdk/pull/24028#issuecomment-2823615085


More information about the hotspot-runtime-dev mailing list