RFR: Hole in CAS barrier when using traversal heuristics
Roman Kennke
rkennke at redhat.com
Thu Jan 25 17:26:37 UTC 2018
Am 25.01.2018 um 18:15 schrieb Zhengyu Gu:
> I am not complete sure this is right fix. There is hole in CAS barrier
> when using traversal heuristics.
>
> E.g. Unsafe_CompareAndSetObject() evacuates target and exchange object,
> but not the field, so it may hit assertion in ShenandoahBarrier::enqueue().
>
> I could not come up a reliable reproducer, but I have seen this a few
> time with specjvm ScimarkLU with options:
>
> "-Xmx1g -Xms1g -XX:+UseShenandoahGC -XX:+UnlockExperimentalVMOptions
> -XX:+UnlockDiagnosticVMOptions -XX:ShenandoahGCHeuristics=traversal
> -Xlog:gc+stats"
>
> Webrev: http://cr.openjdk.java.net/~zgu/shenandoah/cas_traversal/webrev.00/
>
>
> Thanks,
>
> -Zhengyu
Hi Zhengyu,
I am not sure what you mean by 'evacuates target and exchange object,
but not the field' .. clearly the target object needs to be evacuated,
because we only write to to-space (write-barrier). Also, the exchange
object needs to be evacuated, to ensure we end up only with to-space
references in fields (storeval-barrier). What do you mean by evacuation
of 'the field' ? The target field is part of the target object.
The issue here seems to be that the usual 'pre-barrier' (i.e.
SATB-barrier) should not be called at all. However, since we do set the
MARKING bit, we still get into this code path. We might just want to
check for traversal-in-progress and return right at the start of the method.
Roman
More information about the shenandoah-dev
mailing list