OpenJDK / jdk / jdk
changeset 58703:142c56cfa14a
8242273: Shenandoah: accept either SATB or IU barriers, but not both
Reviewed-by: rkennke
line wrap: on
line diff
--- a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAggressiveHeuristics.cpp Tue Apr 07 13:18:46 2020 +0200 +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAggressiveHeuristics.cpp Tue Apr 07 13:18:47 2020 +0200 @@ -43,12 +43,6 @@ if (ClassUnloading) { SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahUnloadClassesFrequency, 1); } - - // Final configuration checks - SHENANDOAH_CHECK_FLAG_SET(ShenandoahLoadRefBarrier); - SHENANDOAH_CHECK_FLAG_SET(ShenandoahSATBBarrier || ShenandoahStoreValEnqueueBarrier); - SHENANDOAH_CHECK_FLAG_SET(ShenandoahCASBarrier); - SHENANDOAH_CHECK_FLAG_SET(ShenandoahCloneBarrier); } void ShenandoahAggressiveHeuristics::choose_collection_set_from_regiondata(ShenandoahCollectionSet* cset,
--- a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahCompactHeuristics.cpp Tue Apr 07 13:18:46 2020 +0200 +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahCompactHeuristics.cpp Tue Apr 07 13:18:47 2020 +0200 @@ -41,12 +41,6 @@ SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahUncommitDelay, 1000); SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahGuaranteedGCInterval, 30000); SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahGarbageThreshold, 10); - - // Final configuration checks - SHENANDOAH_CHECK_FLAG_SET(ShenandoahLoadRefBarrier); - SHENANDOAH_CHECK_FLAG_SET(ShenandoahSATBBarrier || ShenandoahStoreValEnqueueBarrier); - SHENANDOAH_CHECK_FLAG_SET(ShenandoahCASBarrier); - SHENANDOAH_CHECK_FLAG_SET(ShenandoahCloneBarrier); } bool ShenandoahCompactHeuristics::should_start_gc() const {
--- a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahStaticHeuristics.cpp Tue Apr 07 13:18:46 2020 +0200 +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahStaticHeuristics.cpp Tue Apr 07 13:18:47 2020 +0200 @@ -34,12 +34,6 @@ ShenandoahStaticHeuristics::ShenandoahStaticHeuristics() : ShenandoahHeuristics() { SHENANDOAH_ERGO_ENABLE_FLAG(ExplicitGCInvokesConcurrent); SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahImplicitGCInvokesConcurrent); - - // Final configuration checks - SHENANDOAH_CHECK_FLAG_SET(ShenandoahLoadRefBarrier); - SHENANDOAH_CHECK_FLAG_SET(ShenandoahSATBBarrier || ShenandoahStoreValEnqueueBarrier); - SHENANDOAH_CHECK_FLAG_SET(ShenandoahCASBarrier); - SHENANDOAH_CHECK_FLAG_SET(ShenandoahCloneBarrier); } ShenandoahStaticHeuristics::~ShenandoahStaticHeuristics() {}
--- a/src/hotspot/share/gc/shenandoah/shenandoahHeuristics.hpp Tue Apr 07 13:18:46 2020 +0200 +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeuristics.hpp Tue Apr 07 13:18:47 2020 +0200 @@ -55,14 +55,6 @@ } \ } while (0) -#define SHENANDOAH_CHECK_FLAG_SET(name) \ - do { \ - if (!(name)) { \ - err_msg message("Heuristics needs -XX:+" #name " to work correctly"); \ - vm_exit_during_initialization("Error", message); \ - } \ - } while (0) - class ShenandoahCollectionSet; class ShenandoahHeapRegion;
--- a/src/hotspot/share/gc/shenandoah/shenandoahIUMode.cpp Tue Apr 07 13:18:46 2020 +0200 +++ b/src/hotspot/share/gc/shenandoah/shenandoahIUMode.cpp Tue Apr 07 13:18:47 2020 +0200 @@ -38,14 +38,19 @@ FLAG_SET_DEFAULT(VerifyBeforeExit, false); } - FLAG_SET_DEFAULT(ShenandoahStoreValEnqueueBarrier, true); - FLAG_SET_DEFAULT(ShenandoahSATBBarrier, false); + if (FLAG_IS_DEFAULT(ShenandoahStoreValEnqueueBarrier)) { + FLAG_SET_DEFAULT(ShenandoahStoreValEnqueueBarrier, true); + } + if (FLAG_IS_DEFAULT(ShenandoahSATBBarrier)) { + FLAG_SET_DEFAULT(ShenandoahSATBBarrier, false); + } SHENANDOAH_ERGO_ENABLE_FLAG(ExplicitGCInvokesConcurrent); SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahImplicitGCInvokesConcurrent); // Final configuration checks SHENANDOAH_CHECK_FLAG_SET(ShenandoahLoadRefBarrier); + SHENANDOAH_CHECK_FLAG_UNSET(ShenandoahSATBBarrier); SHENANDOAH_CHECK_FLAG_SET(ShenandoahStoreValEnqueueBarrier); SHENANDOAH_CHECK_FLAG_SET(ShenandoahCASBarrier); SHENANDOAH_CHECK_FLAG_SET(ShenandoahCloneBarrier);
--- a/src/hotspot/share/gc/shenandoah/shenandoahMode.hpp Tue Apr 07 13:18:46 2020 +0200 +++ b/src/hotspot/share/gc/shenandoah/shenandoahMode.hpp Tue Apr 07 13:18:47 2020 +0200 @@ -29,6 +29,22 @@ class ShenandoahHeuristics; +#define SHENANDOAH_CHECK_FLAG_SET(name) \ + do { \ + if (!(name)) { \ + err_msg message("GC mode needs -XX:+" #name " to work correctly"); \ + vm_exit_during_initialization("Error", message); \ + } \ + } while (0) + +#define SHENANDOAH_CHECK_FLAG_UNSET(name) \ + do { \ + if ((name)) { \ + err_msg message("GC mode needs -XX:-" #name " to work correctly"); \ + vm_exit_during_initialization("Error", message); \ + } \ + } while (0) + class ShenandoahMode : public CHeapObj<mtGC> { public: virtual void initialize_flags() const = 0;
--- a/src/hotspot/share/gc/shenandoah/shenandoahNormalMode.cpp Tue Apr 07 13:18:46 2020 +0200 +++ b/src/hotspot/share/gc/shenandoah/shenandoahNormalMode.cpp Tue Apr 07 13:18:47 2020 +0200 @@ -43,6 +43,7 @@ // Final configuration checks SHENANDOAH_CHECK_FLAG_SET(ShenandoahLoadRefBarrier); + SHENANDOAH_CHECK_FLAG_UNSET(ShenandoahStoreValEnqueueBarrier); SHENANDOAH_CHECK_FLAG_SET(ShenandoahSATBBarrier); SHENANDOAH_CHECK_FLAG_SET(ShenandoahCASBarrier); SHENANDOAH_CHECK_FLAG_SET(ShenandoahCloneBarrier);
--- a/test/hotspot/jtreg/gc/shenandoah/options/TestWrongBarrierDisable.java Tue Apr 07 13:18:46 2020 +0200 +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestWrongBarrierDisable.java Tue Apr 07 13:18:47 2020 +0200 @@ -46,6 +46,7 @@ }; String[] iu = { "ShenandoahLoadRefBarrier", + "ShenandoahStoreValEnqueueBarrier", "ShenandoahCASBarrier", "ShenandoahCloneBarrier", }; @@ -71,7 +72,7 @@ ); OutputAnalyzer output = new OutputAnalyzer(pb.start()); output.shouldNotHaveExitValue(0); - output.shouldContain("Heuristics needs "); + output.shouldContain("GC mode needs "); output.shouldContain("to work correctly"); } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestWrongBarrierEnable.java Tue Apr 07 13:18:47 2020 +0200 @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2020, Red Hat, Inc. 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 TestWrongBarrierEnable + * @summary Test that disabling wrong barriers fails early + * @key gc + * @requires vm.gc.Shenandoah & !vm.graal.enabled + * @library /test/lib + * @run main/othervm TestWrongBarrierEnable + */ + +import java.util.*; + +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class TestWrongBarrierEnable { + + public static void main(String[] args) throws Exception { + String[] concurrent = { + "ShenandoahStoreValEnqueueBarrier", + }; + String[] iu = { + "ShenandoahSATBBarrier", + }; + + shouldFailAll("-XX:ShenandoahGCHeuristics=adaptive", concurrent); + shouldFailAll("-XX:ShenandoahGCHeuristics=static", concurrent); + shouldFailAll("-XX:ShenandoahGCHeuristics=compact", concurrent); + shouldFailAll("-XX:ShenandoahGCHeuristics=aggressive", concurrent); + shouldFailAll("-XX:ShenandoahGCMode=iu", iu); + shouldPassAll("-XX:ShenandoahGCMode=passive", concurrent); + shouldPassAll("-XX:ShenandoahGCMode=passive", iu); + } + + private static void shouldFailAll(String h, String[] barriers) throws Exception { + for (String b : barriers) { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-XX:+UnlockDiagnosticVMOptions", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + h, + "-XX:+" + b, + "-version" + ); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldNotHaveExitValue(0); + output.shouldContain("GC mode needs "); + output.shouldContain("to work correctly"); + } + } + + private static void shouldPassAll(String h, String[] barriers) throws Exception { + for (String b : barriers) { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-XX:+UnlockDiagnosticVMOptions", + "-XX:+UnlockExperimentalVMOptions", + "-XX:+UseShenandoahGC", + h, + "-XX:+" + b, + "-version" + ); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + } + } + +}