[lworld] RFR: 8303416: [lworld] Fix JVM crash at Unsafe_FinishPrivateBuffer
Xiaohong Gong
xgong at openjdk.org
Thu Mar 2 09:07:29 UTC 2023
When calling Unsafe.finishPrivateBuffer(), JVM crashes with following
assertion failure:
Internal Error (/mnt/local/code/valhalla/src/hotspot/share/prims/unsafe.cpp:388), pid=29517, tid=29518
assert(v->mark().is_larval_state()) failed: must be a larval value
JRE version: OpenJDK Runtime Environment (21.0) (fastdebug build 21-internal-git-05e4d0dba)
Java VM: OpenJDK 64-Bit Server VM (fastdebug 21-internal-git-05e4d0dba, mixed mode, compressed oops, compressed class ptrs, g1 gc, linux-aarch64)
Problematic frame:
V [[libjvm.so](http://libjvm.so/)+0x1a92a64] Unsafe_FinishPrivateBuffer+0xc0
The assertion is used to check whether the input value is in larval
state. Usually this method is called after `Unsafe.makePrivateBuffer()`,
which will create a new oop and set it to larval state. If everything
works fine, the above assertion won't fail. But the issue happens if
all the fields of the input value object of `Unsafe.makePrivateBuffer()`
are the relative java default values (i.e. `0`). The root cause is the
C2 compiler will optimize the new buffered oop to the default oop for
such value object, and the larval state is missed during the optimization.
Marking the larval bit of the optimized oop can fix the issue.
-------------
Commit messages:
- 8303416: [lworld] Fix JVM crash at Unsafe_FinishPrivateBuffer
Changes: https://git.openjdk.org/valhalla/pull/828/files
Webrev: https://webrevs.openjdk.org/?repo=valhalla&pr=828&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8303416
Stats: 114 lines in 2 files changed: 108 ins; 0 del; 6 mod
Patch: https://git.openjdk.org/valhalla/pull/828.diff
Fetch: git fetch https://git.openjdk.org/valhalla pull/828/head:pull/828
PR: https://git.openjdk.org/valhalla/pull/828
More information about the valhalla-dev
mailing list