From ce6c5c92bbbac21d66ea06ac86834ba0ea715bb7 Mon Sep 17 00:00:00 2001 From: timelessxp Date: Thu, 28 Aug 2025 12:07:16 +0800 Subject: [PATCH 1/4] audio workgroup support qos7 Signed-off-by: timelessxp --- .../native/audioschedule/audio_schedule.cpp | 19 ++- .../client/src/audio_system_manager.cpp | 14 +- .../server/include/audio_resource_service.h | 1 + .../server/include/audio_workgroup.h | 8 + .../server/src/audio_resource_service.cpp | 27 +++- .../server/src/audio_workgroup.cpp | 44 ++++-- .../audio_resource_service_unit_test.cpp | 139 ++++++++++++++++++ .../audio_server_more_fuzzer.cpp | 27 ++++ 8 files changed, 255 insertions(+), 24 deletions(-) diff --git a/frameworks/native/audioschedule/audio_schedule.cpp b/frameworks/native/audioschedule/audio_schedule.cpp index a6b7ebaf48..2f6dea4131 100644 --- a/frameworks/native/audioschedule/audio_schedule.cpp +++ b/frameworks/native/audioschedule/audio_schedule.cpp @@ -63,12 +63,8 @@ void ConfigPayload(pid_t pid, pid_t tid, const char *bundleName, int32_t qosLeve mapPayload["bundleName"] = strBundleName; } -void ScheduleReportDataWithQosLevel(pid_t pid, pid_t tid, const char *bundleName, int32_t qosLevel) +static void ScheduleReportDataInner(pid_t pid, pid_t tid, const char *bundleName, int32_t qosLevel) { - AudioXCollie audioXcollie("RSS::ReportData with qos level + " + std::to_string(qosLevel) + - ", pid " + std::to_string(pid) + ", tid " + std::to_string(tid), REPORTDATA_TIMEOUT, - nullptr, nullptr, AUDIO_XCOLLIE_FLAG_LOG | AUDIO_XCOLLIE_FLAG_RECOVERY); - AUDIO_INFO_LOG("Report tid %{public}u to qosLeve %{public}d", tid, qosLevel); std::unordered_map mapPayload; ConfigPayload(pid, tid, bundleName, qosLevel, mapPayload); OHOS::ResourceSchedule::ResSchedClient::GetInstance().ReportData(g_type, g_value, mapPayload); @@ -81,9 +77,16 @@ void ScheduleReportData(pid_t pid, pid_t tid, const char *bundleName) nullptr, nullptr, AUDIO_XCOLLIE_FLAG_LOG | AUDIO_XCOLLIE_FLAG_RECOVERY); Trace trace ("Rss::ReportData with qos level 7"); AUDIO_INFO_LOG("Report tid %{public}u", tid); - std::unordered_map mapPayload; - ConfigPayload(pid, tid, bundleName, AUDIO_QOS_LEVEL, mapPayload); - OHOS::ResourceSchedule::ResSchedClient::GetInstance().ReportData(g_type, g_value, mapPayload); + ScheduleReportDataInner(pid, tid, bundleName, AUDIO_QOS_LEVEL); +} + +void ScheduleReportDataWithQosLevel(pid_t pid, pid_t tid, const char *bundleName, int32_t qosLevel) +{ + AudioXCollie audioXcollie("RSS::ReportData with qos level + " + std::to_string(qosLevel) + + ", pid " + std::to_string(pid) + ", tid " + std::to_string(tid), REPORTDATA_TIMEOUT, + nullptr, nullptr, AUDIO_XCOLLIE_FLAG_LOG | AUDIO_XCOLLIE_FLAG_RECOVERY); + AUDIO_INFO_LOG("Report tid %{public}u to qosLeve %{public}d", tid, qosLevel); + ScheduleReportDataInner(pid, tid, bundleName, qosLevel); } void UnscheduleReportData(pid_t pid, pid_t tid, const char* bundleName) diff --git a/services/audio_service/client/src/audio_system_manager.cpp b/services/audio_service/client/src/audio_system_manager.cpp index 05f3c2f904..2f3b77bc81 100644 --- a/services/audio_service/client/src/audio_system_manager.cpp +++ b/services/audio_service/client/src/audio_system_manager.cpp @@ -46,6 +46,8 @@ using namespace std; constexpr unsigned int GET_BUNDLE_INFO_TIME_OUT_SECONDS = 10; constexpr unsigned int XCOLLIE_TIME_OUT_SECONDS = 10; constexpr unsigned int MS_PER_SECOND = 1000; +constexpr unsigned int AUDIO_DEADLINE_PARAM_MIN = 10; +constexpr unsigned int AUDIO_DEADLINE_PARAM_MAX = 50; constexpr size_t VALID_REMOTE_NETWORK_ID_LENGTH = 64; const map, AudioStreamType> AudioSystemManager::streamTypeMap_ = AudioSystemManager::CreateStreamMap(); @@ -2325,7 +2327,7 @@ int32_t AudioSystemManager::CreateAudioWorkgroup() CHECK_AND_RETURN_RET_LOG(res == SUCCESS && workgroupId >= 0, AUDIO_ERR, "CreateAudioWorkgroup failed, res:%{public}d workgroupId:%{public}d", res, workgroupId); - std::lock_guard lock(workgroupPrioRecorderMutex_); + std::lock_guard recorderLock(workgroupPrioRecorderMutex_); workgroupPrioRecorderMap_.emplace(workgroupId, std::make_shared(workgroupId)); return workgroupId; } @@ -2341,7 +2343,7 @@ int32_t AudioSystemManager::ReleaseAudioWorkgroup(int32_t workgroupId) if (recorder->RestoreGroupPrio(false) != AUDIO_OK) { AUDIO_ERR_LOG("[WorkgroupInClient] restore grp:%{public}d prio failed", workgroupId); } else { - std::lock_guard lock(workgroupPrioRecorderMutex_); + std::lock_guard recorderLock(workgroupPrioRecorderMutex_); workgroupPrioRecorderMap_.erase(workgroupId); } } @@ -2414,13 +2416,17 @@ int32_t AudioSystemManager::StartGroup(int32_t workgroupId, uint64_t startTime, const std::unordered_map threads, bool &needUpdatePrio) { if (!IsValidToStartGroup(workgroupId)) { + StopGroup(workgroupId); return AUDIO_ERR; } Trace trace("[WorkgroupInClient] StartGroup workgroupId:" + std::to_string(workgroupId) + " startTime:" + std::to_string(startTime) + " deadlineTime:" + std::to_string(deadlineTime)); CHECK_AND_RETURN_RET_LOG(deadlineTime > startTime, ERR_INVALID_PARAM, "Invalid Audio Deadline params"); - RME::SetFrameRateAndPrioType(workgroupId, MS_PER_SECOND/(deadlineTime - startTime), 0); + int32_t audioDeadlineRate = MS_PER_SECOND / (deadlineTime - startTime); + CHECK_AND_RETURN_RET_LOG(audioDeadlineRate >= AUDIO_DEADLINE_PARAM_MIN && + audioDeadlineRate <= AUDIO_DEADLINE_PARAM_MAX, ERR_INVALID_PARAM, "Invalid Audio Deadline Rate"); + RME::SetFrameRateAndPrioType(workgroupId, audioDeadlineRate, 0); if (ExcuteAudioWorkgroupPrioImprove(workgroupId, threads, needUpdatePrio) != AUDIO_OK) { AUDIO_ERR_LOG("[WorkgroupInClient] excute audioworkgroup prio improve failed"); @@ -2591,7 +2597,7 @@ int32_t AudioSystemManager::WorkgroupPrioRecorder::GetGrpId() std::shared_ptr AudioSystemManager::GetRecorderByGrpId(int32_t grpId) { - std::lock_guard lock(workgroupPrioRecorderMutex_); + std::lock_guard recorderLock(workgroupPrioRecorderMutex_); auto it = workgroupPrioRecorderMap_.find(grpId); if (it != workgroupPrioRecorderMap_.end()) { return it->second; diff --git a/services/audio_service/server/include/audio_resource_service.h b/services/audio_service/server/include/audio_resource_service.h index e762e7348a..f0107dd6a1 100644 --- a/services/audio_service/server/include/audio_resource_service.h +++ b/services/audio_service/server/include/audio_resource_service.h @@ -69,6 +69,7 @@ public: std::vector GetProcessesOfAudioWorkgroup(); int32_t ImproveAudioWorkgroupPrio(int32_t pid, const std::unordered_map &threads); int32_t RestoreAudioWorkgroupPrio(int32_t pid, const std::unordered_map &threads); + void FillAudioWorkgroupCgroupLimit(int32_t pid, std::shared_ptr& workgroup); // Inner class for death handler class AudioWorkgroupDeathRecipient : public IRemoteObject::DeathRecipient { public: diff --git a/services/audio_service/server/include/audio_workgroup.h b/services/audio_service/server/include/audio_workgroup.h index e29fb95b8b..d6f59f83f0 100644 --- a/services/audio_service/server/include/audio_workgroup.h +++ b/services/audio_service/server/include/audio_workgroup.h @@ -29,6 +29,11 @@ public: virtual void OnWorkgroupChange(const AudioWorkgroupChangeInfo &info) = 0; }; +struct AudioWorkgroupCgroupLimit { + pid_t clientPid; + int32_t globalCgroupId; +}; + class AudioWorkgroup { public: explicit AudioWorkgroup(int32_t id); @@ -40,11 +45,14 @@ public: int32_t RemoveThread(int32_t tid); int32_t Start(uint64_t startTime, uint64_t deadlineTime); int32_t Stop(); + int32_t GetCgroupLimitId(); + void SetCgroupLimitParams(int32_t pid, int32_t globalCgroupId); std::shared_ptr callback; private: int32_t workgroupId; std::unordered_map threads; + AudioWorkgroupCgroupLimit cgroupLimit; }; } // namespace AudioStandard diff --git a/services/audio_service/server/src/audio_resource_service.cpp b/services/audio_service/server/src/audio_resource_service.cpp index 6bb36909d6..4cc8be3d81 100644 --- a/services/audio_service/server/src/audio_resource_service.cpp +++ b/services/audio_service/server/src/audio_resource_service.cpp @@ -30,7 +30,7 @@ namespace OHOS { namespace AudioStandard { namespace { static constexpr int32_t AUDIO_MAX_PROCESS = 2; - static constexpr int32_t AUDIO_MAX_GRP_PER_PROCESS = 4; + static constexpr int32_t AUDIO_MAX_GRP_PER_PROCESS = 2; static constexpr int32_t AUDIO_MAX_RT_THREADS = 4; } @@ -98,6 +98,7 @@ int32_t AudioResourceService::CreateAudioWorkgroup(int32_t pid, const sptr lock(workgroupLock_); auto workgroup = std::make_shared(reply.rtgId); audioWorkgroupMap_[pid].groups[reply.rtgId] = workgroup; + FillAudioWorkgroupCgroupLimit(pid, workgroup); sptr deathRecipient = new AudioWorkgroupDeathRecipient(); deathRecipient->SetNotifyCb([this, workgroup, object]() { @@ -391,5 +392,29 @@ int32_t AudioResourceService::RestoreAudioWorkgroupPrio(int32_t pid, } return AUDIO_OK; } + +void AudioResourceService::FillAudioWorkgroupCgroupLimit(int32_t pid, + std::shared_ptr& workgroup) +{ + if (workgroup == nullptr) { + AUDIO_ERR_LOG("[WorkgroupInServer]workgroup is nullptr"); + return; + } + int32_t cgroupId = -1; + std::set usedGroupLimitIds; + for (const auto& group : audioWorkgroupMap_[pid].groups) { + int32_t currId = (group.second ? group.second->GetCgroupLimitId() : -1); + if (currId != -1) { + usedGroupLimitIds.insert(currId); + } + } + for (int32_t i = 0; i < AUDIO_MAX_GRP_PER_PROCESS; i++) { + if (usedGroupLimitIds.count(i) == 0) { + cgroupId = i; + break; + } + } + workgroup->SetCgroupLimitParams(pid, cgroupId); +} } // namespce AudioStandard } // namespace OHOS diff --git a/services/audio_service/server/src/audio_workgroup.cpp b/services/audio_service/server/src/audio_workgroup.cpp index 3c18fe0024..72e1747591 100644 --- a/services/audio_service/server/src/audio_workgroup.cpp +++ b/services/audio_service/server/src/audio_workgroup.cpp @@ -18,13 +18,11 @@ #endif #include "audio_workgroup.h" -#include "audio_common_log.h" #include "rtg_interface.h" +#include "audio_common_log.h" #include "audio_utils.h" #include "concurrent_task_client.h" -using namespace OHOS::RME; - namespace OHOS { namespace AudioStandard { constexpr unsigned int MS_PER_SECOND = 1000; @@ -32,6 +30,7 @@ constexpr unsigned int MS_PER_SECOND = 1000; AudioWorkgroup::AudioWorkgroup(int32_t id) : workgroupId(id) { AUDIO_INFO_LOG("OHAudioWorkgroup Constructor is called\n"); + SetCgroupLimitParams(0, -1); } int32_t AudioWorkgroup::GetWorkgroupId() @@ -46,11 +45,15 @@ uint32_t AudioWorkgroup::GetThreadsNums() int32_t AudioWorkgroup::AddThread(int32_t tid) { + Trace trace("[WorkgroupInServer] AddThread tid:" + std::to_string(tid) + + " workgroupId:" + std::to_string(workgroupId)); ConcurrentTask::IntervalReply reply; + reply.paramA = cgroupLimit.clientPid; + reply.paramB = cgroupLimit.globalCgroupId; OHOS::ConcurrentTask::ConcurrentTaskClient::GetInstance().SetAudioDeadline( ConcurrentTask::AUDIO_DDL_ADD_THREAD, tid, workgroupId, reply); if (reply.paramA < 0) { - AUDIO_INFO_LOG("AudioWorkgroup AddThread Failed!\n"); + AUDIO_INFO_LOG("[WorkgroupInServer] AudioWorkgroup AddThread Failed\n"); return AUDIO_ERR; } threads[tid] = true; @@ -59,11 +62,15 @@ int32_t AudioWorkgroup::AddThread(int32_t tid) int32_t AudioWorkgroup::RemoveThread(int32_t tid) { + Trace trace("[WorkgroupInServer] RemoveThread tid:" + std::to_string(tid) + + " workgroupId:" + std::to_string(workgroupId)); ConcurrentTask::IntervalReply reply; + reply.paramA = cgroupLimit.clientPid; + reply.paramB = cgroupLimit.globalCgroupId; OHOS::ConcurrentTask::ConcurrentTaskClient::GetInstance().SetAudioDeadline( ConcurrentTask::AUDIO_DDL_REMOVE_THREAD, tid, workgroupId, reply); if (reply.paramA < 0) { - AUDIO_INFO_LOG("AudioWorkgroup RemoveThread Failed!\n"); + AUDIO_INFO_LOG("[WorkgroupInServer] AudioWorkgroup RemoveThread Failed\n"); return AUDIO_ERR; } threads.erase(tid); @@ -72,13 +79,15 @@ int32_t AudioWorkgroup::RemoveThread(int32_t tid) int32_t AudioWorkgroup::Start(uint64_t startTime, uint64_t deadlineTime) { + Trace trace("[WorkgroupInServer] Start workgroupId:" + std::to_string(workgroupId) + + " startTime:" + std::to_string(startTime) + " deadlineTime:" + std::to_string(deadlineTime)); if (deadlineTime <= startTime) { - AUDIO_ERR_LOG("[WorkgroupInServer] Invalid params When Start!"); + AUDIO_ERR_LOG("[WorkgroupInServer] Invalid params When Start."); return AUDIO_ERR; } - SetFrameRateAndPrioType(workgroupId, MS_PER_SECOND/(deadlineTime - startTime), 0); - if (BeginFrameFreq(0) != 0) { - AUDIO_ERR_LOG("[WorkgroupInServer] Audio Deadline BeginFrame Failed!"); + RME::SetFrameRateAndPrioType(workgroupId, MS_PER_SECOND/(deadlineTime - startTime), 0); + if (RME::BeginFrameFreq(deadlineTime - startTime) != 0) { + AUDIO_ERR_LOG("[WorkgroupInServer] Audio Deadline BeginFrame failed"); return AUDIO_ERR; } return AUDIO_OK; @@ -86,11 +95,24 @@ int32_t AudioWorkgroup::Start(uint64_t startTime, uint64_t deadlineTime) int32_t AudioWorkgroup::Stop() { - if (EndFrameFreq(0) != 0) { - AUDIO_ERR_LOG("[WorkgroupInServer] Audio Deadline EndFrame Failed!"); + Trace trace("[WorkgroupInServer] Stop workgroupId:" + std::to_string(workgroupId)); + if (RME::EndFrameFreq(0) != 0) { + AUDIO_ERR_LOG("[WorkgroupInServer] Audio Deadline EndFrame failed"); return AUDIO_ERR; } return AUDIO_OK; } + +int32_t AudioWorkgroup::GetCgroupLimitId() +{ + return cgroupLimit.globalCgroupId; +} + +void AudioWorkgroup::SetCgroupLimitParams(int32_t pid, int32_t globalCgroupId) +{ + cgroupLimit.clientPid = pid; + cgroupLimit.globalCgroupId = globalCgroupId; +} + } // namespace AudioStandard } // namespace OHOS \ No newline at end of file diff --git a/services/audio_service/test/unittest/audio_resource_service_unit_test.cpp b/services/audio_service/test/unittest/audio_resource_service_unit_test.cpp index c2fbdbd32c..4afc349aed 100644 --- a/services/audio_service/test/unittest/audio_resource_service_unit_test.cpp +++ b/services/audio_service/test/unittest/audio_resource_service_unit_test.cpp @@ -905,5 +905,144 @@ HWTEST(AudioResourceServiceUnitTest, AudioWorkgroupCheck_007, TestSize.Level1) int32_t pid = 8888; EXPECT_EQ(service->AudioWorkgroupCheck(pid), ERR_NOT_SUPPORTED); } +/** + * @tc.name : Test ImproveAudioWorkgroupPrio + * @tc.type : FUNC + * @tc.number: ImproveAudioWorkgroupPrio_001 + * @tc.desc : Test ImproveAudioWorkgroupPrio when threads map is not empty + */ +HWTEST(AudioResourceServiceUnitTest, ImproveAudioWorkgroupPrio_001, TestSize.Level0) +{ + AudioResourceService audioResourceService; + pid_t pid = 1234; + std::unordered_map threads = {{1, true}, {2, false}}; + int32_t result = audioResourceService.ImproveAudioWorkgroupPrio(pid, threads); + EXPECT_EQ(result, AUDIO_OK); +} + +/** + * @tc.name : Test ImproveAudioWorkgroupPrio + * @tc.type : FUNC + * @tc.number: ImproveAudioWorkgroupPrio_002 + * @tc.desc : Test ImproveAudioWorkgroupPrio when threads map is empty + */ +HWTEST(AudioResourceServiceUnitTest, ImproveAudioWorkgroupPrio_002, TestSize.Level0) +{ + AudioResourceService audioResourceService; + pid_t pid = 1234; + std::unordered_map threads = {}; + int32_t result = audioResourceService.ImproveAudioWorkgroupPrio(pid, threads); + EXPECT_EQ(result, AUDIO_OK); +} + +/** + * @tc.name : Test RestoreAudioWorkgroupPrio + * @tc.type : FUNC + * @tc.number: RestoreAudioWorkgroupPrio_001 + * @tc.desc : Test RestoreAudioWorkgroupPrio when threads map is empty + */ +HWTEST(AudioResourceServiceUnitTest, RestoreAudioWorkgroupPrio_001, TestSize.Level0) +{ + AudioResourceService audioResourceService; + pid_t pid = 1234; + std::unordered_map threads = {{1, 2}, {3, 4}}; + int32_t result = audioResourceService.RestoreAudioWorkgroupPrio(pid, threads); + EXPECT_EQ(result, AUDIO_OK); +} + +/** + * @tc.name : Test RestoreAudioWorkgroupPrio + * @tc.type : FUNC + * @tc.number: RestoreAudioWorkgroupPrio_002 + * @tc.desc : Test RestoreAudioWorkgroupPrio when threads map is empty + */ +HWTEST(AudioResourceServiceUnitTest, RestoreAudioWorkgroupPrio_002, TestSize.Level0) +{ + AudioResourceService audioResourceService; + pid_t pid = 1234; + std::unordered_map threads = {}; + int32_t result = audioResourceService.RestoreAudioWorkgroupPrio(pid, threads); + EXPECT_EQ(result, AUDIO_OK); +} + +/** + * @tc.name : Test FillAudioWorkgroupCgroupLimit + * @tc.type : FUNC + * @tc.number: FillAudioWorkgroupCgroupLimit_001 + * @tc.desc : Test FillAudioWorkgroupCgroupLimit when no used group id + */ +HWTEST(AudioResourceServiceUnitTest, FillAudioWorkgroupCgroupLimit_NoUsedGroupId, TestSize.Level0) +{ + AudioResourceService service; + int32_t pid = 2; + std::shared_ptr workgroup = std::make_shared(123); + service.FillAudioWorkgroupCgroupLimit(pid, workgroup); + EXPECT_EQ(workgroup->cgroupLimit.globalCgroupId, 0); + EXPECT_EQ(workgroup->cgroupLimit.clientPid, pid); +} + +/** + * @tc.name : Test FillAudioWorkgroupCgroupLimit + * @tc.type : FUNC + * @tc.number: FillAudioWorkgroupCgroupLimit_002 + * @tc.desc : Test FillAudioWorkgroupCgroupLimit when all group ids are used + */ +HWTEST(AudioResourceServiceUnitTest, FillAudioWorkgroupCgroupLimit_AllGroupIdsUsed, TestSize.Level0) +{ + AudioResourceService service; + int32_t pid = 4; + for (int i = 0; i < 4; ++i) { + auto g = std::make_shared(300+i); + g->SetCgroupLimitParams(pid, i); + service.audioWorkgroupMap_[pid].groups[i] = g; + } + std::shared_ptr workgroup = std::make_shared(888); + service.FillAudioWorkgroupCgroupLimit(pid, workgroup); + EXPECT_EQ(workgroup->cgroupLimit.globalCgroupId, -1); + EXPECT_EQ(workgroup->cgroupLimit.clientPid, pid); +} + +/** + * @tc.name : Test GetCgroupLimitId + * @tc.type : FUNC + * @tc.number: GetCgroupLimitId_001 + * @tc.desc : Test GetCgroupLimitId returns default value + */ +HWTEST(AudioWorkgroupUnitTest, GetCgroupLimitId_DefaultValue, TestSize.Level0) +{ + AudioWorkgroup workgroup(1); + EXPECT_EQ(workgroup.GetCgroupLimitId(), -1); +} + +/** + * @tc.name : Test SetCgroupLimitParams and GetCgroupLimitId + * @tc.type : FUNC + * @tc.number: SetCgroupLimitParams_001 + * @tc.desc : Test SetCgroupLimitParams sets globalCgroupId and can be retrieved by GetCgroupLimitId + */ +HWTEST(AudioWorkgroupUnitTest, SetCgroupLimitParams_SetAndGet, TestSize.Level0) +{ + AudioWorkgroup workgroup(2); + int32_t testPid = 100; + int32_t testCgroupId = 7; + workgroup.SetCgroupLimitParams(testPid, testCgroupId); + EXPECT_EQ(workgroup.GetCgroupLimitId(), testCgroupId); + EXPECT_EQ(workgroup.cgroupLimit.clientPid, testPid); +} + +/** + * @tc.name : Test SetCgroupLimitParams overwrite + * @tc.type : FUNC + * @tc.number: SetCgroupLimitParams_002 + * @tc.desc : Test SetCgroupLimitParams can overwrite previous values + */ +HWTEST(AudioWorkgroupUnitTest, SetCgroupLimitParams_Overwrite, TestSize.Level0) +{ + AudioWorkgroup workgroup(3); + workgroup.SetCgroupLimitParams(200, 5); + workgroup.SetCgroupLimitParams(201, 9); + EXPECT_EQ(workgroup.GetCgroupLimitId(), 9); + EXPECT_EQ(workgroup.cgroupLimit.clientPid, 201); +} } // namespace AudioStandard } // namespace OHOS \ No newline at end of file diff --git a/test/fuzztest/audioservermore_fuzzer/audio_server_more_fuzzer.cpp b/test/fuzztest/audioservermore_fuzzer/audio_server_more_fuzzer.cpp index 06e2a7fecd..92bd7a2c18 100644 --- a/test/fuzztest/audioservermore_fuzzer/audio_server_more_fuzzer.cpp +++ b/test/fuzztest/audioservermore_fuzzer/audio_server_more_fuzzer.cpp @@ -1,3 +1,4 @@ +dd /* * Copyright (c) 2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); @@ -931,6 +932,30 @@ void AudioServerGetVolumeBySessionIdFuzzTest(const uint8_t *rawData, size_t size audioServerPtr->GetVolumeBySessionId(sessionId, volume); } +void AudioServerImproveAudioWorkgroupPrioFuzzTest(const uint8_t *rawData, size_t size) +{ + if (rawData == nullptr || size < LIMITSIZE) { + return; + } + int32_t pid = GetData(); + int32_t value1 = GetData(); + unordered_map threads = {{value1, true}}; + std::shared_ptr audioServerPtr = std::make_shared(SYSTEM_ABILITY_ID, RUN_ON_CREATE); + audioServerPtr->ImproveAudioWorkgroupPrio(pid, threads); +} + +void AudioServerRestoreAudioWorkgroupPrioFuzzTest(const uint8_t *rawData, size_t size) +{ + if (rawData == nullptr || size < LIMITSIZE) { + return; + } + int32_t pid = GetData(); + int32_t value1 = GetData(); + int32_t value2 = GetData(); + unordered_map threads = {{value1, value2}}; + std::shared_ptr audioServerPtr = std::make_shared(SYSTEM_ABILITY_ID, RUN_ON_CREATE); + audioServerPtr->RestoreAudioWorkgroupPrio(pid, threads); +} } // namespace AudioStandard } // namesapce OHOS @@ -983,5 +1008,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) OHOS::AudioStandard::AudioServerHpaeDumpSourceOutputsInfoCbFuzzTest(data, size); OHOS::AudioStandard::AudioServerRemoveThreadFromGroupFuzzTest(data, size); OHOS::AudioStandard::AudioServerGetVolumeBySessionIdFuzzTest(data, size); + OHOS::AudioStandard::AudioServerImproveAudioWorkgroupPrioFuzzTest(data, size); + OHOS::AudioStandard::AudioServerRestoreAudioWorkgroupPrioFuzzTest(data, size); return 0; } -- Gitee From a5c5a7601e62902e18b9caf6f58203ddb7895fbf Mon Sep 17 00:00:00 2001 From: timelessxp Date: Thu, 28 Aug 2025 06:45:52 +0000 Subject: [PATCH 2/4] update services/audio_service/test/unittest/audio_resource_service_unit_test.cpp. Signed-off-by: timelessxp --- .../audio_resource_service_unit_test.cpp | 61 +------------------ 1 file changed, 1 insertion(+), 60 deletions(-) diff --git a/services/audio_service/test/unittest/audio_resource_service_unit_test.cpp b/services/audio_service/test/unittest/audio_resource_service_unit_test.cpp index 4afc349aed..b3db9ff702 100644 --- a/services/audio_service/test/unittest/audio_resource_service_unit_test.cpp +++ b/services/audio_service/test/unittest/audio_resource_service_unit_test.cpp @@ -905,66 +905,7 @@ HWTEST(AudioResourceServiceUnitTest, AudioWorkgroupCheck_007, TestSize.Level1) int32_t pid = 8888; EXPECT_EQ(service->AudioWorkgroupCheck(pid), ERR_NOT_SUPPORTED); } -/** - * @tc.name : Test ImproveAudioWorkgroupPrio - * @tc.type : FUNC - * @tc.number: ImproveAudioWorkgroupPrio_001 - * @tc.desc : Test ImproveAudioWorkgroupPrio when threads map is not empty - */ -HWTEST(AudioResourceServiceUnitTest, ImproveAudioWorkgroupPrio_001, TestSize.Level0) -{ - AudioResourceService audioResourceService; - pid_t pid = 1234; - std::unordered_map threads = {{1, true}, {2, false}}; - int32_t result = audioResourceService.ImproveAudioWorkgroupPrio(pid, threads); - EXPECT_EQ(result, AUDIO_OK); -} - -/** - * @tc.name : Test ImproveAudioWorkgroupPrio - * @tc.type : FUNC - * @tc.number: ImproveAudioWorkgroupPrio_002 - * @tc.desc : Test ImproveAudioWorkgroupPrio when threads map is empty - */ -HWTEST(AudioResourceServiceUnitTest, ImproveAudioWorkgroupPrio_002, TestSize.Level0) -{ - AudioResourceService audioResourceService; - pid_t pid = 1234; - std::unordered_map threads = {}; - int32_t result = audioResourceService.ImproveAudioWorkgroupPrio(pid, threads); - EXPECT_EQ(result, AUDIO_OK); -} - -/** - * @tc.name : Test RestoreAudioWorkgroupPrio - * @tc.type : FUNC - * @tc.number: RestoreAudioWorkgroupPrio_001 - * @tc.desc : Test RestoreAudioWorkgroupPrio when threads map is empty - */ -HWTEST(AudioResourceServiceUnitTest, RestoreAudioWorkgroupPrio_001, TestSize.Level0) -{ - AudioResourceService audioResourceService; - pid_t pid = 1234; - std::unordered_map threads = {{1, 2}, {3, 4}}; - int32_t result = audioResourceService.RestoreAudioWorkgroupPrio(pid, threads); - EXPECT_EQ(result, AUDIO_OK); -} - -/** - * @tc.name : Test RestoreAudioWorkgroupPrio - * @tc.type : FUNC - * @tc.number: RestoreAudioWorkgroupPrio_002 - * @tc.desc : Test RestoreAudioWorkgroupPrio when threads map is empty - */ -HWTEST(AudioResourceServiceUnitTest, RestoreAudioWorkgroupPrio_002, TestSize.Level0) -{ - AudioResourceService audioResourceService; - pid_t pid = 1234; - std::unordered_map threads = {}; - int32_t result = audioResourceService.RestoreAudioWorkgroupPrio(pid, threads); - EXPECT_EQ(result, AUDIO_OK); -} - + /** * @tc.name : Test FillAudioWorkgroupCgroupLimit * @tc.type : FUNC -- Gitee From 5e0cd4a5711b43dec1188589aab08e431ccd374b Mon Sep 17 00:00:00 2001 From: timelessxp Date: Thu, 28 Aug 2025 07:53:49 +0000 Subject: [PATCH 3/4] update test/fuzztest/audioservermore_fuzzer/audio_server_more_fuzzer.cpp. Signed-off-by: timelessxp --- .../fuzztest/audioservermore_fuzzer/audio_server_more_fuzzer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/test/fuzztest/audioservermore_fuzzer/audio_server_more_fuzzer.cpp b/test/fuzztest/audioservermore_fuzzer/audio_server_more_fuzzer.cpp index 92bd7a2c18..38d47f8f1c 100644 --- a/test/fuzztest/audioservermore_fuzzer/audio_server_more_fuzzer.cpp +++ b/test/fuzztest/audioservermore_fuzzer/audio_server_more_fuzzer.cpp @@ -1,4 +1,3 @@ -dd /* * Copyright (c) 2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); -- Gitee From 081c5c0199841f4f446e0c65bdfbaaf479b73185 Mon Sep 17 00:00:00 2001 From: timelessxp Date: Fri, 29 Aug 2025 01:28:05 +0000 Subject: [PATCH 4/4] update services/audio_service/server/src/audio_resource_service.cpp. Signed-off-by: timelessxp --- services/audio_service/server/src/audio_resource_service.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/audio_service/server/src/audio_resource_service.cpp b/services/audio_service/server/src/audio_resource_service.cpp index 4cc8be3d81..a40c448371 100644 --- a/services/audio_service/server/src/audio_resource_service.cpp +++ b/services/audio_service/server/src/audio_resource_service.cpp @@ -394,7 +394,7 @@ int32_t AudioResourceService::RestoreAudioWorkgroupPrio(int32_t pid, } void AudioResourceService::FillAudioWorkgroupCgroupLimit(int32_t pid, - std::shared_ptr& workgroup) + std::shared_ptr &workgroup) { if (workgroup == nullptr) { AUDIO_ERR_LOG("[WorkgroupInServer]workgroup is nullptr"); @@ -402,7 +402,7 @@ void AudioResourceService::FillAudioWorkgroupCgroupLimit(int32_t pid, } int32_t cgroupId = -1; std::set usedGroupLimitIds; - for (const auto& group : audioWorkgroupMap_[pid].groups) { + for (const auto &group : audioWorkgroupMap_[pid].groups) { int32_t currId = (group.second ? group.second->GetCgroupLimitId() : -1); if (currId != -1) { usedGroupLimitIds.insert(currId); -- Gitee