RFR(s): 8209139: globalCounter bootstrap issue

David Holmes david.holmes at oracle.com
Thu Nov 8 10:19:37 UTC 2018


On 8/11/2018 7:14 PM, Robbin Ehn wrote:
> Hi David,
> 
> On 11/7/18 10:03 PM, David Holmes wrote:
>> Hi Robbin,
>>
>> I wrote two responses to this last night before deciding to "sleep on 
>> it". :)
> 
> :)
> 
>>
>> Thanks for the extended explanations - I understand what you are doing 
>> more clearly now. I see Dan has made a few minor comments and I don't 
>> have anything additional to add. So Reviewed.
> 
> Thanks!
> 
> For reference:
> Inc:
> http://cr.openjdk.java.net/~rehn/8209139/v2/inc/webrev/

Changes seem fine.

One clarification. I had interpreted previous discussions as meaning 
that threads other than the initial thread might be able to grab a 
ThreadsListHandle before they have been added because they would get the 
bootstrap list. But that seems not to be the case in general - once an 
added thread exists (I'm not sure of the exact point where this happens) 
_java_threads_list will cease to point to the bootstrap list and will 
never point to it again - correct? So it still seems to me you could 
simply initialize _java_threads_list to a zero length list and the check 
for "is bootstrap" would just be a check if the list length is zero - 
no? It's the only time you can ever have a zero length threads list.

Thanks,
David

> Full:
> http://cr.openjdk.java.net/~rehn/8209139/v2/full/webrev/
> 
> /Robbin
> 
>>
>> My personal preference is to treat the early initialization in the 
>> initial thread as a special case - using "hacks" like the 
>> "Threads::number_of_threads() == 0" test. Allowing any thread to be 
>> able to access a ThreadsList (and by extension GlobalCounter) before 
>> it has properly initialized may turn out to be useful one day, but it 
>> may also mask bugs, as other threads should be following strict 
>> initialization protocols that don't permit non-trivial actions prior 
>> to being fully initialized.
>>
>> Thanks,
>> David
>>
>> On 7/11/2018 9:53 PM, Robbin Ehn wrote:
>>> Hi David,
>>>
>>> On 2018-11-07 12:10, David Holmes wrote:
>>>> Hi Robbin,
>>>>
>>>> On 7/11/2018 8:01 PM, Robbin Ehn wrote:
>>>>> Hi David,
>>>>>
>>>>> On 2018-11-07 10:40, David Holmes wrote:
>>>>>> Hi Robbin,
>>>>>>
>>>>>> Can't you just use an _initialized flag ?? 
>>>>>
>>>>> I can, but I need to changes many places since the ThreadsList is 
>>>>> not expected
>>>>> to be null. And I do not see how checking that flag instead 
>>>>> checking if the list
>>>>> is the bootstrap would be better.
>>>>
>>>>  From the bug there seemed to be only once place that needed this 
>>>> check. Where are all these other places?
>>>
>>> All potential cases that uses a ThreadsList before init.
>>> These are very had to track down, so I don't know of any others.
>>>
>>> I'm adding that exception, so you may have a ThreadsList if you are 
>>> _not_ part
>>> of the SMR protocol if that list is the bootstrap list.
>>>
>>>>
>>>>> Or statically initialize
>>>>>> _java_thread_list to a zero-length list? 
>>>>>
>>>>> It's statically initialized to _bootstrap_list. Since I'm going to 
>>>>> need to check
>>>>> for a bootstrap list in a non-SMR-thread I can't follow the pointer 
>>>>> because we
>>>>> can crash. So I need to know which address to check for, this is the
>>>>> _bootstrap_list. And since it's static I can't free it.
>>>>
>>>> Not following. Can't you initialize _java_thread_list directly to a 
>>>> zero-length list and that will "just work" because you'll iterate 
>>>> zero items? There will only ever be one zero-length threads-list right?
>>>
>>> The iteration is not the problem, it is the protocol verification.
>>> Right know you may only have a ThreadsList if you are part of 
>>> SMR-protocol,
>>> which means the VM must have done it's init. With the above exception 
>>> to the
>>> protocol the validation works for all cases we have today and all 
>>> cases we might
>>> have in the future that I can think of.
>>>
>>> With this you can use ThreadsListHandle before init and you don't 
>>> need to pay
>>> attention to if your code could ever possibly be run before init or 
>>> in the init
>>> code. So I'm trying to create robustness because as SymbolTable issue 
>>> could pass t1-5 without that code path being executed.
>>>
>>> That why I tested with a ThreadsListHandle in the init code to make 
>>> sure we actually do create at least one there.
>>>
>>> /Robbin
>>>
>>>>
>>>> Thanks,
>>>> David
>>>> -----
>>>>
>>>>>> This seems overly elaborate.
>>>>>
>>>>> If we get a SMR bug doing it different could give us wired crashes 
>>>>> instead of
>>>>> clean assert failures. That is why you think this is 'overly 
>>>>> elaborate' I guess.
>>>>>
>>>>>>
>>>>>> I'm not even concerned about the existing "hack" - checking for 
>>>>>> "Threads::number_of_threads() == 0" has always been a simple way 
>>>>>> to see if you are very early in the init sequence.
>>>>>
>>>>> Well it only solves the problem for the GlobalCounter.
>>>>> And in theory we could have added non-JavaThreads to the RCU 
>>>>> thread-set they
>>>>> should be checked.
>>>>>
>>>>> Thanks, Robbin
>>>>>
>>>>>>
>>>>>> Thanks,
>>>>>> David
>>>>>>
>>>>>> On 7/11/2018 6:56 PM, Robbin Ehn wrote:
>>>>>>> Hi all, please review.
>>>>>>>
>>>>>>> When changing the hashtable for SymbolTable we did a hack to 
>>>>>>> handle the case
>>>>>>> when symbols gets inserted before the VM is proper initialized, 
>>>>>>> by doing nothing
>>>>>>> in the GlobalCounter if there is no threads. The problem is that 
>>>>>>> the thread
>>>>>>> creating the VM is not yet added to the VM (non-SMR-thread) and thus
>>>>>>> ThreadsListHandle do not yet work for that thread. Trying to move 
>>>>>>> the addition
>>>>>>> of the creating thread earlier in the bootstrap is troublesome.
>>>>>>>
>>>>>>> This removes that hack and do a more generic solution for 
>>>>>>> ThreadsList instead.
>>>>>>> To make it safe to verify that we are talking about the bootstrap 
>>>>>>> ThreadsList from a non-SMR-thread we cannot follow that pointer. 
>>>>>>> Using null was intrusive to the code I therefore choose to do a 
>>>>>>> static bootstrap ThreadsList.
>>>>>>>
>>>>>>> CR: https://bugs.openjdk.java.net/browse/JDK-8209139
>>>>>>> Webrev: http://cr.openjdk.java.net/~rehn/8209139/webrev/
>>>>>>>
>>>>>>> Tested with use of ThreadsListHandle and GlobalCounter in the 
>>>>>>> problematic init method, passed t1-2 with use of 
>>>>>>> ThreadsListHandle in that init method.
>>>>>>>
>>>>>>> Thanks, Robbin


More information about the hotspot-runtime-dev mailing list