RFR: 8335091: NMT: VMATree reserve_mapping and commit_mapping APIs need MEMFLAGS while un/-committing API has no MEMFLAGS arg [v3]

Thomas Stuefe stuefe at openjdk.org
Mon Jul 29 06:20:36 UTC 2024


On Sun, 28 Jul 2024 19:42:54 GMT, Afshin Zafari <azafari at openjdk.org> wrote:

>> Alright, I think this is OK.
>> 
>> One thing that worries me a bit is the fact that we take the `leq` value without checking if it's equal to the `A` address. This means that if we only have a range 0-100 with mtTest and I reserve with `copy_flag` at 1000-1100, then that range will receive `mtTest`. That's a bit spooky. Perhaps the `copy_flag` should only be used if there's a range starting at exactly that address? That seems less surprising to me.
>
>> One thing that worries me a bit is the fact that we take the `leq` value without checking if it's equal to the `A` address. This means that if we only have a range 0-100 with mtTest and I reserve with `copy_flag` at 1000-1100, then that range will receive `mtTest`. That's a bit spooky. Perhaps the `copy_flag` should only be used if there's a range starting at exactly that address? That seems less surprising to me.
> 
> You are right with this point, but it happens now at call to `uncommit_mapping` where the `copy_flag` is true. `reserve_mapping` always uses `false` for the `copy_flag`. Is this correct if we `assert` that the `leq` is `Committed` or `Reserved`? Is this also correct for commit and `copy_flag`?

@afshin-zafari thank you for implementing this

> > One thing that worries me a bit is the fact that we take the `leq` value without checking if it's equal to the `A` address. This means that if we only have a range 0-100 with mtTest and I reserve with `copy_flag` at 1000-1100, then that range will receive `mtTest`. That's a bit spooky. Perhaps the `copy_flag` should only be used if there's a range starting at exactly that address? That seems less surprising to me.
> 
> You are right with this point, but it happens now at call to `uncommit_mapping` where the `copy_flag` is true. `reserve_mapping` always uses `false` for the `copy_flag`. Is this correct if we `assert` that the `leq` is `Committed` or `Reserved`? Is this also correct for commit and `copy_flag`?

We should not test the address value of A. However, we should check the outgoing state of A and *only copy the flag if outgoing node state is either `Committed` or `Reserved`*. We should require a flag from the caller if outgoing state is `Released`: it means we are reserving a new mapping inside what was before a hole in the address space with no pre-existing mapping. So there is no mapping to take over the flag from.

Some examples, lets say we have: 

`reserve(0, 100, mtNMT);`

Now we do:

A) `reserve(50, 60)` 	(inside) -> should take mtNMT
B) `reserve(0, 20)` 	(same starting address) -> should take mtNMT
C) `reserve(90, 100)` 	(same ending address) -> should take mtNMT

But

D) `reserve(100, 200)`   should require flag from caller: even though its adjacent to the old area, its a new area
E) `reserve(1000, 1100)` should require flag from caller


Side note, a theoretical question is what to do with partly overlapping areas: `reserve(90, 110)`

The current code would take over the flag from the original mapping between 10 and 100. And I think that is fine. We don't expect this to happen in hotspot anyway.

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

PR Comment: https://git.openjdk.org/jdk/pull/20330#issuecomment-2255030650


More information about the hotspot-runtime-dev mailing list