From a5fcc9413d630aa70743019b012b633f76d9e68c Mon Sep 17 00:00:00 2001 From: Vlad Brezae Date: Sat, 10 Jun 2017 01:50:20 +0300 Subject: [PATCH] [sgen] Avoid using parallel minors for small nurseries It is not effective and it can lead to regressions, due to the added synchronizations and work splitting. --- mono/sgen/sgen-conf.h | 6 ++++++ mono/sgen/sgen-gc.c | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/mono/sgen/sgen-conf.h b/mono/sgen/sgen-conf.h index 63e922c470e..f6738e4d6eb 100644 --- a/mono/sgen/sgen-conf.h +++ b/mono/sgen/sgen-conf.h @@ -219,4 +219,10 @@ typedef mword SgenDescriptor; #define SGEN_MAX_PAUSE_TIME 30 #define SGEN_MAX_PAUSE_MARGIN 0.66f +/* + * In practice, for nurseries smaller than this, the parallel minor tends to be + * ineffective, even leading to regressions. Avoid using it for smaller nurseries. + */ +#define SGEN_PARALLEL_MINOR_MIN_NURSERY_SIZE (1 << 24) + #endif diff --git a/mono/sgen/sgen-gc.c b/mono/sgen/sgen-gc.c index 03dfc5cfddd..5213dda70ee 100644 --- a/mono/sgen/sgen-gc.c +++ b/mono/sgen/sgen-gc.c @@ -1641,7 +1641,7 @@ collect_nursery (const char *reason, gboolean is_overflow, SgenGrayQueue *unpin_ object_ops_nopar = &sgen_minor_collector.serial_ops_with_concurrent_major; } else { object_ops_nopar = &sgen_minor_collector.serial_ops; - if (sgen_minor_collector.is_parallel) { + if (sgen_minor_collector.is_parallel && sgen_nursery_size >= SGEN_PARALLEL_MINOR_MIN_NURSERY_SIZE) { object_ops_par = &sgen_minor_collector.parallel_ops; is_parallel = TRUE; } -- 2.25.1