RFR: Don't re-enter evac-scope in worker-threads when hitting a write-barrier

Roman Kennke rkennke at redhat.com
Mon Aug 13 11:23:39 UTC 2018


Am 13.08.2018 um 13:13 schrieb Aleksey Shipilev:
> On 08/10/2018 06:56 PM, Roman Kennke wrote:
>> An early adopter has run into a bug where a GC worker thread would
>> attempt to re-enter the evac-scope because it hits a write barrier. That
>> path was not trivial to clean up (it went through threads-root-scanning,
>> and then attempted to clean up monitors, which would touch mark word and
>> thus does a write-barrier.
>>
>> The solution that I'm proposing is to always check for worker-thread in
>> the usual runtime write-barrier path, and branch to write_barrier_gc()
>> when it's a worker thread, which does not use the evac-scope, and
>> asserts that it already has entered the scope.
>>
>> The slow-paths coming from (potentially hot) c2, c1 and interpreter WBs
>> unconditionally use the mutator version.
>>
>> http://cr.openjdk.java.net/~rkennke/wb-evac-scopes/webrev.00/
> 
> That code duplication would get much worse when we actually optimize the hot-path via JRT. We have
> three ways to enter WB, and all these cases need to be optimized:
>  1) via JRT, already checked cset, evac-in-progress, etc;
>  2) via SBS::WB from Java thread;
>  3) via SBS::WB from GC thread;
> 
> Having that in mind, I believe the better form for the patch is this one:
>   http://cr.openjdk.java.net/~shade/shenandoah/wb-split-mutator/webrev.01/
> 
> I can follow-up on that version.
> 

That looks even better. Please push that if it passes testing.

Thank you!
Roman


More information about the shenandoah-dev mailing list