summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKuba Mracek <mracek@apple.com>2017-01-20 00:25:01 +0000
committerKuba Mracek <mracek@apple.com>2017-01-20 00:25:01 +0000
commit212ca9be08d3d542f8929754e651d42a6138fc41 (patch)
treebe3b366ba1107e8fd6d795d2bae5cc89fcdf392b
parent79a2f4d44fc6f4fa55ecc5c9c14b72dc88362648 (diff)
[lit] Limit parallelism of sanitizer tests on Darwin [compiler-rt part, take 2]
Running lit tests and unit tests of ASan and TSan on macOS has very bad performance when running with a high number of threads. This is caused by xnu (the macOS kernel), which currently doesn't handle mapping and unmapping of sanitizer shadow regions (reserved VM which are several terabytes large) very well. The situation is so bad that increasing the number of threads actually makes the total testing time larger. The macOS buildbots are affected by this. Note that we can't easily limit the number of sanitizer testing threads without affecting the rest of the tests. This patch adds a special "group" into lit, and limits the number of concurrently running tests in this group. This helps solve the contention problem, while still allowing other tests to run in full, that means running lit with -j8 will still with 8 threads, and parallelism is only limited in sanitizer tests. Differential Revision: https://reviews.llvm.org/D28420 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@292549 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--test/asan/Unit/lit.site.cfg.in3
-rw-r--r--test/asan/lit.cfg3
-rw-r--r--test/lit.common.cfg6
-rw-r--r--test/tsan/Unit/lit.site.cfg.in3
-rw-r--r--test/tsan/lit.cfg3
-rw-r--r--unittests/lit.common.unit.cfg10
6 files changed, 28 insertions, 0 deletions
diff --git a/test/asan/Unit/lit.site.cfg.in b/test/asan/Unit/lit.site.cfg.in
index 55631a6d9..1c59a6bad 100644
--- a/test/asan/Unit/lit.site.cfg.in
+++ b/test/asan/Unit/lit.site.cfg.in
@@ -27,3 +27,6 @@ config.test_source_root = config.test_exec_root
# Set LD_LIBRARY_PATH to pick dynamic runtime up properly.
push_ld_library_path(config, config.compiler_rt_libdir)
+
+if config.host_os == 'Darwin':
+ config.parallelism_group = config.darwin_sanitizer_parallelism_group_func
diff --git a/test/asan/lit.cfg b/test/asan/lit.cfg
index 7703f5a31..5ebe414d4 100644
--- a/test/asan/lit.cfg
+++ b/test/asan/lit.cfg
@@ -241,3 +241,6 @@ else:
# Only run the tests on supported OSs.
if config.host_os not in ['Linux', 'Darwin', 'FreeBSD', 'Windows']:
config.unsupported = True
+
+if config.host_os == 'Darwin' and config.target_arch in ["x86_64", "x86_64h"]:
+ config.parallelism_group = "darwin-64bit-sanitizer"
diff --git a/test/lit.common.cfg b/test/lit.common.cfg
index b87599234..f0d7c0bff 100644
--- a/test/lit.common.cfg
+++ b/test/lit.common.cfg
@@ -216,3 +216,9 @@ llvm_config_cmd.wait()
# retries. We don't do this on otther platforms because it's slower.
if platform.system() == 'Windows':
config.test_retry_attempts = 2
+
+# Only run up to 3 64-bit sanitized processes simultaneously on Darwin.
+# Using more scales badly and hogs the system due to inefficient handling
+# of large mmap'd regions (terabytes) by the kernel.
+if platform.system() == 'Darwin':
+ lit_config.parallelism_groups["darwin-64bit-sanitizer"] = 3
diff --git a/test/tsan/Unit/lit.site.cfg.in b/test/tsan/Unit/lit.site.cfg.in
index 23894a839..a091ffe53 100644
--- a/test/tsan/Unit/lit.site.cfg.in
+++ b/test/tsan/Unit/lit.site.cfg.in
@@ -11,3 +11,6 @@ config.name = 'ThreadSanitizer-Unit'
# FIXME: De-hardcode this path.
config.test_exec_root = "@COMPILER_RT_BINARY_DIR@/lib/tsan/tests"
config.test_source_root = config.test_exec_root
+
+if config.host_os == 'Darwin':
+ config.parallelism_group = config.darwin_sanitizer_parallelism_group_func
diff --git a/test/tsan/lit.cfg b/test/tsan/lit.cfg
index 5d82cc9d4..f9ae539ba 100644
--- a/test/tsan/lit.cfg
+++ b/test/tsan/lit.cfg
@@ -83,3 +83,6 @@ if config.host_os not in ['FreeBSD', 'Linux', 'Darwin']:
# because the test hangs.
if config.target_arch != 'aarch64':
config.available_features.add('stable-runtime')
+
+if config.host_os == 'Darwin' and config.target_arch in ["x86_64", "x86_64h"]:
+ config.parallelism_group = "darwin-64bit-sanitizer"
diff --git a/unittests/lit.common.unit.cfg b/unittests/lit.common.unit.cfg
index 2bd8f376f..475b22d41 100644
--- a/unittests/lit.common.unit.cfg
+++ b/unittests/lit.common.unit.cfg
@@ -28,3 +28,13 @@ if 'TMP' in os.environ:
config.environment['TMP'] = os.environ['TMP']
if 'TEMP' in os.environ:
config.environment['TEMP'] = os.environ['TEMP']
+
+if config.host_os == 'Darwin':
+ # Only run up to 3 64-bit sanitized processes simultaneously on Darwin.
+ # Using more scales badly and hogs the system due to inefficient handling
+ # of large mmap'd regions (terabytes) by the kernel.
+ lit_config.parallelism_groups["darwin-64bit-sanitizer"] = 3
+
+ def darwin_sanitizer_parallelism_group_func(test):
+ return "darwin-64bit-sanitizer" if "x86_64" in test.file_path else ""
+ config.darwin_sanitizer_parallelism_group_func = darwin_sanitizer_parallelism_group_func