RFR: 8291237: Encapsulate nmethod Deoptimization logic [v6]

Axel Boldt-Christmas aboldtch at openjdk.org
Thu Aug 18 09:37:18 UTC 2022


On Thu, 18 Aug 2022 08:57:19 GMT, Dean Long <dlong at openjdk.org> wrote:

>> Axel Boldt-Christmas has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   Cleanup comment
>
> src/hotspot/share/code/compiledMethod.cpp line 128:
> 
>> 126:   if (old_status < new_status) {
>> 127:     if (old_status == not_enqueued) {
>> 128:       assert(extract_enqueued_deoptimization_method(_enqueued_deoptimization_link) == nullptr, "Compiled Method should not already be linked");
> 
> This doesn't work for the tail of the list, does it?  That's why I suggested making the tail loop back to itself
> 
> I would also like to see similar asserts added to make sure we don't recycle an nmethod that is still on the list, perhaps in nmethod::flush().

I think you have to describe the scenario that does not work, because I am not sure I see it.

For ease of writing, let me call the currently embedded status `status` and the currently embedded link `next_link` 
(`=>` means implies here)

The assert checks this invariant: `status == not_enqueued => next_link == nullptr`

After adding the first method (which will be the tail) to the list (`root == nullptr`) we will have:
 * `status > not_enqueued`
 * `next_link == nullptr`
 
After adding any method after that ( `root != nullptr`) we will have:
 * `status > not_enqueued`
 * `next_link == previous_root`
 
 And there is also a fresh method
 * `status == not_enqueued`
 * `next_link == nullptr`

If we try to enqueue an already enqueued method (calling `enqueue_deoptimization` twice) the method will have  `status != not_enqueued` and will set `next_link == next_link` if `new_status > status`. (So just update the status to a stronger variant, but not change the link)

All of these possibilities upholds the invariant. 

Maybe you are looking for some more invariant checks, like
`status > not_enqueued => InList(method)` which can be asserted by setting `next_link == this` for the tail (when  `root == nullptr`) and assert that `next_link != nullptr` if `status > not_enqueued`. But it just seems like we are adding another flag for something we already check, essentially `next_link != nullptr` iff `status > not_enqueued`.

There is currently an assert when we iterate over the list; that the number of methods we find in the list is equal to number of methods we enqueued.

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

PR: https://git.openjdk.org/jdk/pull/9655


More information about the serviceability-dev mailing list