45 lines
1.9 KiB
Diff
45 lines
1.9 KiB
Diff
|
|
From 8f29e9c5ec26a5f726ddd0557e046e66c1c94e10 Mon Sep 17 00:00:00 2001
|
||
|
|
Date: Wed, 8 Dec 2021 16:23:26 +0800
|
||
|
|
Subject: [PATCH] [Backport] 8272138: ZGC: Adopt relaxed ordering for self-healing
|
||
|
|
|
||
|
|
Reference: https://bugs.openjdk.java.net/browse/JDK-8272138
|
||
|
|
---
|
||
|
|
src/hotspot/share/gc/z/zBarrier.inline.hpp | 2 +-
|
||
|
|
src/hotspot/share/gc/z/zForwarding.inline.hpp | 6 +++++-
|
||
|
|
2 files changed, 6 insertions(+), 2 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/src/hotspot/share/gc/z/zBarrier.inline.hpp b/src/hotspot/share/gc/z/zBarrier.inline.hpp
|
||
|
|
index 0fa611005..2eaebfcfd 100644
|
||
|
|
--- a/src/hotspot/share/gc/z/zBarrier.inline.hpp
|
||
|
|
+++ b/src/hotspot/share/gc/z/zBarrier.inline.hpp
|
||
|
|
@@ -117,7 +117,7 @@ inline void ZBarrier::self_heal(volatile oop* p, uintptr_t addr, uintptr_t heal_
|
||
|
|
|
||
|
|
for (;;) {
|
||
|
|
// Heal
|
||
|
|
- const uintptr_t prev_addr = Atomic::cmpxchg((volatile uintptr_t*)p, addr, heal_addr);
|
||
|
|
+ const uintptr_t prev_addr = Atomic::cmpxchg((volatile uintptr_t*)p, addr, heal_addr, memory_order_relaxed);
|
||
|
|
if (prev_addr == addr) {
|
||
|
|
// Success
|
||
|
|
return;
|
||
|
|
diff --git a/src/hotspot/share/gc/z/zForwarding.inline.hpp b/src/hotspot/share/gc/z/zForwarding.inline.hpp
|
||
|
|
index 31bf72929..cff6d7a90 100644
|
||
|
|
--- a/src/hotspot/share/gc/z/zForwarding.inline.hpp
|
||
|
|
+++ b/src/hotspot/share/gc/z/zForwarding.inline.hpp
|
||
|
|
@@ -136,8 +136,12 @@ inline uintptr_t ZForwarding::insert(uintptr_t from_index, uintptr_t to_offset,
|
||
|
|
const ZForwardingEntry new_entry(from_index, to_offset);
|
||
|
|
const ZForwardingEntry old_entry; // Empty
|
||
|
|
|
||
|
|
+ // Make sure that object copy is finished
|
||
|
|
+ // before forwarding table installation
|
||
|
|
+ OrderAccess::release();
|
||
|
|
+
|
||
|
|
for (;;) {
|
||
|
|
- const ZForwardingEntry prev_entry = Atomic::cmpxchg(entries() + *cursor, old_entry, new_entry);
|
||
|
|
+ const ZForwardingEntry prev_entry = Atomic::cmpxchg(entries() + *cursor, old_entry, new_entry, memory_order_relaxed);
|
||
|
|
if (!prev_entry.populated()) {
|
||
|
|
// Success
|
||
|
|
return to_offset;
|
||
|
|
--
|
||
|
|
2.19.0
|
||
|
|
|