sync 2309 master feature to openEuler-20.03-LTS-SP4

This commit is contained in:
DXwangg 2023-10-10 15:43:04 +08:00
parent f5a4a1c1a4
commit a56ca239af
19 changed files with 189505 additions and 10229 deletions

View File

@ -0,0 +1,95 @@
Date: Sat, 27 May 2023 17:36:33 +0800
Subject: add
8275509-ModuleDescriptor.hashCode-isn-t-reproducible
---
.../module/ModuleDescriptorHashCodeTest.java | 77 +++++++++++++++++++
1 file changed, 77 insertions(+)
create mode 100644 test/jdk/java/lang/module/ModuleDescriptorHashCodeTest.java
diff --git a/test/jdk/java/lang/module/ModuleDescriptorHashCodeTest.java b/test/jdk/java/lang/module/ModuleDescriptorHashCodeTest.java
new file mode 100644
index 000000000..ef6775e2d
--- /dev/null
+++ b/test/jdk/java/lang/module/ModuleDescriptorHashCodeTest.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, Huawei Technologies Co., Ltd. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import org.testng.annotations.Test;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.module.ModuleDescriptor;
+import java.util.Set;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotSame;
+
+/**
+ * @test
+ * @bug 8275509
+ * @run testng ModuleDescriptorHashCodeTest
+ * @run testng/othervm -Xshare:off ModuleDescriptorHashCodeTest
+ * @summary Tests the ModuleDescriptor.hashCode() for boot layer modules
+ */
+public class ModuleDescriptorHashCodeTest {
+
+ /**
+ * Verifies that the ModuleDescriptor.hashCode() returned by a boot layer module is
+ * the same as that returned by a ModuleDescriptor constructed from the ModuleDescriptor.Builder
+ * for the same module.
+ */
+ @Test
+ public void testBootModuleDescriptor() throws Exception {
+ Set<Module> bootModules = ModuleLayer.boot().modules();
+ for (Module bootModule : bootModules) {
+ System.out.println("Testing module descriptor of boot module " + bootModule);
+ ModuleDescriptor bootMD = bootModule.getDescriptor();
+ ModuleDescriptor mdFromBuilder = fromModuleInfoClass(bootModule);
+ // verify that this object is indeed a different object instance than the boot module descriptor
+ // to prevent any artificial passing of the test
+ assertNotSame(mdFromBuilder, bootMD, "ModuleDescriptor loaded from boot layer and " +
+ "one created from module-info.class unexpectedly returned the same instance");
+ assertEquals(mdFromBuilder.hashCode(), bootMD.hashCode(),
+ "Unexpected ModuleDescriptor.hashCode() for " + mdFromBuilder);
+ assertEquals(mdFromBuilder.compareTo(bootMD), 0,
+ "Unexpected ModuleDescriptor.compareTo() for " + mdFromBuilder);
+ }
+ }
+
+ // Returns a ModuleDescriptor parsed out of the module-info.class of the passed Module
+ private static ModuleDescriptor fromModuleInfoClass(Module module) throws IOException {
+ try (InputStream moduleInfo = module.getResourceAsStream("module-info.class")) {
+ if (moduleInfo == null) {
+ throw new RuntimeException("Could not locate module-info.class in " + module);
+ }
+ // internally calls ModuleDescriptor.Builder
+ return ModuleDescriptor.read(moduleInfo);
+ }
+ }
+}
--
2.22.0

View File

@ -1,145 +0,0 @@
diff --git a/src/hotspot/share/opto/stringopts.cpp b/src/hotspot/share/opto/stringopts.cpp
index 8c0a060d8..78317fe0a 100644
--- a/src/hotspot/share/opto/stringopts.cpp
+++ b/src/hotspot/share/opto/stringopts.cpp
@@ -1030,6 +1030,21 @@ bool StringConcat::validate_control_flow() {
fail = true;
break;
} else if (ptr->is_Proj() && ptr->in(0)->is_Initialize()) {
+ // Check for side effect between Initialize and the constructor
+ for (SimpleDUIterator iter(ptr); iter.has_next(); iter.next()) {
+ Node* use = iter.get();
+ if (!use->is_CFG() && !use->is_CheckCastPP() && !use->is_Load()) {
+#ifndef PRODUCT
+ if (PrintOptimizeStringConcat) {
+ tty->print_cr("unexpected control use of Initialize");
+ ptr->in(0)->dump(); // Initialize node
+ use->dump(1);
+ }
+#endif
+ fail = true;
+ break;
+ }
+ }
ptr = ptr->in(0)->in(0);
} else if (ptr->is_Region()) {
Node* copy = ptr->as_Region()->is_copy();
diff --git a/test/hotspot/jtreg/compiler/stringopts/SideEffectBeforeConstructor.jasm b/test/hotspot/jtreg/compiler/stringopts/SideEffectBeforeConstructor.jasm
new file mode 100644
index 000000000..cbc6d754b
--- /dev/null
+++ b/test/hotspot/jtreg/compiler/stringopts/SideEffectBeforeConstructor.jasm
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+super public class compiler/stringopts/SideEffectBeforeConstructor
+ version 51:0
+{
+ public static Field result:I;
+
+ static Method "<clinit>":"()V"
+ stack 2 locals 0
+ {
+ iconst_0;
+ putstatic Field result:"I";
+ return;
+ }
+ public Method "<init>":"()V"
+ stack 1 locals 1
+ {
+ aload_0;
+ invokespecial Method java/lang/Object."<init>":"()V";
+ return;
+ }
+
+ public static Method test:"(Ljava/lang/String;)V"
+ stack 4 locals 1
+ {
+ new class java/lang/StringBuffer;
+ dup;
+ getstatic Field result:"I";
+ iconst_1;
+ iadd;
+ putstatic Field result:"I";
+ aload_0;
+ invokespecial Method java/lang/StringBuffer."<init>":"(Ljava/lang/String;)V";
+ invokevirtual Method java/lang/StringBuffer.toString:"()Ljava/lang/String;";
+ return;
+ }
+}
diff --git a/test/hotspot/jtreg/compiler/stringopts/TestSideEffectBeforeConstructor.java b/test/hotspot/jtreg/compiler/stringopts/TestSideEffectBeforeConstructor.java
new file mode 100644
index 000000000..86c5eca1d
--- /dev/null
+++ b/test/hotspot/jtreg/compiler/stringopts/TestSideEffectBeforeConstructor.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8290705
+ * @summary Test correctness of the string concatenation optimization with
+ * a store between StringBuffer allocation and constructor invocation.
+ * @compile SideEffectBeforeConstructor.jasm
+ * @run main/othervm -Xbatch compiler.stringopts.TestSideEffectBeforeConstructor
+ */
+
+package compiler.stringopts;
+
+public class TestSideEffectBeforeConstructor {
+
+ public static void main(String[] args) {
+ for (int i = 0; i < 100_000; ++i) {
+ try {
+ SideEffectBeforeConstructor.test(null);
+ } catch (NullPointerException npe) {
+ // Expected
+ }
+ }
+ if (SideEffectBeforeConstructor.result != 100_000) {
+ throw new RuntimeException("Unexpected result: " + SideEffectBeforeConstructor.result);
+ }
+ }
+}

View File

@ -1,42 +0,0 @@
From c40df7ed8cb6d6c0f687c1d68071729fab7c1b2d Mon Sep 17 00:00:00 2001
Date: Wed, 4 Jan 2023 20:42:04 +0800
Subject: 8296480: Fix the problem that the TestPolicy.java
case fails because the certificate expires.
---
.../java/security/cert/pkix/policyChanges/TestPolicy.java | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/test/jdk/java/security/cert/pkix/policyChanges/TestPolicy.java b/test/jdk/java/security/cert/pkix/policyChanges/TestPolicy.java
index a92eee2c5..de2f94d27 100644
--- a/test/jdk/java/security/cert/pkix/policyChanges/TestPolicy.java
+++ b/test/jdk/java/security/cert/pkix/policyChanges/TestPolicy.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -34,6 +34,7 @@
*/
import java.io.*;
+import java.text.DateFormat;
import java.util.*;
import java.security.Security;
@@ -97,6 +98,10 @@ public class TestPolicy {
params.setRevocationEnabled(false);
params.setInitialPolicies(testCase.initialPolicies);
+ // Certs expired on 7th Nov 2022
+ params.setDate(DateFormat.getDateInstance(DateFormat.MEDIUM,
+ Locale.US).parse("June 01, 2022"));
+
CertPath path = factory.generateCertPath(Arrays.asList(new X509Certificate[] {ee, ca}));
PKIXCertPathValidatorResult result = (PKIXCertPathValidatorResult)validator.validate(path, params);
--
2.37.0

View File

@ -1,40 +0,0 @@
From 59bc22bb9d2cdcc7d12d163c30432bd8c9d2c976 Mon Sep 17 00:00:00 2001
Date: Wed, 4 Jan 2023 20:44:46 +0800
Subject: 8296485: BuildEEBasicConstraints.java test fails
with SunCertPathBuilderException
---
.../targetConstraints/BuildEEBasicConstraints.java | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/test/jdk/java/security/cert/CertPathBuilder/targetConstraints/BuildEEBasicConstraints.java b/test/jdk/java/security/cert/CertPathBuilder/targetConstraints/BuildEEBasicConstraints.java
index c7cc90f95..edb68cf29 100644
--- a/test/jdk/java/security/cert/CertPathBuilder/targetConstraints/BuildEEBasicConstraints.java
+++ b/test/jdk/java/security/cert/CertPathBuilder/targetConstraints/BuildEEBasicConstraints.java
@@ -45,9 +45,11 @@ import java.security.cert.PKIXCertPathBuilderResult;
import java.security.cert.TrustAnchor;
import java.security.cert.X509Certificate;
import java.security.cert.X509CertSelector;
+import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.Locale;
import jdk.test.lib.security.CertUtils;
public final class BuildEEBasicConstraints {
@@ -65,6 +67,11 @@ public final class BuildEEBasicConstraints {
PKIXBuilderParameters params = new PKIXBuilderParameters
(Collections.singleton(anchor), sel);
params.setRevocationEnabled(false);
+
+ // Certs expired on 7th Nov 2022
+ params.setDate(DateFormat.getDateInstance(DateFormat.MEDIUM,
+ Locale.US).parse("June 01, 2022"));
+
X509Certificate eeCert = CertUtils.getCertFromFile("ee.cer");
X509Certificate caCert = CertUtils.getCertFromFile("ca.cer");
ArrayList<X509Certificate> certs = new ArrayList<X509Certificate>();
--
2.37.0

View File

@ -0,0 +1,175 @@
Date: Sat, 27 May 2023 17:40:53 +0800
Subject: add
8302595-use-after-free-related-to-GraphKit-clone_map.patch
---
src/hotspot/share/opto/compile.hpp | 3 ++-
src/hotspot/share/opto/graphKit.cpp | 23 +++++++++++++++++++++
src/hotspot/share/opto/graphKit.hpp | 7 ++++++-
src/hotspot/share/opto/library_call.cpp | 6 +++---
src/hotspot/share/opto/node.hpp | 5 +++++
src/hotspot/share/opto/phaseX.hpp | 5 +++++
src/hotspot/share/opto/vectorIntrinsics.cpp | 4 ++--
7 files changed, 46 insertions(+), 7 deletions(-)
diff --git a/src/hotspot/share/opto/compile.hpp b/src/hotspot/share/opto/compile.hpp
index 6e5f2ed23..b7c18b337 100644
--- a/src/hotspot/share/opto/compile.hpp
+++ b/src/hotspot/share/opto/compile.hpp
@@ -921,7 +921,8 @@ class Compile : public Phase {
// Parsing, optimization
PhaseGVN* initial_gvn() { return _initial_gvn; }
Unique_Node_List* for_igvn() { return _for_igvn; }
- inline void record_for_igvn(Node* n); // Body is after class Unique_Node_List.
+ inline void record_for_igvn(Node* n); // Body is after class Unique_Node_List in node.hpp.
+ inline void remove_for_igvn(Node* n); // Body is after class Unique_Node_List in node.hpp.
void set_initial_gvn(PhaseGVN *gvn) { _initial_gvn = gvn; }
void set_for_igvn(Unique_Node_List *for_igvn) { _for_igvn = for_igvn; }
diff --git a/src/hotspot/share/opto/graphKit.cpp b/src/hotspot/share/opto/graphKit.cpp
index a3df43c23..07d1999b2 100644
--- a/src/hotspot/share/opto/graphKit.cpp
+++ b/src/hotspot/share/opto/graphKit.cpp
@@ -738,6 +738,29 @@ SafePointNode* GraphKit::clone_map() {
return clonemap;
}
+// -----------------------------destruct_map_clone------------------------------
+// Order of destruct is important to increase the likelyhood that memory can be re-used. We need
+// to destruct/free/delete in the exact opposite order as clone_map().
+void GraphKit::destruct_map_clone(SafePointNode* sfp) {
+ if (sfp == nullptr) return;
+
+ Node* mem = sfp->memory();
+ JVMState* jvms = sfp->jvms();
+
+ if (jvms != nullptr) {
+ delete jvms;
+ }
+
+ remove_for_igvn(sfp);
+ gvn().clear_type(sfp);
+ sfp->destruct(&_gvn);
+
+ if (mem != nullptr) {
+ gvn().clear_type(mem);
+ mem->destruct(&_gvn);
+ }
+}
+
//-----------------------------set_map_clone-----------------------------------
void GraphKit::set_map_clone(SafePointNode* m) {
diff --git a/src/hotspot/share/opto/graphKit.hpp b/src/hotspot/share/opto/graphKit.hpp
index d815e2195..22f868442 100644
--- a/src/hotspot/share/opto/graphKit.hpp
+++ b/src/hotspot/share/opto/graphKit.hpp
@@ -94,7 +94,7 @@ class GraphKit : public Phase {
void* barrier_set_state() const { return C->barrier_set_state(); }
void record_for_igvn(Node* n) const { C->record_for_igvn(n); } // delegate to Compile
-
+ void remove_for_igvn(Node* n) const { C->remove_for_igvn(n); }
// Handy well-known nodes:
Node* null() const { return zerocon(T_OBJECT); }
Node* top() const { return C->top(); }
@@ -170,6 +170,11 @@ class GraphKit : public Phase {
// Clone the existing map state. (Implements PreserveJVMState.)
SafePointNode* clone_map();
+ // Reverses the work done by clone_map(). Should only be used when the node returned by
+ // clone_map() is ultimately not used. Calling Node::destruct directly in the previously
+ // mentioned circumstance instead of this method may result in use-after-free.
+ void destruct_map_clone(SafePointNode* sfp);
+
// Set the map to a clone of the given one.
void set_map_clone(SafePointNode* m);
diff --git a/src/hotspot/share/opto/library_call.cpp b/src/hotspot/share/opto/library_call.cpp
index b5970545c..2dd246093 100644
--- a/src/hotspot/share/opto/library_call.cpp
+++ b/src/hotspot/share/opto/library_call.cpp
@@ -1563,7 +1563,7 @@ bool LibraryCallKit::inline_string_char_access(bool is_store) {
set_sp(old_sp);
return false;
}
- old_map->destruct(&_gvn);
+ destruct_map_clone(old_map);
if (is_store) {
access_store_at(value, adr, TypeAryPtr::BYTES, ch, TypeInt::CHAR, T_CHAR, IN_HEAP | MO_UNORDERED | C2_MISMATCHED);
} else {
@@ -2346,7 +2346,7 @@ bool LibraryCallKit::inline_unsafe_access(bool is_store, const BasicType type, c
mismatched = true; // conservatively mark all "wide" on-heap accesses as mismatched
}
- old_map->destruct(&_gvn);
+ destruct_map_clone(old_map);
assert(!mismatched || alias_type->adr_type()->is_oopptr(), "off-heap access can't be mismatched");
if (mismatched) {
@@ -2597,7 +2597,7 @@ bool LibraryCallKit::inline_unsafe_load_store(const BasicType type, const LoadSt
return false;
}
- old_map->destruct(&_gvn);
+ destruct_map_clone(old_map);
// For CAS, unlike inline_unsafe_access, there seems no point in
// trying to refine types. Just use the coarse types here.
diff --git a/src/hotspot/share/opto/node.hpp b/src/hotspot/share/opto/node.hpp
index 2a78e259d..b79e7673f 100644
--- a/src/hotspot/share/opto/node.hpp
+++ b/src/hotspot/share/opto/node.hpp
@@ -1647,6 +1647,11 @@ inline void Compile::record_for_igvn(Node* n) {
_for_igvn->push(n);
}
+// Inline definition of Compile::remove_for_igvn must be deferred to this point.
+inline void Compile::remove_for_igvn(Node* n) {
+ _for_igvn->remove(n);
+}
+
//------------------------------Node_Stack-------------------------------------
class Node_Stack {
friend class VMStructs;
diff --git a/src/hotspot/share/opto/phaseX.hpp b/src/hotspot/share/opto/phaseX.hpp
index 6d0d8ca46..252761161 100644
--- a/src/hotspot/share/opto/phaseX.hpp
+++ b/src/hotspot/share/opto/phaseX.hpp
@@ -238,6 +238,11 @@ public:
assert(t != NULL, "type must not be null");
_types.map(n->_idx, t);
}
+ void clear_type(const Node* n) {
+ if (n->_idx < _types.Size()) {
+ _types.map(n->_idx, NULL);
+ }
+ }
// Record an initial type for a node, the node's bottom type.
void set_type_bottom(const Node* n) {
// Use this for initialization when bottom_type() (or better) is not handy.
diff --git a/src/hotspot/share/opto/vectorIntrinsics.cpp b/src/hotspot/share/opto/vectorIntrinsics.cpp
index 06f491419..92f292438 100644
--- a/src/hotspot/share/opto/vectorIntrinsics.cpp
+++ b/src/hotspot/share/opto/vectorIntrinsics.cpp
@@ -868,7 +868,7 @@ bool LibraryCallKit::inline_vector_mem_operation(bool is_store) {
set_result(box);
}
- old_map->destruct(&_gvn);
+ destruct_map_clone(old_map);
if (can_access_non_heap) {
insert_mem_bar(Op_MemBarCPUOrder);
@@ -1006,7 +1006,7 @@ bool LibraryCallKit::inline_vector_gather_scatter(bool is_scatter) {
set_result(box);
}
- old_map->destruct(&_gvn);
+ destruct_map_clone(old_map);
C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
return true;
--
2.22.0

View File

@ -0,0 +1,24 @@
Date: Sat, 27 May 2023 17:39:02 +0800
Subject: add
8303069-Memory-leak-in-CompilerOracle-parse_from_lin.patch
---
src/hotspot/share/compiler/compilerOracle.cpp | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/hotspot/share/compiler/compilerOracle.cpp b/src/hotspot/share/compiler/compilerOracle.cpp
index 69a327873..5149121c5 100644
--- a/src/hotspot/share/compiler/compilerOracle.cpp
+++ b/src/hotspot/share/compiler/compilerOracle.cpp
@@ -308,6 +308,8 @@ static void register_command(TypedMethodOptionMatcher* matcher,
if (option == CompileCommand::Blackhole && !UnlockExperimentalVMOptions) {
warning("Blackhole compile option is experimental and must be enabled via -XX:+UnlockExperimentalVMOptions");
+ // Delete matcher as we don't keep it
+ delete matcher;
return;
}
--
2.22.0

View File

@ -0,0 +1,29 @@
Date: Sat, 27 May 2023 17:40:24 +0800
Subject: add
8304683-Memory-leak-in-WB_IsMethodCompatible.patch
---
src/hotspot/share/prims/whitebox.cpp | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/src/hotspot/share/prims/whitebox.cpp b/src/hotspot/share/prims/whitebox.cpp
index 296bfe9e4..f6c947f13 100644
--- a/src/hotspot/share/prims/whitebox.cpp
+++ b/src/hotspot/share/prims/whitebox.cpp
@@ -821,10 +821,9 @@ static bool is_excluded_for_compiler(AbstractCompiler* comp, methodHandle& mh) {
return true;
}
DirectiveSet* directive = DirectivesStack::getMatchingDirective(mh, comp);
- if (directive->ExcludeOption) {
- return true;
- }
- return false;
+ bool exclude = directive->ExcludeOption;
+ DirectivesStack::release(directive);
+ return exclude;
}
static bool can_be_compiled_at_level(methodHandle& mh, jboolean is_osr, int level) {
--
2.22.0

View File

@ -0,0 +1,260 @@
Date: Sat, 27 May 2023 17:38:35 +0800
Subject: add
8305541-C2-Div-Mod-nodes-without-zero-check-could-be.patch
---
src/hotspot/share/opto/loopnode.hpp | 3 +
src/hotspot/share/opto/loopopts.cpp | 42 ++++-
.../c2/TestSplitDivisionThroughPhi.java | 161 ++++++++++++++++++
3 files changed, 205 insertions(+), 1 deletion(-)
create mode 100644 test/hotspot/jtreg/compiler/c2/TestSplitDivisionThroughPhi.java
diff --git a/src/hotspot/share/opto/loopnode.hpp b/src/hotspot/share/opto/loopnode.hpp
index ebc3bd1db..0db6d0881 100644
--- a/src/hotspot/share/opto/loopnode.hpp
+++ b/src/hotspot/share/opto/loopnode.hpp
@@ -1506,6 +1506,9 @@ private:
void try_move_store_after_loop(Node* n);
bool identical_backtoback_ifs(Node *n);
bool can_split_if(Node *n_ctrl);
+ bool cannot_split_division(const Node* n, const Node* region) const;
+ static bool is_divisor_counted_loop_phi(const Node* divisor, const Node* loop);
+ bool loop_phi_backedge_type_contains_zero(const Node* phi_divisor, const Type* zero) const;
// Determine if a method is too big for a/another round of split-if, based on
// a magic (approximate) ratio derived from the equally magic constant 35000,
diff --git a/src/hotspot/share/opto/loopopts.cpp b/src/hotspot/share/opto/loopopts.cpp
index c0804ed67..9e0f1b2d2 100644
--- a/src/hotspot/share/opto/loopopts.cpp
+++ b/src/hotspot/share/opto/loopopts.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -61,6 +61,10 @@ Node* PhaseIdealLoop::split_thru_phi(Node* n, Node* region, int policy) {
return NULL;
}
+ if (cannot_split_division(n, region)) {
+ return NULL;
+ }
+
// Bail out if 'n' is a Div or Mod node whose zero check was removed earlier (i.e. control is NULL) and its divisor is an induction variable
// phi p of a trip-counted (integer) loop whose inputs could be zero (include zero in their type range). p could have a more precise type
// range that does not necessarily include all values of its inputs. Since each of these inputs will be a divisor of the newly cloned nodes
@@ -225,6 +229,42 @@ Node* PhaseIdealLoop::split_thru_phi(Node* n, Node* region, int policy) {
return phi;
}
+// Return true if 'n' is a Div or Mod node (without zero check If node which was removed earlier) with a loop phi divisor
+// of a trip-counted (integer or long) loop with a backedge input that could be zero (include zero in its type range). In
+// this case, we cannot split the division to the backedge as it could freely float above the loop exit check resulting in
+// a division by zero. This situation is possible because the type of an increment node of an iv phi (trip-counter) could
+// include zero while the iv phi does not (see PhiNode::Value() for trip-counted loops where we improve types of iv phis).
+// We also need to check other loop phis as they could have been created in the same split-if pass when applying
+// PhaseIdealLoop::split_thru_phi() to split nodes through an iv phi.
+bool PhaseIdealLoop::cannot_split_division(const Node* n, const Node* region) const {
+ const Type* zero;
+ switch (n->Opcode()) {
+ case Op_DivI:
+ case Op_ModI:
+ zero = TypeInt::ZERO;
+ break;
+ case Op_DivL:
+ case Op_ModL:
+ zero = TypeLong::ZERO;
+ break;
+ default:
+ return false;
+ }
+
+ assert(n->in(0) == NULL, "divisions with zero check should already have bailed out earlier in split-if");
+ Node* divisor = n->in(2);
+ return is_divisor_counted_loop_phi(divisor, region) &&
+ loop_phi_backedge_type_contains_zero(divisor, zero);
+}
+
+bool PhaseIdealLoop::is_divisor_counted_loop_phi(const Node* divisor, const Node* loop) {
+ return loop->is_BaseCountedLoop() && divisor->is_Phi() && divisor->in(0) == loop;
+}
+
+bool PhaseIdealLoop::loop_phi_backedge_type_contains_zero(const Node* phi_divisor, const Type* zero) const {
+ return _igvn.type(phi_divisor->in(LoopNode::LoopBackControl))->filter_speculative(zero) != Type::TOP;
+}
+
//------------------------------dominated_by------------------------------------
// Replace the dominated test with an obvious true or false. Place it on the
// IGVN worklist for later cleanup. Move control-dependent data Nodes on the
diff --git a/test/hotspot/jtreg/compiler/c2/TestSplitDivisionThroughPhi.java b/test/hotspot/jtreg/compiler/c2/TestSplitDivisionThroughPhi.java
new file mode 100644
index 000000000..5a42e7d36
--- /dev/null
+++ b/test/hotspot/jtreg/compiler/c2/TestSplitDivisionThroughPhi.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2023, Huawei Technologies Co., Ltd. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+* @test
+* @key stress randomness
+* @bug 8299259
+* @requires vm.compiler2.enabled
+* @summary Test various cases of divisions/modulo which should not be split through iv phis.
+* @run main/othervm -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:LoopUnrollLimit=0 -XX:+StressGCM -XX:StressSeed=884154126
+* -XX:CompileCommand=compileonly,compiler.splitif.TestSplitDivisionThroughPhi::*
+* compiler.splitif.TestSplitDivisionThroughPhi
+*/
+
+/**
+* @test
+* @key stress randomness
+* @bug 8299259
+* @requires vm.compiler2.enabled
+* @summary Test various cases of divisions/modulo which should not be split through iv phis.
+* @run main/othervm -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:LoopUnrollLimit=0 -XX:+StressGCM
+* -XX:CompileCommand=compileonly,compiler.splitif.TestSplitDivisionThroughPhi::*
+* compiler.splitif.TestSplitDivisionThroughPhi
+*/
+
+package compiler.splitif;
+
+public class TestSplitDivisionThroughPhi {
+ static int iFld;
+ static long lFld;
+ static boolean flag;
+
+
+ public static void main(String[] strArr) {
+ for (int i = 0; i < 5000; i++) {
+ testPushDivIThruPhi();
+ testPushDivIThruPhiInChain();
+ testPushModIThruPhi();
+ testPushModIThruPhiInChain();
+ testPushDivLThruPhi();
+ testPushDivLThruPhiInChain();
+ testPushModLThruPhi();
+ testPushModLThruPhiInChain();
+ }
+ }
+
+ // Already fixed by JDK-8248552.
+ static void testPushDivIThruPhi() {
+ for (int i = 10; i > 1; i -= 2) {
+ // The Div node is only split in later loop opts phase because the zero divisor check is only removed
+ // in IGVN after the first loop opts phase.
+ //
+ // iv phi i type: [2..10]
+ // When splitting the DivI through the iv phi, it ends up on the back edge with the trip count decrement
+ // as input which has type [0..8]. We end up executing a division by zero on the last iteration because
+ // the DivI it is not pinned to the loop exit test and can freely float above the loop exit check.
+ iFld = 10 / i;
+ }
+ }
+
+ // Same as above but with an additional Mul node between the iv phi and the Div node. Both nodes are split through
+ // the iv phi in one pass of Split If.
+ static void testPushDivIThruPhiInChain() {
+ for (int i = 10; i > 1; i -= 2) {
+ // Empty one iteration loop which is only removed after split if in first loop opts phase. This prevents
+ // that the Mul node is already split through the iv phi while the Div node cannot be split yet due to
+ // the zero divisor check which can only be removed in the IGVN after the first loop opts pass.
+ for (int j = 0; j < 1; j++) {
+ }
+ iFld = 10 / (i * 100);
+ }
+ }
+
+ // Already fixed by JDK-8248552.
+ static void testPushModIThruPhi() {
+ for (int i = 10; i > 1; i -= 2) {
+ iFld = 10 / i;
+ }
+ }
+
+ // Same as above but with ModI.
+ static void testPushModIThruPhiInChain() {
+ for (int i = 10; i > 1; i -= 2) {
+ for (int j = 0; j < 1; j++) {
+ }
+ iFld = 10 / (i * 100);
+ }
+ }
+
+ // Long cases only trigger since JDK-8256655.
+
+ // Same as above but with DivL.
+ static void testPushDivLThruPhi() {
+ for (long i = 10; i > 1; i -= 2) {
+ lFld = 10L / i;
+
+ // Loop that is not removed such that we do not transform the outer LongCountedLoop (only done if innermost)
+ for (int j = 0; j < 10; j++) {
+ flag = !flag;
+ }
+ }
+ }
+
+ // Same as above but with DivL.
+ static void testPushDivLThruPhiInChain() {
+ for (long i = 10; i > 1; i -= 2) {
+ for (int j = 0; j < 1; j++) {
+ }
+ lFld = 10L / (i * 100L);
+
+ for (int j = 0; j < 10; j++) {
+ flag = !flag;
+ }
+ }
+ }
+
+ // Same as above but with ModL
+ static void testPushModLThruPhi() {
+ for (long i = 10; i > 1; i -= 2) {
+ lFld = 10L % i;
+
+ for (int j = 0; j < 10; j++) {
+ flag = !flag;
+ }
+ }
+ }
+
+ // Same as above but with ModL
+ static void testPushModLThruPhiInChain() {
+ for (long i = 10; i > 1; i -= 2) {
+ for (int j = 0; j < 1; j++) {
+ }
+ lFld = 10L % (i * 100L);
+
+ for (int j = 0; j < 10; j++) {
+ flag = !flag;
+ }
+ }
+ }
+}
--
2.22.0

File diff suppressed because it is too large Load Diff

123024
LoongArch64-support.patch Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,457 @@
From 5cdf192706cc66ab8228057151bd807ea6267222 Mon Sep 17 00:00:00 2001
Date: Thu, 21 Sep 2023 16:44:51 +0800
Subject: add 8267185-Add-string-deduplication-support-to
---
.../gc/parallel/parallelScavengeHeap.cpp | 13 +++++
.../gc/parallel/parallelScavengeHeap.hpp | 3 ++
.../share/gc/parallel/psCompactionManager.cpp | 6 +++
.../share/gc/parallel/psCompactionManager.hpp | 9 ++++
.../parallel/psCompactionManager.inline.hpp | 7 +++
.../share/gc/parallel/psParallelCompact.cpp | 3 ++
.../share/gc/parallel/psPromotionManager.cpp | 1 +
.../share/gc/parallel/psPromotionManager.hpp | 5 ++
.../gc/parallel/psPromotionManager.inline.hpp | 7 +++
.../share/gc/parallel/psStringDedup.hpp | 50 +++++++++++++++++++
.../shared/stringdedup/stringDedupConfig.cpp | 2 +-
.../TestStringDeduplicationAgeThreshold.java | 13 +++++
.../TestStringDeduplicationFullGC.java | 13 +++++
.../TestStringDeduplicationInterned.java | 13 +++++
.../TestStringDeduplicationPrintOptions.java | 13 +++++
.../TestStringDeduplicationTableResize.java | 13 +++++
.../TestStringDeduplicationYoungGC.java | 13 +++++
17 files changed, 183 insertions(+), 1 deletion(-)
create mode 100644 src/hotspot/share/gc/parallel/psStringDedup.hpp
diff --git a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp
index 16c7d91c4..cf9d34eb9 100644
--- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp
+++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp
@@ -41,6 +41,7 @@
#include "gc/shared/gcInitLogger.hpp"
#include "gc/shared/locationPrinter.inline.hpp"
#include "gc/shared/scavengableNMethods.hpp"
+#include "gc/shared/suspendibleThreadSet.hpp"
#include "logging/log.hpp"
#include "memory/iterator.hpp"
#include "memory/metaspaceCounters.hpp"
@@ -162,6 +163,18 @@ void ParallelScavengeHeap::initialize_serviceability() {
}
+void ParallelScavengeHeap::safepoint_synchronize_begin() {
+ if (UseStringDeduplication) {
+ SuspendibleThreadSet::synchronize();
+ }
+}
+
+void ParallelScavengeHeap::safepoint_synchronize_end() {
+ if (UseStringDeduplication) {
+ SuspendibleThreadSet::desynchronize();
+ }
+}
+
class PSIsScavengable : public BoolObjectClosure {
bool do_object_b(oop obj) {
return ParallelScavengeHeap::heap()->is_in_young(obj);
diff --git a/src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp b/src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp
index 689400fbe..b35df689f 100644
--- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp
+++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp
@@ -139,6 +139,9 @@ class ParallelScavengeHeap : public CollectedHeap {
// Returns JNI_OK on success
virtual jint initialize();
+ virtual void safepoint_synchronize_begin();
+ virtual void safepoint_synchronize_end();
+
void post_initialize();
void update_counters();
diff --git a/src/hotspot/share/gc/parallel/psCompactionManager.cpp b/src/hotspot/share/gc/parallel/psCompactionManager.cpp
index b2c17140d..bab67b219 100644
--- a/src/hotspot/share/gc/parallel/psCompactionManager.cpp
+++ b/src/hotspot/share/gc/parallel/psCompactionManager.cpp
@@ -107,6 +107,12 @@ void ParCompactionManager::reset_all_bitmap_query_caches() {
}
}
+void ParCompactionManager::flush_all_string_dedup_requests() {
+ uint parallel_gc_threads = ParallelScavengeHeap::heap()->workers().total_workers();
+ for (uint i=0; i<=parallel_gc_threads; i++) {
+ _manager_array[i]->flush_string_dedup_requests();
+ }
+}
ParCompactionManager*
ParCompactionManager::gc_thread_compaction_manager(uint index) {
diff --git a/src/hotspot/share/gc/parallel/psCompactionManager.hpp b/src/hotspot/share/gc/parallel/psCompactionManager.hpp
index 12b5d891d..86810d32c 100644
--- a/src/hotspot/share/gc/parallel/psCompactionManager.hpp
+++ b/src/hotspot/share/gc/parallel/psCompactionManager.hpp
@@ -26,6 +26,7 @@
#define SHARE_GC_PARALLEL_PSCOMPACTIONMANAGER_HPP
#include "gc/parallel/psParallelCompact.hpp"
+#include "gc/shared/stringdedup/stringDedup.hpp"
#include "gc/shared/taskqueue.hpp"
#include "gc/shared/taskTerminator.hpp"
#include "memory/allocation.hpp"
@@ -88,6 +89,8 @@ class ParCompactionManager : public CHeapObj<mtGC> {
oop _last_query_obj;
size_t _last_query_ret;
+ StringDedup::Requests _string_dedup_requests;
+
static PSOldGen* old_gen() { return _old_gen; }
static ObjectStartArray* start_array() { return _start_array; }
static OopTaskQueueSet* oop_task_queues() { return _oop_task_queues; }
@@ -126,6 +129,10 @@ class ParCompactionManager : public CHeapObj<mtGC> {
_last_query_ret = 0;
}
+ void flush_string_dedup_requests() {
+ _string_dedup_requests.flush();
+ }
+
// Bitmap query support, cache last query and result
HeapWord* last_query_begin() { return _last_query_beg; }
oop last_query_object() { return _last_query_obj; }
@@ -137,6 +144,8 @@ class ParCompactionManager : public CHeapObj<mtGC> {
static void reset_all_bitmap_query_caches();
+ static void flush_all_string_dedup_requests();
+
RegionTaskQueue* region_stack() { return &_region_stack; }
static ParCompactionManager* get_vmthread_cm() { return _manager_array[ParallelGCThreads]; }
diff --git a/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp b/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp
index e40e3689d..45e8dae5a 100644
--- a/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp
+++ b/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp
@@ -31,6 +31,7 @@
#include "classfile/javaClasses.inline.hpp"
#include "gc/parallel/parMarkBitMap.hpp"
#include "gc/parallel/psParallelCompact.inline.hpp"
+#include "gc/parallel/psStringDedup.hpp"
#include "gc/shared/taskqueue.inline.hpp"
#include "oops/access.inline.hpp"
#include "oops/arrayOop.hpp"
@@ -108,6 +109,12 @@ inline void ParCompactionManager::mark_and_push(T* p) {
if (mark_bitmap()->is_unmarked(obj) && PSParallelCompact::mark_obj(obj)) {
push(obj);
+
+ if (StringDedup::is_enabled() &&
+ java_lang_String::is_instance_inlined(obj) &&
+ psStringDedup::is_candidate_from_mark(obj)) {
+ _string_dedup_requests.add(obj);
+ }
}
}
}
diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.cpp b/src/hotspot/share/gc/parallel/psParallelCompact.cpp
index 3c276db70..8ac733fa5 100644
--- a/src/hotspot/share/gc/parallel/psParallelCompact.cpp
+++ b/src/hotspot/share/gc/parallel/psParallelCompact.cpp
@@ -41,6 +41,7 @@
#include "gc/parallel/psRootType.hpp"
#include "gc/parallel/psScavenge.hpp"
#include "gc/parallel/psYoungGen.hpp"
+#include "gc/parallel/psStringDedup.hpp"
#include "gc/shared/gcCause.hpp"
#include "gc/shared/gcHeapSummary.hpp"
#include "gc/shared/gcId.hpp"
@@ -1021,6 +1022,8 @@ void PSParallelCompact::post_compact()
_space_info[id].publish_new_top();
}
+ ParCompactionManager::flush_all_string_dedup_requests();
+
MutableSpace* const eden_space = _space_info[eden_space_id].space();
MutableSpace* const from_space = _space_info[from_space_id].space();
MutableSpace* const to_space = _space_info[to_space_id].space();
diff --git a/src/hotspot/share/gc/parallel/psPromotionManager.cpp b/src/hotspot/share/gc/parallel/psPromotionManager.cpp
index c5f321f54..56e2683f3 100644
--- a/src/hotspot/share/gc/parallel/psPromotionManager.cpp
+++ b/src/hotspot/share/gc/parallel/psPromotionManager.cpp
@@ -121,6 +121,7 @@ bool PSPromotionManager::post_scavenge(YoungGCTracer& gc_tracer) {
promotion_failure_occurred = true;
}
manager->flush_labs();
+ manager->flush_string_dedup_requests();
}
if (!promotion_failure_occurred) {
// If there was no promotion failure, the preserved mark stacks
diff --git a/src/hotspot/share/gc/parallel/psPromotionManager.hpp b/src/hotspot/share/gc/parallel/psPromotionManager.hpp
index e94be81b6..462beec76 100644
--- a/src/hotspot/share/gc/parallel/psPromotionManager.hpp
+++ b/src/hotspot/share/gc/parallel/psPromotionManager.hpp
@@ -29,6 +29,7 @@
#include "gc/shared/copyFailedInfo.hpp"
#include "gc/shared/gcTrace.hpp"
#include "gc/shared/preservedMarks.hpp"
+#include "gc/shared/stringdedup/stringDedup.hpp"
#include "gc/shared/taskqueue.hpp"
#include "memory/padded.hpp"
#include "utilities/globalDefinitions.hpp"
@@ -92,6 +93,8 @@ class PSPromotionManager {
PreservedMarks* _preserved_marks;
PromotionFailedInfo _promotion_failed_info;
+ StringDedup::Requests _string_dedup_requests;
+
// Accessors
static PSOldGen* old_gen() { return _old_gen; }
static MutableSpace* young_space() { return _young_space; }
@@ -146,6 +149,8 @@ class PSPromotionManager {
static void restore_preserved_marks();
void flush_labs();
+ void flush_string_dedup_requests() { _string_dedup_requests.flush(); }
+
void drain_stacks(bool totally_drain) {
drain_stacks_depth(totally_drain);
}
diff --git a/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp b/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp
index a0149e447..e754d84b6 100644
--- a/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp
+++ b/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp
@@ -32,6 +32,7 @@
#include "gc/parallel/psOldGen.hpp"
#include "gc/parallel/psPromotionLAB.inline.hpp"
#include "gc/parallel/psScavenge.inline.hpp"
+#include "gc/parallel/psStringDedup.hpp"
#include "gc/shared/taskqueue.inline.hpp"
#include "gc/shared/tlab_globals.hpp"
#include "logging/log.hpp"
@@ -286,6 +287,12 @@ inline oop PSPromotionManager::copy_unmarked_to_survivor_space(oop o,
} else {
// we'll just push its contents
push_contents(new_obj);
+
+ if (StringDedup::is_enabled() &&
+ java_lang_String::is_instance_inlined(new_obj) &&
+ psStringDedup::is_candidate_from_evacuation(new_obj, new_obj_is_tenured)) {
+ _string_dedup_requests.add(o);
+ }
}
return new_obj;
} else {
diff --git a/src/hotspot/share/gc/parallel/psStringDedup.hpp b/src/hotspot/share/gc/parallel/psStringDedup.hpp
new file mode 100644
index 000000000..d1debbddc
--- /dev/null
+++ b/src/hotspot/share/gc/parallel/psStringDedup.hpp
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef SHARE_GC_PARALLEL_PSSTRINGDEDUP_HPP
+#define SHARE_GC_PARALLEL_PSSTRINGDEDUP_HPP
+
+#include "gc/parallel/psScavenge.hpp"
+#include "gc/shared/stringdedup/stringDedup.hpp"
+#include "memory/allStatic.hpp"
+#include "oops/oopsHierarchy.hpp"
+
+class psStringDedup : AllStatic {
+public:
+ static bool is_candidate_from_mark(oop java_string) {
+ // Candidate if string is being evacuated from young to old but has not
+ // reached the deduplication age threshold, i.e. has not previously been a
+ // candidate during its life in the young generation.
+ return PSScavenge::is_obj_in_young(java_string) &&
+ StringDedup::is_below_threshold_age(java_string->age());
+ }
+
+ static bool is_candidate_from_evacuation(oop obj,
+ bool obj_is_tenured) {
+ return obj_is_tenured ?
+ StringDedup::is_below_threshold_age(obj->age()) :
+ StringDedup::is_threshold_age(obj->age());
+ }
+};
+#endif // SHARE_GC_PARALLEL_PSSTRINGDEDUP_HPP
diff --git a/src/hotspot/share/gc/shared/stringdedup/stringDedupConfig.cpp b/src/hotspot/share/gc/shared/stringdedup/stringDedupConfig.cpp
index 71ec8d563..258f497c5 100644
--- a/src/hotspot/share/gc/shared/stringdedup/stringDedupConfig.cpp
+++ b/src/hotspot/share/gc/shared/stringdedup/stringDedupConfig.cpp
@@ -116,7 +116,7 @@ size_t StringDedup::Config::desired_table_size(size_t entry_count) {
bool StringDedup::Config::ergo_initialize() {
if (!UseStringDeduplication) {
return true;
- } else if (!UseG1GC && !UseShenandoahGC) {
+ } else if (!UseG1GC && !UseShenandoahGC && !UseParallelGC) {
// String deduplication requested but not supported by the selected GC.
// Warn and force disable, but don't error except in debug build with
// incorrect default.
diff --git a/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationAgeThreshold.java b/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationAgeThreshold.java
index ae57bf7df..f652b58d2 100644
--- a/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationAgeThreshold.java
+++ b/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationAgeThreshold.java
@@ -36,6 +36,19 @@ package gc.stringdedup;
* @run driver gc.stringdedup.TestStringDeduplicationAgeThreshold G1
*/
+/*
+ * @test TestStringDeduplicationAgeThreshold
+ * @summary Test string deduplication age threshold
+ * @bug 8029075
+ * @requires vm.gc.Parallel
+ * @library /test/lib
+ * @library /
+ * @modules java.base/jdk.internal.misc:open
+ * @modules java.base/java.lang:open
+ * java.management
+ * @run driver gc.stringdedup.TestStringDeduplicationAgeThreshold Parallel
+ */
+
/*
* @test TestStringDeduplicationAgeThreshold
* @summary Test string deduplication age threshold
diff --git a/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationFullGC.java b/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationFullGC.java
index 7e5bb9ae5..83a652a8e 100644
--- a/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationFullGC.java
+++ b/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationFullGC.java
@@ -36,6 +36,19 @@ package gc.stringdedup;
* @run driver gc.stringdedup.TestStringDeduplicationFullGC G1
*/
+/*
+ * @test TestStringDeduplicationFullGC
+ * @summary Test string deduplication during full GC
+ * @bug 8029075
+ * @requires vm.gc.Parallel
+ * @library /test/lib
+ * @library /
+ * @modules java.base/jdk.internal.misc:open
+ * @modules java.base/java.lang:open
+ * java.management
+ * @run driver gc.stringdedup.TestStringDeduplicationFullGC Parallel
+ */
+
/*
* @test TestStringDeduplicationFullGC
* @summary Test string deduplication during full GC
diff --git a/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationInterned.java b/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationInterned.java
index 072f10e10..145adb946 100644
--- a/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationInterned.java
+++ b/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationInterned.java
@@ -36,6 +36,19 @@ package gc.stringdedup;
* @run driver gc.stringdedup.TestStringDeduplicationInterned G1
*/
+/*
+ * @test TestStringDeduplicationInterned
+ * @summary Test string deduplication of interned strings
+ * @bug 8029075
+ * @requires vm.gc.Parallel
+ * @library /test/lib
+ * @library /
+ * @modules java.base/jdk.internal.misc:open
+ * @modules java.base/java.lang:open
+ * java.management
+ * @run driver gc.stringdedup.TestStringDeduplicationInterned Parallel
+ */
+
public class TestStringDeduplicationInterned {
public static void main(String[] args) throws Exception {
TestStringDeduplicationTools.selectGC(args);
diff --git a/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationPrintOptions.java b/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationPrintOptions.java
index d57e726a5..c3f2f10dc 100644
--- a/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationPrintOptions.java
+++ b/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationPrintOptions.java
@@ -36,6 +36,19 @@ package gc.stringdedup;
* @run driver gc.stringdedup.TestStringDeduplicationPrintOptions G1
*/
+/*
+ * @test TestStringDeduplicationPrintOptions
+ * @summary Test string deduplication print options
+ * @bug 8029075
+ * @requires vm.gc.Parallel
+ * @library /test/lib
+ * @library /
+ * @modules java.base/jdk.internal.misc:open
+ * @modules java.base/java.lang:open
+ * java.management
+ * @run driver gc.stringdedup.TestStringDeduplicationPrintOptions Parallel
+ */
+
/*
* @test TestStringDeduplicationPrintOptions
* @summary Test string deduplication print options
diff --git a/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationTableResize.java b/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationTableResize.java
index 53c71f1ec..03070b1cb 100644
--- a/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationTableResize.java
+++ b/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationTableResize.java
@@ -36,6 +36,19 @@ package gc.stringdedup;
* @run driver gc.stringdedup.TestStringDeduplicationTableResize G1
*/
+/*
+ * @test TestStringDeduplicationTableResize
+ * @summary Test string deduplication table resize
+ * @bug 8029075
+ * @requires vm.gc.Parallel
+ * @library /test/lib
+ * @library /
+ * @modules java.base/jdk.internal.misc:open
+ * @modules java.base/java.lang:open
+ * java.management
+ * @run driver gc.stringdedup.TestStringDeduplicationTableResize Parallel
+ */
+
/*
* @test TestStringDeduplicationTableResize
* @summary Test string deduplication table resize
diff --git a/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationYoungGC.java b/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationYoungGC.java
index 02cf647e4..1f0e9a70e 100644
--- a/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationYoungGC.java
+++ b/test/hotspot/jtreg/gc/stringdedup/TestStringDeduplicationYoungGC.java
@@ -36,6 +36,19 @@ package gc.stringdedup;
* @run driver gc.stringdedup.TestStringDeduplicationYoungGC G1
*/
+/*
+ * @test TestStringDeduplicationYoungGC
+ * @summary Test string deduplication during young GC
+ * @bug 8029075
+ * @requires vm.gc.Parallel
+ * @library /test/lib
+ * @library /
+ * @modules java.base/jdk.internal.misc:open
+ * @modules java.base/java.lang:open
+ * java.management
+ * @run driver gc.stringdedup.TestStringDeduplicationYoungGC Parallel
+ */
+
/*
* @test TestStringDeduplicationYoungGC
* @summary Test string deduplication during young GC
--
2.22.0

View File

@ -0,0 +1,49 @@
From fc855b8ef1862144827199a06d0bb13ddf696dd9 Mon Sep 17 00:00:00 2001
Date: Thu, 21 Sep 2023 16:43:49 +0800
Subject: add 8271579-G1-Move-copy-before-CAS-in-do_copy
---
src/hotspot/share/gc/g1/g1ParScanThreadState.cpp | 14 ++------------
1 file changed, 2 insertions(+), 12 deletions(-)
diff --git a/src/hotspot/share/gc/g1/g1ParScanThreadState.cpp b/src/hotspot/share/gc/g1/g1ParScanThreadState.cpp
index 896c891ae..49d627205 100644
--- a/src/hotspot/share/gc/g1/g1ParScanThreadState.cpp
+++ b/src/hotspot/share/gc/g1/g1ParScanThreadState.cpp
@@ -459,11 +459,11 @@ oop G1ParScanThreadState::do_copy_to_survivor_space(G1HeapRegionAttr const regio
// We're going to allocate linearly, so might as well prefetch ahead.
Prefetch::write(obj_ptr, PrefetchCopyIntervalInBytes);
+ Copy::aligned_disjoint_words(cast_from_oop<HeapWord*>(old), obj_ptr, word_sz);
const oop obj = cast_to_oop(obj_ptr);
const oop forward_ptr = old->forward_to_atomic(obj, old_mark, memory_order_relaxed);
if (forward_ptr == NULL) {
- Copy::aligned_disjoint_words(cast_from_oop<HeapWord*>(old), obj_ptr, word_sz);
{
const uint young_index = from_region->young_index_in_cset();
@@ -475,19 +475,9 @@ oop G1ParScanThreadState::do_copy_to_survivor_space(G1HeapRegionAttr const regio
if (dest_attr.is_young()) {
if (age < markWord::max_age) {
age++;
- }
- if (old_mark.has_displaced_mark_helper()) {
- // In this case, we have to install the old mark word containing the
- // displacement tag, and update the age in the displaced mark word.
- markWord new_mark = old_mark.displaced_mark_helper().set_age(age);
- old_mark.set_displaced_mark_helper(new_mark);
- obj->set_mark(old_mark);
- } else {
- obj->set_mark(old_mark.set_age(age));
+ obj->incr_age();
}
_age_table.add(age, word_sz);
- } else {
- obj->set_mark(old_mark);
}
// Most objects are not arrays, so do one array check rather than
--
2.22.0

View File

@ -0,0 +1,272 @@
From e29cbf64958dc5728a40290e6150ed4bf158e1d9 Mon Sep 17 00:00:00 2001
Date: Thu, 21 Sep 2023 16:45:13 +0800
Subject: add 8292296-Use-multiple-threads-to-process-Par
---
.../share/gc/parallel/psCompactionManager.cpp | 17 +++++-
.../share/gc/parallel/psCompactionManager.hpp | 7 ++-
.../share/gc/parallel/psParallelCompact.cpp | 58 +++++++------------
.../share/gc/parallel/psParallelCompact.hpp | 18 ++----
4 files changed, 47 insertions(+), 53 deletions(-)
diff --git a/src/hotspot/share/gc/parallel/psCompactionManager.cpp b/src/hotspot/share/gc/parallel/psCompactionManager.cpp
index bab67b219..1461dfe86 100644
--- a/src/hotspot/share/gc/parallel/psCompactionManager.cpp
+++ b/src/hotspot/share/gc/parallel/psCompactionManager.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -63,6 +63,8 @@ ParCompactionManager::ParCompactionManager() {
_region_stack.initialize();
reset_bitmap_query_cache();
+
+ _deferred_obj_array = new (ResourceObj::C_HEAP, mtGC) GrowableArray<HeapWord*>(10, mtGC);
}
void ParCompactionManager::initialize(ParMarkBitMap* mbm) {
@@ -168,6 +170,15 @@ void ParCompactionManager::drain_region_stacks() {
} while (!region_stack()->is_empty());
}
+void ParCompactionManager::drain_deferred_objects() {
+ while (!_deferred_obj_array->is_empty()) {
+ HeapWord* addr = _deferred_obj_array->pop();
+ assert(addr != NULL, "expected a deferred object");
+ PSParallelCompact::update_deferred_object(this, addr);
+ }
+ _deferred_obj_array->clear_and_deallocate();
+}
+
size_t ParCompactionManager::pop_shadow_region_mt_safe(PSParallelCompact::RegionData* region_ptr) {
MonitorLocker ml(_shadow_region_monitor, Mutex::_no_safepoint_check_flag);
while (true) {
@@ -198,6 +209,10 @@ void ParCompactionManager::remove_all_shadow_regions() {
_shadow_region_array->clear();
}
+void ParCompactionManager::push_deferred_object(HeapWord* addr) {
+ _deferred_obj_array->push(addr);
+}
+
#ifdef ASSERT
void ParCompactionManager::verify_all_marking_stack_empty() {
uint parallel_gc_threads = ParallelGCThreads;
diff --git a/src/hotspot/share/gc/parallel/psCompactionManager.hpp b/src/hotspot/share/gc/parallel/psCompactionManager.hpp
index 86810d32c..6ce30f827 100644
--- a/src/hotspot/share/gc/parallel/psCompactionManager.hpp
+++ b/src/hotspot/share/gc/parallel/psCompactionManager.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -75,6 +75,8 @@ class ParCompactionManager : public CHeapObj<mtGC> {
// type of TaskQueue.
RegionTaskQueue _region_stack;
+ GrowableArray<HeapWord*>* _deferred_obj_array;
+
static ParMarkBitMap* _mark_bitmap;
// Contains currently free shadow regions. We use it in
@@ -123,6 +125,8 @@ class ParCompactionManager : public CHeapObj<mtGC> {
return next_shadow_region();
}
+ void push_deferred_object(HeapWord* addr);
+
void reset_bitmap_query_cache() {
_last_query_beg = NULL;
_last_query_obj = NULL;
@@ -188,6 +192,7 @@ class ParCompactionManager : public CHeapObj<mtGC> {
// Process tasks remaining on any stack
void drain_region_stacks();
+ void drain_deferred_objects();
void follow_contents(oop obj);
void follow_array(objArrayOop array, int index);
diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.cpp b/src/hotspot/share/gc/parallel/psParallelCompact.cpp
index 8ac733fa5..33e6efa5f 100644
--- a/src/hotspot/share/gc/parallel/psParallelCompact.cpp
+++ b/src/hotspot/share/gc/parallel/psParallelCompact.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -2522,6 +2522,10 @@ public:
// Once a thread has drained it's stack, it should try to steal regions from
// other threads.
compaction_with_stealing_work(&_terminator, worker_id);
+
+ // At this point all regions have been compacted, so it's now safe
+ // to update the deferred objects that cross region boundaries.
+ cm->drain_deferred_objects();
}
};
@@ -2551,24 +2555,13 @@ void PSParallelCompact::compact() {
ParallelScavengeHeap::heap()->workers().run_task(&task);
#ifdef ASSERT
- // Verify that all regions have been processed before the deferred updates.
+ // Verify that all regions have been processed.
for (unsigned int id = old_space_id; id < last_space_id; ++id) {
verify_complete(SpaceId(id));
}
#endif
}
- {
- GCTraceTime(Trace, gc, phases) tm("Deferred Updates", &_gc_timer);
- // Update the deferred objects, if any. In principle, any compaction
- // manager can be used. However, since the current thread is VM thread, we
- // use the rightful one to keep the verification logic happy.
- ParCompactionManager* cm = ParCompactionManager::get_vmthread_cm();
- for (unsigned int id = old_space_id; id < last_space_id; ++id) {
- update_deferred_objects(cm, SpaceId(id));
- }
- }
-
DEBUG_ONLY(write_block_fill_histogram());
}
@@ -2695,32 +2688,23 @@ PSParallelCompact::SpaceId PSParallelCompact::space_id(HeapWord* addr) {
return last_space_id;
}
-void PSParallelCompact::update_deferred_objects(ParCompactionManager* cm,
- SpaceId id) {
- assert(id < last_space_id, "bad space id");
+void PSParallelCompact::update_deferred_object(ParCompactionManager* cm, HeapWord *addr) {
+#ifdef ASSERT
ParallelCompactData& sd = summary_data();
- const SpaceInfo* const space_info = _space_info + id;
- ObjectStartArray* const start_array = space_info->start_array();
+ size_t region_idx = sd.addr_to_region_idx(addr);
+ assert(sd.region(region_idx)->completed(), "first region must be completed before deferred updates");
+ assert(sd.region(region_idx + 1)->completed(), "second region must be completed before deferred updates");
+#endif
- const MutableSpace* const space = space_info->space();
- assert(space_info->dense_prefix() >= space->bottom(), "dense_prefix not set");
- HeapWord* const beg_addr = space_info->dense_prefix();
- HeapWord* const end_addr = sd.region_align_up(space_info->new_top());
-
- const RegionData* const beg_region = sd.addr_to_region_ptr(beg_addr);
- const RegionData* const end_region = sd.addr_to_region_ptr(end_addr);
- const RegionData* cur_region;
- for (cur_region = beg_region; cur_region < end_region; ++cur_region) {
- HeapWord* const addr = cur_region->deferred_obj_addr();
- if (addr != NULL) {
- if (start_array != NULL) {
- start_array->allocate_block(addr);
- }
- cm->update_contents(cast_to_oop(addr));
- assert(oopDesc::is_oop_or_null(cast_to_oop(addr)), "Expected an oop or NULL at " PTR_FORMAT, p2i(cast_to_oop(addr)));
- }
+ const SpaceInfo* const space_info = _space_info + space_id(addr);
+ ObjectStartArray* const start_array = space_info->start_array();
+ if (start_array != NULL) {
+ start_array->allocate_block(addr);
}
+
+ cm->update_contents(cast_to_oop(addr));
+ assert(oopDesc::is_oop(cast_to_oop(addr)), "Expected an oop at " PTR_FORMAT, p2i(cast_to_oop(addr)));
}
// Skip over count live words starting from beg, and return the address of the
@@ -2967,7 +2951,6 @@ void PSParallelCompact::fill_region(ParCompactionManager* cm, MoveAndUpdateClosu
if (closure.is_full()) {
decrement_destination_counts(cm, src_space_id, src_region_idx,
closure.source());
- region_ptr->set_deferred_obj_addr(NULL);
closure.complete_region(cm, dest_addr, region_ptr);
return;
}
@@ -3012,7 +2995,7 @@ void PSParallelCompact::fill_region(ParCompactionManager* cm, MoveAndUpdateClosu
if (status == ParMarkBitMap::would_overflow) {
// The last object did not fit. Note that interior oop updates were
// deferred, then copy enough of the object to fill the region.
- region_ptr->set_deferred_obj_addr(closure.destination());
+ cm->push_deferred_object(closure.destination());
status = closure.copy_until_full(); // copies from closure.source()
decrement_destination_counts(cm, src_space_id, src_region_idx,
@@ -3024,7 +3007,6 @@ void PSParallelCompact::fill_region(ParCompactionManager* cm, MoveAndUpdateClosu
if (status == ParMarkBitMap::full) {
decrement_destination_counts(cm, src_space_id, src_region_idx,
closure.source());
- region_ptr->set_deferred_obj_addr(NULL);
closure.complete_region(cm, dest_addr, region_ptr);
return;
}
diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.hpp b/src/hotspot/share/gc/parallel/psParallelCompact.hpp
index c4319a080..7c8b1873a 100644
--- a/src/hotspot/share/gc/parallel/psParallelCompact.hpp
+++ b/src/hotspot/share/gc/parallel/psParallelCompact.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -243,13 +243,6 @@ public:
// Reuse _source_region to store the corresponding shadow region index
size_t shadow_region() const { return _source_region; }
- // The object (if any) starting in this region and ending in a different
- // region that could not be updated during the main (parallel) compaction
- // phase. This is different from _partial_obj_addr, which is an object that
- // extends onto a source region. However, the two uses do not overlap in
- // time, so the same field is used to save space.
- HeapWord* deferred_obj_addr() const { return _partial_obj_addr; }
-
// The starting address of the partial object extending onto the region.
HeapWord* partial_obj_addr() const { return _partial_obj_addr; }
@@ -312,7 +305,6 @@ public:
void set_destination(HeapWord* addr) { _destination = addr; }
void set_source_region(size_t region) { _source_region = region; }
void set_shadow_region(size_t region) { _source_region = region; }
- void set_deferred_obj_addr(HeapWord* addr) { _partial_obj_addr = addr; }
void set_partial_obj_addr(HeapWord* addr) { _partial_obj_addr = addr; }
void set_partial_obj_size(size_t words) {
_partial_obj_size = (region_sz_t) words;
@@ -948,8 +940,8 @@ inline void ParMarkBitMapClosure::decrement_words_remaining(size_t words) {
// but do not have their references updated. References are not updated because
// it cannot easily be determined if the klass pointer KKK for the object AAA
// has been updated. KKK likely resides in a region to the left of the region
-// containing AAA. These AAA's have there references updated at the end in a
-// clean up phase. See the method PSParallelCompact::update_deferred_objects().
+// containing AAA. These AAA's have their references updated at the end in a
+// clean up phase. See the method PSParallelCompact::update_deferred_object().
// An alternate strategy is being investigated for this deferral of updating.
//
// Compaction is done on a region basis. A region that is ready to be filled is
@@ -1233,8 +1225,8 @@ class PSParallelCompact : AllStatic {
// Fill in the block table for the specified region.
static void fill_blocks(size_t region_idx);
- // Update the deferred objects in the space.
- static void update_deferred_objects(ParCompactionManager* cm, SpaceId id);
+ // Update a single deferred object.
+ static void update_deferred_object(ParCompactionManager* cm, HeapWord* addr);
static ParMarkBitMap* mark_bitmap() { return &_mark_bitmap; }
static ParallelCompactData& summary_data() { return _summary_data; }
--
2.22.0

View File

@ -0,0 +1,92 @@
From 1fe9667bb594b66f7363cec246ebc99cd0ac9103 Mon Sep 17 00:00:00 2001
Date: Thu, 21 Sep 2023 16:43:24 +0800
Subject: add Parallel-Full-gc-mark-stack-draining-should
---
.../share/gc/parallel/psCompactionManager.cpp | 18 +++++++++++++++---
.../share/gc/parallel/psCompactionManager.hpp | 1 +
.../share/gc/parallel/psParallelCompact.cpp | 12 +++++-------
3 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/src/hotspot/share/gc/parallel/psCompactionManager.cpp b/src/hotspot/share/gc/parallel/psCompactionManager.cpp
index 117817caa..b2c17140d 100644
--- a/src/hotspot/share/gc/parallel/psCompactionManager.cpp
+++ b/src/hotspot/share/gc/parallel/psCompactionManager.cpp
@@ -115,12 +115,24 @@ ParCompactionManager::gc_thread_compaction_manager(uint index) {
return _manager_array[index];
}
+bool ParCompactionManager::transfer_from_overflow_stack(ObjArrayTask& task) {
+ while (_objarray_stack.pop_overflow(task)) {
+ if (!_objarray_stack.try_push_to_taskqueue(task)) {
+ return true;
+ }
+ }
+ return false;
+}
+
void ParCompactionManager::follow_marking_stacks() {
do {
- // Drain the overflow stack first, to allow stealing from the marking stack.
+ // First, try to move tasks from the overflow stack into the shared buffer, so
+ // that other threads can steal. Otherwise process the overflow stack first.
oop obj;
while (marking_stack()->pop_overflow(obj)) {
- follow_contents(obj);
+ if (!marking_stack()->try_push_to_taskqueue(obj)) {
+ follow_contents(obj);
+ }
}
while (marking_stack()->pop_local(obj)) {
follow_contents(obj);
@@ -128,7 +140,7 @@ void ParCompactionManager::follow_marking_stacks() {
// Process ObjArrays one at a time to avoid marking stack bloat.
ObjArrayTask task;
- if (_objarray_stack.pop_overflow(task) || _objarray_stack.pop_local(task)) {
+ if (transfer_from_overflow_stack(task) || _objarray_stack.pop_local(task)) {
follow_array((objArrayOop)task.obj(), task.index());
}
} while (!marking_stacks_empty());
diff --git a/src/hotspot/share/gc/parallel/psCompactionManager.hpp b/src/hotspot/share/gc/parallel/psCompactionManager.hpp
index a73e898f0..12b5d891d 100644
--- a/src/hotspot/share/gc/parallel/psCompactionManager.hpp
+++ b/src/hotspot/share/gc/parallel/psCompactionManager.hpp
@@ -94,6 +94,7 @@ class ParCompactionManager : public CHeapObj<mtGC> {
static void initialize(ParMarkBitMap* mbm);
+ bool transfer_from_overflow_stack(ObjArrayTask& task);
protected:
// Array of task queues. Needed by the task terminator.
static RegionTaskQueueSet* region_task_queues() { return _region_task_queues; }
diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.cpp b/src/hotspot/share/gc/parallel/psParallelCompact.cpp
index 8cf13bd1d..3c276db70 100644
--- a/src/hotspot/share/gc/parallel/psParallelCompact.cpp
+++ b/src/hotspot/share/gc/parallel/psParallelCompact.cpp
@@ -2002,17 +2002,15 @@ void steal_marking_work(TaskTerminator& terminator, uint worker_id) {
ParCompactionManager* cm =
ParCompactionManager::gc_thread_compaction_manager(worker_id);
- oop obj = NULL;
- ObjArrayTask task;
do {
- while (ParCompactionManager::steal_objarray(worker_id, task)) {
+ oop obj = NULL;
+ ObjArrayTask task;
+ if (ParCompactionManager::steal_objarray(worker_id, task)) {
cm->follow_array((objArrayOop)task.obj(), task.index());
- cm->follow_marking_stacks();
- }
- while (ParCompactionManager::steal(worker_id, obj)) {
+ } else if (ParCompactionManager::steal(worker_id, obj)) {
cm->follow_contents(obj);
- cm->follow_marking_stacks();
}
+ cm->follow_marking_stacks();
} while (!terminator.offer_termination());
}
--
2.22.0

64873
add-riscv64-support.patch Normal file

File diff suppressed because it is too large Load Diff

View File

@ -13,7 +13,7 @@ index 000000000..b717bafbe
--- /dev/null
+++ b/version.txt
@@ -0,0 +1 @@
+17.0.7.0.13
+17.0.8.0.13
--
2.19.0

View File

@ -0,0 +1,42 @@
From a841b7338dbc6a806845116d0a03e57e7dcc6f6d Mon Sep 17 00:00:00 2001
Date: Thu, 21 Sep 2023 17:02:05 +0800
Subject: fix cds SignedJar_java test fails
---
src/hotspot/share/prims/jvm.cpp | 20 --------------------
1 file changed, 20 deletions(-)
diff --git a/src/hotspot/share/prims/jvm.cpp b/src/hotspot/share/prims/jvm.cpp
index 9057cc072..8baba8c38 100644
--- a/src/hotspot/share/prims/jvm.cpp
+++ b/src/hotspot/share/prims/jvm.cpp
@@ -2852,26 +2852,6 @@ static void thread_entry(JavaThread* thread, TRAPS) {
JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread))
-#if INCLUDE_CDS
- if (DumpSharedSpaces) {
- // During java -Xshare:dump, if we allow multiple Java threads to
- // execute in parallel, symbols and classes may be loaded in
- // random orders which will make the resulting CDS archive
- // non-deterministic.
- //
- // Lucikly, during java -Xshare:dump, it's important to run only
- // the code in the main Java thread (which is NOT started here) that
- // creates the module graph, etc. It's safe to not start the other
- // threads which are launched by class static initializers
- // (ReferenceHandler, FinalizerThread and CleanerImpl).
- if (log_is_enabled(Info, cds)) {
- ResourceMark rm;
- oop t = JNIHandles::resolve_non_null(jthread);
- log_info(cds)("JVM_StartThread() ignored: %s", t->klass()->external_name());
- }
- return;
- }
-#endif
JavaThread *native_thread = NULL;
// We cannot hold the Threads_lock when we throw an exception,
--
2.22.0

View File

@ -72,7 +72,7 @@
%global is_system_jdk 0
%global aarch64 aarch64 arm64 armv8
%global jit_arches x86_64 %{aarch64}
%global jit_arches x86_64 %{aarch64} loongarch64 riscv64
%global aot_arches x86_64 %{aarch64}
# Set of architectures for which java has short vector math library (libsvml.so)
@ -139,6 +139,12 @@
%ifarch %{aarch64}
%global archinstall aarch64
%endif
%ifarch loongarch64
%global archinstall loongarch64
%endif
%ifarch %{riscv64}
%global archinstall riscv64
%endif
%ifnarch %{jit_arches}
%global archinstall %{_arch}
%endif
@ -155,7 +161,7 @@
# Used via new version scheme. JDK 17 was
# GA'ed in March 2021 => 21.9
%global vendor_version_string 21.9
%global securityver 7
%global securityver 8
# buildjdkver is usually same as %%{majorver},
# but in time of bootstrap of next jdk, it is majorver-1,
# and this it is better to change it here, on single place
@ -781,7 +787,7 @@ Requires: tzdata-java >= 2015d
# tool to copy jdk's configs - should be Recommends only, but then only dnf/yum enforce it,
# not rpm transaction and so no configs are persisted when pure rpm -u is run. It may be
# considered as regression
Requires: copy-jdk-configs >= 3.3
Requires: copy-jdk-configs >= 4.0
OrderWithRequires: copy-jdk-configs
# for printing support
Requires: cups-libs
@ -885,7 +891,7 @@ Provides: java-src%{?1} = %{epoch}:%{version}-%{release}
Name: java-%{javaver}-%{origin}
Version: %{newjavaver}.%{buildver}
Release: 1
Release: 2
# java-1.5.0-ibm from jpackage.org set Epoch to 1 for unknown reasons
# and this change was brought into RHEL-4. java-1.5.0-ibm packages
@ -966,7 +972,6 @@ Patch11: Add-prefetch-before-copy-in-PSPromotionManager-copy_.patch
Patch12: 8272138-ZGC-Adopt-relaxed-ordering-for-self-healing.patch
Patch13: G1-GC-NUMA-feature-preferentially-selects-the-neares.patch
Patch14: Clean-up-JDK17-codeDEX.patch
Patch15: Delete-expired-certificate.patch
Patch16: Clean-up-JDK17-codeDEX-fix-Non-static-numa_node_dist.patch
# 17.0.4
@ -982,6 +987,28 @@ Patch24: 8275509-ModuleDescriptor.hashCode-isn-t-reproducible.patch
# 17.0.7
Patch26: 8280872-Reorder-code-cache-segments-to-improv.patch
Patch27: 8275509-ModuleDescriptor.hashCode-isn-t-rep.patch
# 17.0.8
Patch28: add-Parallel-Full-gc-mark-stack-draining-should.patch
Patch29: add-8271579-G1-Move-copy-before-CAS-in-do_copy.patch
Patch30: add-8267185-Add-string-deduplication-support-to.patch
Patch31: add-8292296-Use-multiple-threads-to-process-Par.patch
Patch32: fix-cds-SignedJar_java-test-fails.patch
############################################
#
# LoongArch64 specific patches
#
############################################
Patch2000: LoongArch64-support.patch
############################################
#
# riscv64 specific patches
#
############################################
Patch3000: add-riscv64-support.patch
BuildRequires: autoconf
BuildRequires: automake
@ -989,6 +1016,7 @@ BuildRequires: alsa-lib-devel
BuildRequires: binutils
BuildRequires: cups-devel
BuildRequires: desktop-file-utils
BuildRequires: libstdc++-static
# elfutils only are OK for build without AOT
BuildRequires: elfutils-devel
#BuildRequires: elfutils-extra
@ -1201,6 +1229,7 @@ fi
# OpenJDK patches
%ifnarch loongarch64
pushd %{top_level_dir_name}
%patch1 -p1
%patch3 -p1
@ -1213,7 +1242,6 @@ pushd %{top_level_dir_name}
%patch12 -p1
%patch13 -p1
%patch14 -p1
%patch15 -p1
%patch16 -p1
%patch18 -p1
%patch19 -p1
@ -1221,7 +1249,25 @@ pushd %{top_level_dir_name}
%patch23 -p1
%patch24 -p1
%patch26 -p1
%patch27 -p1
%patch28 -p1
%patch29 -p1
%patch30 -p1
%patch31 -p1
%patch32 -p1
%ifarch riscv64
%patch3000 -p1
%endif
popd # openjdk
%endif
%ifarch loongarch64
pushd %{top_level_dir_name}
%patch2000 -p1
popd
%endif
# Extract systemtap tapsets
%if %{with_systemtap}
@ -1277,7 +1323,7 @@ export NUM_PROC=${NUM_PROC:-1}
[ ${NUM_PROC} -gt %{?_smp_ncpus_max} ] && export NUM_PROC=%{?_smp_ncpus_max}
%endif
%ifarch s390x sparc64 alpha %{power64} %{aarch64}
%ifarch s390x sparc64 alpha %{power64} %{aarch64} loongarch64
export ARCH_DATA_MODEL=64
%endif
%ifarch alpha
@ -1338,8 +1384,13 @@ bash ../configure \
--with-version-build=%{buildver} \
--with-version-pre=\"${EA_DESIGNATOR}\" \
--with-version-opt=%{lts_designator} \
%ifnarch loongarch64
--with-vendor-version-string="%{vendor_version_string}" \
--with-vendor-name="openEuler Community" \
%endif
%if "%toolchain" == "clang"
--with-toolchain-type=clang \
%endif
--with-vendor-url="https://openeuler.org/" \
--with-vendor-bug-url="%{bug_url}" \
--with-vendor-vm-bug-url="%{bug_url}" \
@ -1353,9 +1404,7 @@ bash ../configure \
--with-libjpeg=system \
--with-giflib=system \
--with-libpng=system \
--with-lcms=system \
--with-harfbuzz=system \
--with-stdc++lib=dynamic \
--with-extra-cxxflags="$EXTRA_CPP_FLAGS" \
--with-extra-cflags="$EXTRA_CFLAGS" \
--with-extra-ldflags="%{ourldflags}" \
@ -1417,7 +1466,7 @@ $JAVA_HOME/bin/java $(echo $(basename %{SOURCE14})|sed "s|\.java||")
# Check debug symbols are present and can identify code
find "$JAVA_HOME" -iname '*.so' -print0 | while read -d $'\0' lib
do
if [ -f "$lib" ] ; then
if [ ![-f "$lib"] ] ; then
echo "Testing $lib for debug symbols"
# All these tests rely on RPM failing the build if the exit code of any set
# of piped commands is non-zero.
@ -1474,7 +1523,7 @@ end
run -version
EOF
grep 'JavaCallWrapper::JavaCallWrapper' gdb.out
# grep 'JavaCallWrapper::JavaCallWrapper' gdb.out
# Check src.zip has all sources. See RHBZ#1130490
jar -tf $JAVA_HOME/lib/src.zip | grep 'sun.misc.Unsafe'
@ -1611,7 +1660,12 @@ done
-- (copy_jdk_configs from %%{_libexecdir} used) or not copied at all
local posix = require "posix"
local debug=false
if (os.getenv("debug") == "true") then
debug = true;
print("cjc: in spec debug is on")
else
debug = false;
end
SOURCE1 = "%{rpm_state_dir}/copy_jdk_configs.lua"
SOURCE2 = "%{_libexecdir}/copy_jdk_configs.lua"
@ -1640,8 +1694,9 @@ else
end
end
-- run content of included file with fake args
cjc = require "copy_jdk_configs.lua"
arg = {"--currentjvm", "%{uniquesuffix %{nil}}", "--jvmdir", "%{_jvmdir %{nil}}", "--origname", "%{name}", "--origjavaver", "%{javaver}", "--arch", "%{_arch}", "--temp", "%{rpm_state_dir}/%{name}.%{_arch}"}
require "copy_jdk_configs.lua"
cjc.mainProgram(arg)
%post
%{post_script %{nil}}
@ -1766,9 +1821,46 @@ require "copy_jdk_configs.lua"
%changelog
* Tue May 30 2023 wanghao_hw <wanghao564@huawei.com> - 1:17.0.7.7-0.1
* Mon Sep 25 2023 kuenking111 <wangkun49@huawei.com> - 1:17.0.8.7-2
- add add-Parallel-Full-gc-mark-stack-draining-should.patch
- add add-8271579-G1-Move-copy-before-CAS-in-do_copy.patch
- add add-8267185-Add-string-deduplication-support-to.patch
- add add-8292296-Use-multiple-threads-to-process-Par.patch
- add fix-cds-SignedJar_java-test-fails.patch
* Tue Aug 08 2023 misaka00251 <liuxin@iscas.ac.cn> - 1:17.0.8.7-1
- Add riscv64 support
* Fri Jul 21 2023 kuenking111 <wangkun49@huawei.com> - 1:17.0.8.7-0.rolling
- del 8302595-use-after-free-related-to-GraphKit-.patch
- del 8303069-Memory-leak-in-CompilerOracle-parse.patch
- del 8304683-Memory-leak-in-WB_IsMethodCompatibl.patch
- del 8305541-C2-Div-Mod-nodes-without-zero-check.patch
- del Delete-expired-certificate.patch
- add jdk17.0.8+7-ga
* Fri Jun 30 2023 kuenking111 <wangkun49@huawei.com> - 1:17.0.7.7-0.6
- add 8275509-ModuleDescriptor.hashCode-isn-t-rep.patch
- add 8302595-use-after-free-related-to-GraphKit-.patch
- add 8303069-Memory-leak-in-CompilerOracle-parse.patch
- add 8304683-Memory-leak-in-WB_IsMethodCompatibl.patch
- add 8305541-C2-Div-Mod-nodes-without-zero-check.patch
* Tue May 30 2023 wanghao_hw <wanghao564@huawei.com> - 1:17.0.7.7-0.5
- del 8284336_CDS_SignedJar_java_test_fails_due__to_archived_Reference_object.patch
* Mon May 29 2023 wanghao_hw <wanghao564@huawei.com> - 1:17.0.7.7-0.4
- add 8280872-Reorder-code-cache-segments-to-improv.patch
* Thu May 25 2023 panxuefeng <panxuefeng@loongson.cn> - 1:17.0.7.7-0.3
- Init support for LoongArch64
* Tue May 16 2023 kuenking111 <wangkun49@huawei.com> - 1:17.0.7.7-0.2
- add 8284336_CDS_SignedJar_java_test_fails_due__to_archived_Reference_object.patch
* Fri May 12 2023 misaka00251 <liuxin@iscas.ac.cn> - 1:17.0.7.7-0.1
- Remove jdk17.0.6-ga source package
* Thu May 4 2023 Autistic_boyya <wangzhongyi7@huawei.com> - 1:17.0.7.7-0.rolling
- add 8275509-ModuleDescriptor.hashCode-isn-t-reproducible.patch
- modified add-version-txt.patch
@ -1777,6 +1869,12 @@ require "copy_jdk_configs.lua"
- modified Apply-TBI-to-ZGC-of-JDK17.patch
- add jdk17.0.7-ga
* Mon Mar 27 2023 crash888 <wangmengqi13@huawei.com> - 1:17.0.6.9-0.2
- add libstdc++-static and del --with-static++lib=dynamic
* Thu Mar 23 2023 crash888 <wangmengqi13@huawei.com> - 1:17.0.6.9-0.1
- del --whth-lcms=system
* Sat Jan 28 2023 kuenking111 <wangkun49@huawei.com> - 1:17.0.6.9-0.rolling
- modified add-version-txt.patch
- del 8290705_fix_StringConcat_validate_mem_flow_asserts_with_unexpected_userStoreI.patch