diff options
| author | 2022-08-19 18:12:03 -0700 | |
|---|---|---|
| committer | 2022-08-22 23:08:48 +0000 | |
| commit | 0a63beeb0922bb30e539ef4725c02ca9879924b1 (patch) | |
| tree | 2350781fb094a500a83c1e800cb68d8ede2633e8 | |
| parent | 9e75de89a033b729d3130bdd037c14a4dd60902e (diff) | |
Allow all GCs when not using read barrier
Currently we are trying to force userfaultfd GC when
ART_USE_READ_BARRIER=false. But that doesn't work for targets attempting
to use semi-space GC.
Bug: 243181908
Test: ART_DEFAULT_GC_TYPE=SS ART_USE_READ_BARRIER=false
art/test/testrunner/testrunner.py --host
Change-Id: I0e17df4c7451bb627150ad9ca70030f315c4995f
| -rw-r--r-- | build/art.go | 12 | ||||
| -rw-r--r-- | cmdline/cmdline_types.h | 2 | ||||
| -rw-r--r-- | runtime/gc/collector/mark_compact.cc | 9 | ||||
| -rw-r--r-- | runtime/gc/collector_type.h | 1 | ||||
| -rw-r--r-- | runtime/read_barrier_config.h | 9 |
5 files changed, 26 insertions, 7 deletions
diff --git a/build/art.go b/build/art.go index 56df14239f..672f28295f 100644 --- a/build/art.go +++ b/build/art.go @@ -38,10 +38,12 @@ func globalFlags(ctx android.LoadHookContext) ([]string, []string) { opt := ctx.Config().GetenvWithDefault("ART_NDEBUG_OPT_FLAG", "-O3") cflags = append(cflags, opt) + tlab := false gcType := ctx.Config().GetenvWithDefault("ART_DEFAULT_GC_TYPE", "CMC") if ctx.Config().IsEnvTrue("ART_TEST_DEBUG_GC") { gcType = "SS" + tlab = true } cflags = append(cflags, "-DART_DEFAULT_GC_TYPE_IS_"+gcType) @@ -72,10 +74,14 @@ func globalFlags(ctx android.LoadHookContext) ([]string, []string) { // Eventually, make it such that we force CC only if ART_USE_READ_BARRIER // was set to true explicitly during build time. cflags = append(cflags, "-DART_FORCE_USE_READ_BARRIER=1") + tlab = true + } else if gcType == "CMC" { + tlab = true + } + + if tlab { + cflags = append(cflags, "-DART_USE_TLAB=1") } - // The only GC which does not want ART_USE_TLAB set is CMS, which isn't actually used. - // When read-barrier is not set, we use userfaultfd GC. - cflags = append(cflags, "-DART_USE_TLAB=1") cdexLevel := ctx.Config().GetenvWithDefault("ART_DEFAULT_COMPACT_DEX_LEVEL", "fast") cflags = append(cflags, "-DART_DEFAULT_COMPACT_DEX_LEVEL="+cdexLevel) diff --git a/cmdline/cmdline_types.h b/cmdline/cmdline_types.h index 8c535a6fef..b16f0697fd 100644 --- a/cmdline/cmdline_types.h +++ b/cmdline/cmdline_types.h @@ -527,6 +527,8 @@ static gc::CollectorType ParseCollectorType(const std::string& option) { return gc::kCollectorTypeSS; } else if (option == "CC") { return gc::kCollectorTypeCC; + } else if (option == "CMC") { + return gc::kCollectorTypeCMC; } else { return gc::kCollectorTypeNone; } diff --git a/runtime/gc/collector/mark_compact.cc b/runtime/gc/collector/mark_compact.cc index 0b8d9016ab..f2817cfd03 100644 --- a/runtime/gc/collector/mark_compact.cc +++ b/runtime/gc/collector/mark_compact.cc @@ -99,13 +99,14 @@ static bool ShouldUseUserfaultfd() { } #endif -#ifdef ART_FORCE_USE_READ_BARRIER -const bool gUseReadBarrier = kUseBakerReadBarrier || kUseTableLookupReadBarrier; -#else +// The other cases are defined as a constexpr in runtime/read_barrier_config.h +#ifndef ART_FORCE_USE_READ_BARRIER const bool gUseReadBarrier = (kUseBakerReadBarrier || kUseTableLookupReadBarrier) && !ShouldUseUserfaultfd(); -#endif +#ifdef ART_DEFAULT_GC_TYPE_IS_CMC const bool gUseUserfaultfd = !gUseReadBarrier; +#endif +#endif namespace gc { namespace collector { diff --git a/runtime/gc/collector_type.h b/runtime/gc/collector_type.h index 8fdb524f8e..c20e3a7347 100644 --- a/runtime/gc/collector_type.h +++ b/runtime/gc/collector_type.h @@ -71,6 +71,7 @@ static constexpr CollectorType kCollectorTypeDefault = kCollectorTypeSS #elif ART_DEFAULT_GC_TYPE_IS_CMS kCollectorTypeCMS +#else #error "ART default GC type must be set" #endif ; // NOLINT [whitespace/semicolon] [5] diff --git a/runtime/read_barrier_config.h b/runtime/read_barrier_config.h index e974b04797..d5baee216e 100644 --- a/runtime/read_barrier_config.h +++ b/runtime/read_barrier_config.h @@ -62,8 +62,17 @@ static constexpr bool kUseTableLookupReadBarrier = true; static constexpr bool kUseTableLookupReadBarrier = false; #endif +#ifdef ART_FORCE_USE_READ_BARRIER +constexpr bool gUseReadBarrier = kUseBakerReadBarrier || kUseTableLookupReadBarrier; +constexpr bool gUseUserfaultfd = !gUseReadBarrier; +#else extern const bool gUseReadBarrier; +#ifdef ART_DEFAULT_GC_TYPE_IS_CMC extern const bool gUseUserfaultfd; +#else +constexpr bool gUseUserfaultfd = false; +#endif +#endif // Disabled for performance reasons. static constexpr bool kCheckDebugDisallowReadBarrierCount = kIsDebugBuild; |