From c5935f5fb7850902f8172e35d3c4f0136795fa14 Mon Sep 17 00:00:00 2001 From: zzvscx Date: Fri, 12 Sep 2025 15:41:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EisKillScbEnabled=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zzvscx Change-Id: I003c805e90872b18d20d55d87c8cf9c57740d2e0 --- .../impl_interface/gpu_context_impl.h | 2 +- .../feature_param/extend_feature/mem_param.cpp | 10 ++++++++++ .../feature_param/extend_feature/mem_param.h | 3 +++ .../extend_feature_parser/mem_param_parse.cpp | 3 +++ .../core/memory/rs_memory_manager.cpp | 17 +++++++++++------ .../core/memory/rs_memory_manager.h | 2 +- .../include/memory/rs_memory_snapshot.h | 2 +- .../unittest/feature_cfg/mem_param_test.cpp | 14 ++++++++++++++ .../unittest/memory/rs_memory_snapshot_test.cpp | 2 +- 9 files changed, 45 insertions(+), 10 deletions(-) diff --git a/rosen/modules/2d_graphics/src/drawing/engine_adapter/impl_interface/gpu_context_impl.h b/rosen/modules/2d_graphics/src/drawing/engine_adapter/impl_interface/gpu_context_impl.h index 625cc00f2e..28bb762817 100644 --- a/rosen/modules/2d_graphics/src/drawing/engine_adapter/impl_interface/gpu_context_impl.h +++ b/rosen/modules/2d_graphics/src/drawing/engine_adapter/impl_interface/gpu_context_impl.h @@ -34,7 +34,7 @@ namespace OHOS { namespace Rosen { namespace Drawing { using pid_t = int; -using MemoryOverflowCalllback = std::function; +using MemoryOverflowCalllback = std::function; struct GPUResourceTag; struct HpsBlurParameter; class GPUContext; diff --git a/rosen/modules/render_service/core/feature_cfg/feature_param/extend_feature/mem_param.cpp b/rosen/modules/render_service/core/feature_cfg/feature_param/extend_feature/mem_param.cpp index 7ab44ffea7..6798e22361 100644 --- a/rosen/modules/render_service/core/feature_cfg/feature_param/extend_feature/mem_param.cpp +++ b/rosen/modules/render_service/core/feature_cfg/feature_param/extend_feature/mem_param.cpp @@ -55,4 +55,14 @@ void MEMParam::SetDeeplyRelGpuResEnable(bool isDeeplyRelGpuResEnable) { isDeeplyRelGpuResEnable_ = isDeeplyRelGpuResEnable; } + +bool MEMParam::IsKillScbEnabled() +{ + return isKillScbEnabled_; +} + +void MEMParam::SetKillScbEnabled(bool isEnabled) +{ + isKillScbEnabled_ = isEnabled; +} } // namespace OHOS::Rosen \ No newline at end of file diff --git a/rosen/modules/render_service/core/feature_cfg/feature_param/extend_feature/mem_param.h b/rosen/modules/render_service/core/feature_cfg/feature_param/extend_feature/mem_param.h index 5ea4665201..72073ce74b 100644 --- a/rosen/modules/render_service/core/feature_cfg/feature_param/extend_feature/mem_param.h +++ b/rosen/modules/render_service/core/feature_cfg/feature_param/extend_feature/mem_param.h @@ -28,18 +28,21 @@ public: static bool IsReclaimEnabled(); static int GetRSCacheLimitsResourceSize(); static bool IsDeeplyRelGpuResEnable(); + static bool IsKillScbEnabled(); protected: static void SetRSWatchPoint(std::string rsWatchPoint); static void SetReclaimEnabled(bool isEnabled); static void SetRSCacheLimitsResourceSize(int rsCacheLimitsResourceSize); static void SetDeeplyRelGpuResEnable(bool isDeeplyRelGpuResEnable); + static void SetKillScbEnabled(bool isEnabled); private: inline static std::string rsWatchPoint_ = ""; inline static bool isReclaimEnabled_ = false; inline static int rsCacheLimitsResourceSize_ = 0; inline static bool isDeeplyRelGpuResEnable_ = false; + inline static bool isKillScbEnabled_ = true; friend class MEMParamParse; }; diff --git a/rosen/modules/render_service/core/feature_cfg/xml_parser/extend_feature_parser/mem_param_parse.cpp b/rosen/modules/render_service/core/feature_cfg/xml_parser/extend_feature_parser/mem_param_parse.cpp index cbeca97be3..46689b26c1 100644 --- a/rosen/modules/render_service/core/feature_cfg/xml_parser/extend_feature_parser/mem_param_parse.cpp +++ b/rosen/modules/render_service/core/feature_cfg/xml_parser/extend_feature_parser/mem_param_parse.cpp @@ -72,6 +72,9 @@ int32_t MEMParamParse::ParseMemInternal(xmlNode &node) MEMParam::SetDeeplyRelGpuResEnable(isEnabled); RS_LOGI("MEMParamParse parse DeeplyReleaseGpuResourceEnabled %{public}d", MEMParam::IsDeeplyRelGpuResEnable()); + } else if (name == "KillScbEnabled") { + MEMParam::SetKillScbEnabled(isEnabled); + RS_LOGI("MEMParamParse parse KillScbEnabled %{public}d", MEMParam::IsKillScbEnabled()); } } diff --git a/rosen/modules/render_service/core/memory/rs_memory_manager.cpp b/rosen/modules/render_service/core/memory/rs_memory_manager.cpp index 7bb114fb00..62e7a7f29e 100644 --- a/rosen/modules/render_service/core/memory/rs_memory_manager.cpp +++ b/rosen/modules/render_service/core/memory/rs_memory_manager.cpp @@ -82,6 +82,7 @@ const std::string KERNEL_CONFIG_PATH = "/system/etc/hiview/kernel_leak_config.js const std::string GPUMEM_INFO_PATH = "/proc/gpumem_process_info"; const std::string EVENT_ENTER_RECENTS = "GESTURE_TO_RECENTS"; const std::string GPU_RS_LEAK = "ResourceLeak(GpuRsLeak)"; +const std::string SCB_BUNDLE_NAME = "com.ohos.sceneboard"; constexpr uint32_t MEMUNIT_RATE = 1024; constexpr uint32_t MEMORY_REPORT_INTERVAL = 24 * 60 * 60 * 1000; // Each process can report at most once a day. constexpr uint32_t FRAME_NUMBER = 10; // Check memory every ten frames. @@ -819,17 +820,24 @@ static void KillProcessByPid(const pid_t pid, const MemorySnapshotInfo& info, co #endif } -void MemoryManager::MemoryOverflow(pid_t pid, size_t overflowMemory, bool isGpu) +bool MemoryManager::MemoryOverflow(pid_t pid, size_t overflowMemory, bool isGpu) { if (pid == 0) { RS_LOGD("MemoryManager::MemoryOverflow pid = 0"); - return; + return false; } MemorySnapshotInfo info; MemorySnapshot::Instance().GetMemorySnapshotInfoByPid(pid, info); if (isGpu) { info.gpuMemory = overflowMemory; } + if (info.bundleName.empty()) { + auto& appMgrClient = RSSingleton::GetInstance(); + appMgrClient.GetBundleNameByPid(pid, info.bundleName, info.uid); + } + if (info.bundleName == SCB_BUNDLE_NAME && !MEMParam::IsKillScbEnabled()) { + return false; + } if (IS_BETA) { RSMainThread::Instance()->PostTask([pid, info]() mutable { RS_TRACE_NAME_FMT("RSMem Dump Task"); @@ -846,12 +854,9 @@ void MemoryManager::MemoryOverflow(pid_t pid, size_t overflowMemory, bool isGpu) + "], gpu[" + std::to_string(info.gpuMemory) + "], total[" + std::to_string(info.TotalMemory()) + "]"; - if (info.bundleName.empty()) { - auto& appMgrClient = RSSingleton::GetInstance(); - appMgrClient.GetBundleNameByPid(pid, info.bundleName, info.uid); - } KillProcessByPid(pid, info, reason); RS_LOGE("RSMemoryOverflow pid[%{public}d] cpu[%{public}zu] gpu[%{public}zu]", pid, info.cpuMemory, info.gpuMemory); + return true; } void MemoryManager::MemoryOverReport(const pid_t pid, const MemorySnapshotInfo& info, const std::string& reportName, diff --git a/rosen/modules/render_service/core/memory/rs_memory_manager.h b/rosen/modules/render_service/core/memory/rs_memory_manager.h index 5c6a181903..837ccd59cd 100644 --- a/rosen/modules/render_service/core/memory/rs_memory_manager.h +++ b/rosen/modules/render_service/core/memory/rs_memory_manager.h @@ -51,7 +51,7 @@ public: static void InitMemoryLimit(); static void SetGpuMemoryLimit(Drawing::GPUContext* gpuContext); static void MemoryOverCheck(Drawing::GPUContext* gpuContext); - static void MemoryOverflow(pid_t pid, size_t overflowMemory, bool isGpu); + static bool MemoryOverflow(pid_t pid, size_t overflowMemory, bool isGpu); static void CheckIsClearApp(); static void VmaDefragment(Drawing::GPUContext* gpuContext); static void SetGpuCacheSuppressWindowSwitch(Drawing::GPUContext* gpuContext, bool enabled); diff --git a/rosen/modules/render_service_base/include/memory/rs_memory_snapshot.h b/rosen/modules/render_service_base/include/memory/rs_memory_snapshot.h index dd7d4de2fc..14c9ad0d42 100644 --- a/rosen/modules/render_service_base/include/memory/rs_memory_snapshot.h +++ b/rosen/modules/render_service_base/include/memory/rs_memory_snapshot.h @@ -36,7 +36,7 @@ struct MemorySnapshotInfo { } }; -using MemoryOverflowCalllback = std::function; +using MemoryOverflowCalllback = std::function; class RSB_EXPORT MemorySnapshot { public: static MemorySnapshot& Instance(); diff --git a/rosen/test/render_service/render_service/unittest/feature_cfg/mem_param_test.cpp b/rosen/test/render_service/render_service/unittest/feature_cfg/mem_param_test.cpp index 2d459e0d95..d6ac90813e 100644 --- a/rosen/test/render_service/render_service/unittest/feature_cfg/mem_param_test.cpp +++ b/rosen/test/render_service/render_service/unittest/feature_cfg/mem_param_test.cpp @@ -75,5 +75,19 @@ HWTEST_F(MEMParamTest, SetRSCacheLimitsResourceSize, Function | SmallTest | Leve memParam.SetRSCacheLimitsResourceSize(cacheLimitResourceSize); EXPECT_EQ(memParam.GetRSCacheLimitsResourceSize(), cacheLimitResourceSize); } + +/** + * @tc.name: SetKillScbEnabled + * @tc.desc: Verify the SetKillScbEnabled function + * @tc.type: FUNC + * @tc.require: #IBIE4T + */ +HWTEST_F(MEMParamTest, v, Function | SmallTest | Level1) +{ + bool isKillScbEnabled = false; + MEMParam memParam; + memParam.SetKillScbEnabled(isKillScbEnabled); + EXPECT_EQ(memParam.IsKillScbEnabled(), isKillScbEnabled); +} } // namespace Rosen } // namespace OHOS \ No newline at end of file diff --git a/rosen/test/render_service/render_service_base/unittest/memory/rs_memory_snapshot_test.cpp b/rosen/test/render_service/render_service_base/unittest/memory/rs_memory_snapshot_test.cpp index d80e6e2c67..1d41e9f59b 100644 --- a/rosen/test/render_service/render_service_base/unittest/memory/rs_memory_snapshot_test.cpp +++ b/rosen/test/render_service/render_service_base/unittest/memory/rs_memory_snapshot_test.cpp @@ -232,7 +232,7 @@ HWTEST_F(RSMemorySnapshotTest, GetTotalMemoryTest001, testing::ext::TestSize.Lev */ HWTEST_F(RSMemorySnapshotTest, InitMemoryLimitTest001, testing::ext::TestSize.Level1) { - auto callback = [](pid_t, size_t, bool) {}; + auto callback = [](pid_t, size_t, bool) { return true; }; MemorySnapshot::Instance().InitMemoryLimit(callback, 1000, 2000, 3000); MemorySnapshot::Instance().InitMemoryLimit(nullptr, 5000, 6000, 7000); ASSERT_EQ(MemorySnapshot::Instance().singleMemoryWarning_, 1000); -- Gitee