From 248dfb2334d20a2773730b21161c402455a24eae Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Wed, 21 Aug 2024 09:31:55 -0700 Subject: [PATCH] [engine] reland weaken affinity of raster/ui to non-e core instead of only fast core (flutter/engine#54616) Some android devices have only a single fast core. We set the threading affinity for UI/Raster to the fast core, which can lead to the UI/Raster being serialized on this thread. Instead, we should weaken /invert the affinity to "Not slow cores". FIxes https://github.com/flutter/flutter/issues/153690 Customer money will see some benchmark regressions but they can deal. --- engine/src/flutter/fml/cpu_affinity.cc | 4 ++++ engine/src/flutter/fml/cpu_affinity.h | 4 ++++ engine/src/flutter/fml/cpu_affinity_unittests.cc | 3 +++ .../flutter/shell/platform/android/android_shell_holder.cc | 4 ++-- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/engine/src/flutter/fml/cpu_affinity.cc b/engine/src/flutter/fml/cpu_affinity.cc index ccb2e89686..0342c85f04 100644 --- a/engine/src/flutter/fml/cpu_affinity.cc +++ b/engine/src/flutter/fml/cpu_affinity.cc @@ -58,6 +58,8 @@ CPUSpeedTracker::CPUSpeedTracker(std::vector data) } if (data.speed == min_speed_value) { efficiency_.push_back(data.index); + } else { + not_efficiency_.push_back(data.index); } } @@ -77,6 +79,8 @@ const std::vector& CPUSpeedTracker::GetIndices( return efficiency_; case CpuAffinity::kNotPerformance: return not_performance_; + case CpuAffinity::kNotEfficiency: + return not_efficiency_; } } diff --git a/engine/src/flutter/fml/cpu_affinity.h b/engine/src/flutter/fml/cpu_affinity.h index b4c54c7bbf..c1d8498e65 100644 --- a/engine/src/flutter/fml/cpu_affinity.h +++ b/engine/src/flutter/fml/cpu_affinity.h @@ -26,6 +26,9 @@ enum class CpuAffinity { /// @brief Request affinity for all non-performance cores. kNotPerformance, + + /// @brief Request affinity for all non-efficiency cores. + kNotEfficiency, }; /// @brief Request count of efficiency cores. @@ -79,6 +82,7 @@ class CPUSpeedTracker { std::vector efficiency_; std::vector performance_; std::vector not_performance_; + std::vector not_efficiency_; }; /// @note Visible for testing. diff --git a/engine/src/flutter/fml/cpu_affinity_unittests.cc b/engine/src/flutter/fml/cpu_affinity_unittests.cc index 8a5c90687e..142fc84612 100644 --- a/engine/src/flutter/fml/cpu_affinity_unittests.cc +++ b/engine/src/flutter/fml/cpu_affinity_unittests.cc @@ -29,6 +29,9 @@ TEST(CpuAffinity, NormalSlowMedFastCores) { ASSERT_EQ(tracker.GetIndices(CpuAffinity::kNotPerformance).size(), 2u); ASSERT_EQ(tracker.GetIndices(CpuAffinity::kNotPerformance)[0], 0u); ASSERT_EQ(tracker.GetIndices(CpuAffinity::kNotPerformance)[1], 1u); + ASSERT_EQ(tracker.GetIndices(CpuAffinity::kNotEfficiency).size(), 2u); + ASSERT_EQ(tracker.GetIndices(CpuAffinity::kNotEfficiency)[0], 1u); + ASSERT_EQ(tracker.GetIndices(CpuAffinity::kNotEfficiency)[1], 2u); } TEST(CpuAffinity, NoCpuData) { diff --git a/engine/src/flutter/shell/platform/android/android_shell_holder.cc b/engine/src/flutter/shell/platform/android/android_shell_holder.cc index 74d37e5958..4312ee9f33 100644 --- a/engine/src/flutter/shell/platform/android/android_shell_holder.cc +++ b/engine/src/flutter/shell/platform/android/android_shell_holder.cc @@ -49,14 +49,14 @@ static void AndroidPlatformThreadConfigSetter( break; } case fml::Thread::ThreadPriority::kDisplay: { - fml::RequestAffinity(fml::CpuAffinity::kPerformance); + fml::RequestAffinity(fml::CpuAffinity::kNotEfficiency); if (::setpriority(PRIO_PROCESS, 0, -1) != 0) { FML_LOG(ERROR) << "Failed to set UI task runner priority"; } break; } case fml::Thread::ThreadPriority::kRaster: { - fml::RequestAffinity(fml::CpuAffinity::kPerformance); + fml::RequestAffinity(fml::CpuAffinity::kNotEfficiency); // Android describes -8 as "most important display threads, for // compositing the screen and retrieving input events". Conservatively // set the raster thread to slightly lower priority than it.