# HG changeset patch # User jmasa # Date 1464193700 25200 # Wed May 25 09:28:20 2016 -0700 # Node ID 74a4df91a40066470f8e9ccb92780138a268dff5 # Parent 0b039611894c4944a01941ca8627770d073ad03e 8157620: Guarantee in run_task(task, num_workers) fails Reviewed-by: diff --git a/src/share/vm/gc/g1/g1ConcurrentMark.cpp b/src/share/vm/gc/g1/g1ConcurrentMark.cpp --- a/src/share/vm/gc/g1/g1ConcurrentMark.cpp +++ b/src/share/vm/gc/g1/g1ConcurrentMark.cpp @@ -982,6 +982,7 @@ root_regions()->num_root_regions()); assert(parallel_marking_threads() <= max_parallel_marking_threads(), "Maximum number of marking threads exceeded"); + _parallel_workers->add_workers(_parallel_marking_threads, false); G1CMRootRegionScanTask task(this); log_debug(gc, ergo)("Running %s using %u workers for %u work units.", diff --git a/src/share/vm/gc/shared/workgroup.cpp b/src/share/vm/gc/shared/workgroup.cpp --- a/src/share/vm/gc/shared/workgroup.cpp +++ b/src/share/vm/gc/shared/workgroup.cpp @@ -60,6 +60,10 @@ } void AbstractWorkGang::add_workers(bool initializing) { + add_workers(_active_workers, initializing); +} + +void AbstractWorkGang::add_workers(uint active_workers, bool initializing) { os::ThreadType worker_type; if (are_ConcurrentGC_threads()) { @@ -69,7 +73,7 @@ } _created_workers = WorkerManager::add_workers(this, - _active_workers, + active_workers, _total_workers, _created_workers, worker_type, @@ -268,9 +272,9 @@ } void WorkGang::run_task(AbstractGangTask* task, uint num_workers) { - guarantee(num_workers <= active_workers(), - "Trying to execute task %s with %u workers which is more than the amount of active workers %u.", - task->name(), num_workers, active_workers()); + guarantee(num_workers <= total_workers(), + "Trying to execute task %s with %u workers which is more than the amount of total workers %u.", + task->name(), num_workers, total_workers()); guarantee(num_workers > 0, "Trying to execute task %s with zero workers", task->name()); _dispatcher->coordinator_execute_on_workers(task, num_workers); } diff --git a/src/share/vm/gc/shared/workgroup.hpp b/src/share/vm/gc/shared/workgroup.hpp --- a/src/share/vm/gc/shared/workgroup.hpp +++ b/src/share/vm/gc/shared/workgroup.hpp @@ -170,6 +170,9 @@ // Add GC workers as needed. void add_workers(bool initializing); + // Add specified number of GC workers + void add_workers(uint active_workers, bool initializing); + // Return the Ith worker. AbstractGangWorker* worker(uint i) const; diff --git a/test/gc/stress/TestGCOld.java b/test/gc/stress/TestGCOld.java --- a/test/gc/stress/TestGCOld.java +++ b/test/gc/stress/TestGCOld.java @@ -32,6 +32,7 @@ * @run main/othervm -Xmx384M -XX:+UseParallelGC -XX:-UseParallelOldGC TestGCOld 50 1 20 10 10000 * @run main/othervm -Xmx384M -XX:+UseConcMarkSweepGC TestGCOld 50 1 20 10 10000 * @run main/othervm -Xmx384M -XX:+UseG1GC TestGCOld 50 1 20 10 10000 + * @run main/othervm -XX:+UseG1GC -XX:+UseDynamicNumberOfGCThreads -Xlog:gc,gc+task=trace -Xms64m -Xmx128m TestGCOld 50 5 20 1 5000 */ import java.text.*; # HG changeset patch # User jmasa # Date 1465321342 25200 # Tue Jun 07 10:42:22 2016 -0700 # Node ID f74f7616b1eb43e6f9352783453d30babe28f0ca # Parent 74a4df91a40066470f8e9ccb92780138a268dff5 [mq]: code_review1 diff --git a/src/share/vm/gc/g1/g1ConcurrentMark.cpp b/src/share/vm/gc/g1/g1ConcurrentMark.cpp --- a/src/share/vm/gc/g1/g1ConcurrentMark.cpp +++ b/src/share/vm/gc/g1/g1ConcurrentMark.cpp @@ -982,7 +982,6 @@ root_regions()->num_root_regions()); assert(parallel_marking_threads() <= max_parallel_marking_threads(), "Maximum number of marking threads exceeded"); - _parallel_workers->add_workers(_parallel_marking_threads, false); G1CMRootRegionScanTask task(this); log_debug(gc, ergo)("Running %s using %u workers for %u work units.", diff --git a/src/share/vm/gc/shared/workgroup.cpp b/src/share/vm/gc/shared/workgroup.cpp --- a/src/share/vm/gc/shared/workgroup.cpp +++ b/src/share/vm/gc/shared/workgroup.cpp @@ -276,6 +276,7 @@ "Trying to execute task %s with %u workers which is more than the amount of total workers %u.", task->name(), num_workers, total_workers()); guarantee(num_workers > 0, "Trying to execute task %s with zero workers", task->name()); + add_workers(num_workers); _dispatcher->coordinator_execute_on_workers(task, num_workers); } diff --git a/src/share/vm/gc/shared/workgroup.hpp b/src/share/vm/gc/shared/workgroup.hpp --- a/src/share/vm/gc/shared/workgroup.hpp +++ b/src/share/vm/gc/shared/workgroup.hpp @@ -170,7 +170,7 @@ // Add GC workers as needed. void add_workers(bool initializing); - // Add specified number of GC workers + // Add GC workers as needed to reach the specified number of workers. void add_workers(uint active_workers, bool initializing); // Return the Ith worker. @@ -217,7 +217,8 @@ virtual void run_task(AbstractGangTask* task); // Run a task with the given number of workers, returns // when the task is done. The number of workers must be at most the number of - // active workers. + // active workers. Additional workers may be created if an insufficient + // number currently exists. void run_task(AbstractGangTask* task, uint num_workers); protected: diff --git a/test/gc/stress/TestGCOld.java b/test/gc/stress/TestGCOld.java --- a/test/gc/stress/TestGCOld.java +++ b/test/gc/stress/TestGCOld.java @@ -32,7 +32,7 @@ * @run main/othervm -Xmx384M -XX:+UseParallelGC -XX:-UseParallelOldGC TestGCOld 50 1 20 10 10000 * @run main/othervm -Xmx384M -XX:+UseConcMarkSweepGC TestGCOld 50 1 20 10 10000 * @run main/othervm -Xmx384M -XX:+UseG1GC TestGCOld 50 1 20 10 10000 - * @run main/othervm -XX:+UseG1GC -XX:+UseDynamicNumberOfGCThreads -Xlog:gc,gc+task=trace -Xms64m -Xmx128m TestGCOld 50 5 20 1 5000 + * @run main/othervm -Xms64m -Xmx128m -XX:+UseG1GC -XX:+UseDynamicNumberOfGCThreads -Xlog:gc,gc+task=trace TestGCOld 50 5 20 1 5000 */ import java.text.*;