RFR: 8326936: RISC-V: Shenandoah GC crashes due to incorrect atomic memory operations [v5]

MaxXing duke at openjdk.org
Tue Mar 5 03:46:56 UTC 2024


> With compressed oops enabled, Shenandoah GC crashes in the concurrent marking phase due to some incorrect atomic memory operations. This resulted in the failure of multiple related tests, including `gc/shenandoah/TestSmallHeap.java`, `gc/metaspace/TestMetaspacePerfCounters.java#Shenandoah-64`, and so on, tested on XuanTie C910 and QEMU.
> 
> This failure is related to a GCC bug we recently discovered: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114130.
> 
> In detail, there's a pattern in method `ShenandoahHeap::conc_update_with_forwarded`:
> 
> 
> if (in_collection_set(obj)) {
>   // Dereferences `obj` without explicit null check.
>   oop fwd = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
>   // Then calls atomic built-in.
>   atomic_update_oop(fwd, p, obj);
> }
> 
> 
> `atomic_update_oop` then compresses `obj` into a 32-bit word and calls the built-in `__atomic_compare_exchange`. The latter produces incorrect assembly that comparing this unsigned 32-bit word with the sign-extended result of `lr.w` instructions.
> 
> This bug can be bypassed by adding an explicit null check (like `if (obj && in_collection_set(obj))`), or adding compiler flag `-fno-delete-null-pointer-checks`.
> 
> In previous commits, JDK-8316186 removed RISC-V's `PlatformCmpxchg<4>` but left the flag `-fno-delete-null-pointer-checks` enabled. Then JDK-8316893 removed the flag and made the bug visible. This patch adds `PlatformCmpxchg<4>` back.

MaxXing has updated the pull request incrementally with one additional commit since the last revision:

  Fix value types, macro conditions and comments.

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/18039/files
  - new: https://git.openjdk.org/jdk/pull/18039/files/94194f7f..e1a49d85

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=18039&range=04
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=18039&range=03-04

  Stats: 4 lines in 1 file changed: 0 ins; 0 del; 4 mod
  Patch: https://git.openjdk.org/jdk/pull/18039.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/18039/head:pull/18039

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


More information about the hotspot-runtime-dev mailing list