RFR: 8231666: ThreadIdTable::grow() invokes invalid thread transition

Robbin Ehn robbin.ehn at oracle.com
Wed Oct 2 09:15:25 UTC 2019


Hi, since holding the Threads_lock while growing can block out safepoints for a
longer period, I would suggest just skip growing when holding Threads_lock.
E.g. return before creating the GrowTask.

/Robbin

On 2019-10-02 08:46, David Holmes wrote:
> Hi Daniil,
> 
> On 2/10/2019 4:13 pm, Daniil Titov wrote:
>> Please review a change that fixes the issue. The problem here is that that the 
>> thread is added to the ThreadIdTable  (introduced in [3]) while the 
>> Threads_lock is held by
>> JVM_StartThread. When new thread is added  to the thread table the table 
>> checks if its load factor is greater than required and if so it grows itself 
>> while polling for safepoints.
>> After changes [4]  an attempt to block the thread while holding the 
>> Threads_lock  results in assertion in Thread::check_possible_safepoint().
>>
>> The fix  proposed by David Holmes ( thank you, David!)  is to skip the 
>> ThreadBlockInVM inside ThreadIdTable::grow() method if the current thread owns 
>> the Threads_lock.
> 
> Sorry but looking at the fix in context now I think it would be better to do this:
> 
>      while (gt.do_task(jt)) {
>        if (Threads_lock->owner() == jt) {
>          gt.pause(jt);
>          ThreadBlockInVM tbivm(jt);
>          gt.cont(jt);
>        }
>      }
> 
> This way we don't waste time with the pause/cont when there's no safepoint pause 
> going to happen - and the owner() check is quicker than owned_by_self(). That 
> partially addresses a general concern I have about how long it may take to grow 
> the table, as we are deferring safepoints until it is complete in this 
> JVM_StartThread usecase.
> 
> In the test you don't need all of:
> 
>    32  * @run clean ThreadStartTest
>    33  * @run build ThreadStartTest
>    34  * @run main ThreadStartTest
> 
> just the last @run suffices to build and run the test.
> 
> Thanks,
> David
> -----
> 
>> Testing : Mach 5 tier1 and tier2 completed successfully, tier3 is in progress.
>>
>> [1] Webrev: http://cr.openjdk.java.net/~dtitov/8231666/webrev.01/
>> [2] Bug: https://bugs.openjdk.java.net/browse/JDK-8231666
>> [3] https://bugs.openjdk.java.net/browse/JDK-8185005
>> [4] https://bugs.openjdk.java.net/browse/JDK-8184732
>>
>> Best regards,
>> Danill
>>
>>


More information about the serviceability-dev mailing list