From e08b06f8b8021cd6828625594cb80035ff6dee1a Mon Sep 17 00:00:00 2001 From: liangqi Date: Thu, 22 May 2025 15:05:20 +0800 Subject: [PATCH] unpack fail, SMQ reset Signed-off-by: liangqi --- .../display_command/display_cmd_requester.h | 30 +++++++------ .../display_command/display_cmd_responser.h | 21 ++++++--- .../display_command/display_cmd_requester.h | 28 +++++++----- .../display_command/display_cmd_responser.h | 43 +++++++++++-------- 4 files changed, 75 insertions(+), 47 deletions(-) diff --git a/display/composer/v1_0/display_command/display_cmd_requester.h b/display/composer/v1_0/display_command/display_cmd_requester.h index 327b3e53..5137c0a4 100755 --- a/display/composer/v1_0/display_command/display_cmd_requester.h +++ b/display/composer/v1_0/display_command/display_cmd_requester.h @@ -78,6 +78,12 @@ public: return HDF_FAILURE; } + replyData_.reset(new char[CmdUtils::INIT_ELEMENT_COUNT], std::default_delete()); + if (replyData_ == nullptr) { + HDF_LOGE("replyData alloc failed."); + return HDF_FAILURE; + } + ret = hdi_->GetCmdReply(reply_); DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: GetCmdReply failure, ret=%{public}d", __func__, ret)); @@ -94,7 +100,6 @@ public: { uint32_t replyEleCnt; std::vector outFds; - std::shared_ptr replyData; int32_t ret = CmdUtils::StartSection(REQUEST_CMD_PREPARE_DISPLAY_LAYERS, requestPacker_); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); @@ -108,10 +113,10 @@ public: ret = CmdUtils::EndPack(requestPacker_); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = DoRequest(replyEleCnt, outFds, replyData); + ret = DoRequest(replyEleCnt, outFds); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = DoReplyResults(replyEleCnt, outFds, replyData, [&](void *data) -> int32_t { + ret = DoReplyResults(replyEleCnt, outFds, [&](void *data) -> int32_t { needFlushFb = *(reinterpret_cast(data)); return HDF_SUCCESS; }); @@ -209,7 +214,6 @@ EXIT: { uint32_t replyEleCnt = 0; std::vector outFds; - std::shared_ptr replyData; int32_t ret = CmdUtils::StartSection(REQUEST_CMD_COMMIT, requestPacker_); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); @@ -223,10 +227,10 @@ EXIT: ret = CmdUtils::EndPack(requestPacker_); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = DoRequest(replyEleCnt, outFds, replyData); + ret = DoRequest(replyEleCnt, outFds); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = DoReplyResults(replyEleCnt, outFds, replyData, [&](void *data) -> int32_t { + ret = DoReplyResults(replyEleCnt, outFds, [&](void *data) -> int32_t { fence = *(reinterpret_cast(data)); return HDF_SUCCESS; }); @@ -836,11 +840,10 @@ protected: return HDF_SUCCESS; } - int32_t DoReplyResults(uint32_t replyEleCnt, std::vector& replyFds, std::shared_ptr replyData, - std::function fn) + int32_t DoReplyResults(uint32_t replyEleCnt, std::vector& replyFds, std::function fn) { CommandDataUnpacker replyUnpacker; - replyUnpacker.Init(replyData.get(), replyEleCnt << CmdUtils::MOVE_SIZE); + replyUnpacker.Init(replyData_.get(), replyEleCnt << CmdUtils::MOVE_SIZE); #ifdef DEBUG_DISPLAY_CMD_RAW_DATA replyUnpacker.Dump(); #endif // DEBUG_DISPLAY_CMD_RAW_DATA @@ -865,7 +868,7 @@ protected: return HDF_SUCCESS; } - int32_t DoRequest(uint32_t &replyEleCnt, std::vector &outFds, std::shared_ptr &replyData) + int32_t DoRequest(uint32_t &replyEleCnt, std::vector &outFds) { #ifdef DEBUG_DISPLAY_CMD_RAW_DATA requestPacker_.Dump(); @@ -881,10 +884,8 @@ protected: HDF_LOGE("%{public}s: CmdRequest failed", __func__)); if (replyEleCnt != 0) { - replyData.reset(new char[replyEleCnt << CmdUtils::MOVE_SIZE], std::default_delete()); - DISPLAY_CHK_RETURN(replyData == nullptr, HDF_FAILURE, - HDF_LOGE("%{public}s: get replyData failed", __func__)); - ret = reply_->Read(reinterpret_cast(replyData.get()), replyEleCnt, CmdUtils::TRANSFER_WAIT_TIME); + ret = reply_->Read(reinterpret_cast(replyData_.get()), + replyEleCnt, CmdUtils::TRANSFER_WAIT_TIME); if (ret != HDF_SUCCESS) { HDF_LOGE("reply read data failure, ret=%{public}d", ret); } @@ -914,6 +915,7 @@ protected: sptr hdi_; std::shared_ptr request_; std::shared_ptr reply_; + std::shared_ptr replyData_; // Period data CommandDataPacker requestPacker_; std::vector requestHdiFds_; diff --git a/display/composer/v1_0/display_command/display_cmd_responser.h b/display/composer/v1_0/display_command/display_cmd_responser.h index bf387c2f..12cc8c78 100755 --- a/display/composer/v1_0/display_command/display_cmd_responser.h +++ b/display/composer/v1_0/display_command/display_cmd_responser.h @@ -100,6 +100,11 @@ public: request_.reset(); } request_ = request; + requestData_.reset(new char[CmdUtils::INIT_ELEMENT_COUNT], std::default_delete()); + if (requestData_ == nullptr) { + HDF_LOGE("requestData alloc failed."); + return HDF_FAILURE; + } return HDF_SUCCESS; } @@ -164,10 +169,15 @@ public: HDF_LOGE("%{public}s: inEleCnt:%{public}u is too large", __func__, inEleCnt); return HDF_FAILURE; } - std::shared_ptr requestData(new char[inEleCnt * CmdUtils::ELEMENT_SIZE], std::default_delete()); - int32_t ret = CmdRequestDataRead(requestData, inEleCnt); + + int32_t ret = HDF_SUCCESS; + { + std::lock_guard lock(requestMutex_); + ret = request_->Read(reinterpret_cast(requestData_.get()), inEleCnt, + CmdUtils::TRANSFER_WAIT_TIME); + } CommandDataUnpacker unpacker; - unpacker.Init(requestData.get(), inEleCnt << CmdUtils::MOVE_SIZE); + unpacker.Init(requestData_.get(), inEleCnt << CmdUtils::MOVE_SIZE); #ifdef DEBUG_DISPLAY_CMD_RAW_DATA unpacker.Dump(); #endif // DEBUG_DISPLAY_CMD_RAW_DATA @@ -737,7 +747,7 @@ EXIT: if (ret != HDF_SUCCESS) { errMaps_.emplace(REQUEST_CMD_SET_LAYER_TRANSFORM_MODE, ret); } - + return; } @@ -904,7 +914,7 @@ EXIT: struct LayerBufferData data; std::vector deletingList; - + int32_t ret = UnPackLayerBufferInfo(unpacker, inFds, &data, deletingList); HdifdParcelable fdParcel(data.fence); bool needFreeBuffer = false; @@ -1175,6 +1185,7 @@ protected: std::queue delayFreeQueue_; std::mutex requestMutex_; std::mutex replyMutex_; + std::shared_ptr requestData_; }; using HdiDisplayCmdResponser = DisplayCmdResponser, DisplayComposerVdiAdapter>; } // namespace V1_0 diff --git a/display/composer/v1_2/display_command/display_cmd_requester.h b/display/composer/v1_2/display_command/display_cmd_requester.h index 0d6bb089..b7bf3701 100644 --- a/display/composer/v1_2/display_command/display_cmd_requester.h +++ b/display/composer/v1_2/display_command/display_cmd_requester.h @@ -52,7 +52,6 @@ public: { uint32_t replyEleCnt = 0; std::vector outFds; - std::shared_ptr replyData; int32_t ret = CmdUtils::StartSection(REQUEST_CMD_COMMIT_AND_GET_RELEASE_FENCE, requestPacker_); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); @@ -72,10 +71,10 @@ public: ret = CmdUtils::EndPack(requestPacker_); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = DoRequest(replyEleCnt, outFds, replyData); + ret = DoRequest(replyEleCnt, outFds); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = DoReplyResults(replyEleCnt, outFds, replyData, [&](void *data) -> int32_t { + ret = DoReplyResults(replyEleCnt, outFds, [&](void *data) -> int32_t { FenceData *fenceData = reinterpret_cast(data); if (fenceData == nullptr) { fence = -1; @@ -188,7 +187,6 @@ EXIT: HDF_LOGE("%{public}s: HDI 1.2 FileDescriptorUnpack failed", __func__)); } } - return HDF_SUCCESS; } @@ -218,18 +216,17 @@ EXIT: __func__, CmdUtils::CommandToString(unpackCmd))); break; default: - HDF_LOGE("Unpack command failure"); + HDF_LOGE("Unpack command failure, unpackCmd=%{public}d", unpackCmd); return HDF_FAILURE; } } return HDF_SUCCESS; } - int32_t DoReplyResults(uint32_t replyEleCnt, std::vector& replyFds, std::shared_ptr replyData, - std::function fn) + int32_t DoReplyResults(uint32_t replyEleCnt, std::vector& replyFds, std::function fn) { CommandDataUnpacker replyUnpacker; - replyUnpacker.Init(replyData.get(), replyEleCnt << CmdUtils::MOVE_SIZE); + replyUnpacker.Init(replyData_.get(), replyEleCnt << CmdUtils::MOVE_SIZE); #ifdef DEBUG_DISPLAY_CMD_RAW_DATA replyUnpacker.Dump(); #endif // DEBUG_DISPLAY_CMD_RAW_DATA @@ -237,9 +234,16 @@ EXIT: bool retBool = replyUnpacker.PackBegin(unpackCmd); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: PackBegin failed", __func__)); - DISPLAY_CHK_RETURN(unpackCmd != CONTROL_CMD_REPLY_BEGIN, HDF_FAILURE, - HDF_LOGE("%{public}s: PackBegin cmd not match, unpackCmd=%{public}d", __func__, unpackCmd)); + if (unpackCmd != CONTROL_CMD_REPLY_BEGIN) { + HDF_LOGE("%{public}s: PackBegin cmd not match, unpackCmd=%{public}d", __func__, unpackCmd); + request_->Reset(); + reply_->Reset(); + return HDF_FAILURE; + } if (ProcessUnpackCmd(replyUnpacker, unpackCmd, replyFds, fn) != HDF_SUCCESS) { + HDF_LOGE("%{public}s: ProcessUnpackCmd failed, unpackCmd=%{public}d", __func__, unpackCmd); + request_->Reset(); + reply_->Reset(); return HDF_FAILURE; } @@ -413,10 +417,12 @@ protected: sptr hdi_1_2_; private: using BaseType1_1 = V1_1::DisplayCmdRequester; + using BaseType1_1::request_; + using BaseType1_1::reply_; using BaseType1_1::requestPacker_; + using BaseType1_1::replyData_; using BaseType1_1::DoRequest; using BaseType1_1::PeriodDataReset; - using BaseType1_1::DoReplyResults; // Composition layers/types changed using BaseType1_1::compChangeLayers_; diff --git a/display/composer/v1_2/display_command/display_cmd_responser.h b/display/composer/v1_2/display_command/display_cmd_responser.h index c9d51f1d..79243346 100644 --- a/display/composer/v1_2/display_command/display_cmd_responser.h +++ b/display/composer/v1_2/display_command/display_cmd_responser.h @@ -119,6 +119,7 @@ public: DISPLAY_CHECK(replyPacker_.WriteInt32(commitInfo.skipRet) == false, HDF_LOGE("%{public}s, write skip validate return value error", __func__)); + if (commitInfo.skipRet != HDF_SUCCESS) { ReplyNotSkipInfo(devId, commitInfo); } else { @@ -223,14 +224,17 @@ REPLY: ReplyCommitAndGetReleaseFence(outFds, devId, commitInfo); } - int32_t CmdRequest(uint32_t inEleCnt, const std::vector& inFds, uint32_t& outEleCnt, - std::vector& outFds) + int32_t CmdRequest(uint32_t inEleCnt, const std::vector& inFds, + uint32_t& outEleCnt, std::vector& outFds) { - std::shared_ptr requestData(new char[inEleCnt * CmdUtils::ELEMENT_SIZE], std::default_delete()); - int32_t ret = CmdRequestDataRead(requestData, inEleCnt); - + int32_t ret = HDF_SUCCESS; + { + std::lock_guard lock(requestMutex_); + ret = request_->Read(reinterpret_cast(requestData_.get()), inEleCnt, + CmdUtils::TRANSFER_WAIT_TIME); + } CommandDataUnpacker unpacker; - unpacker.Init(requestData.get(), inEleCnt << CmdUtils::MOVE_SIZE); + unpacker.Init(requestData_.get(), inEleCnt << CmdUtils::MOVE_SIZE); #ifdef DEBUG_DISPLAY_CMD_RAW_DATA unpacker.Dump(); #endif // DEBUG_DISPLAY_CMD_RAW_DATA @@ -239,24 +243,28 @@ REPLY: bool retBool = unpacker.PackBegin(unpackCmd); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: error: Check RequestBegin failed", __func__)); - DISPLAY_CHK_RETURN(unpackCmd != CONTROL_CMD_REQUEST_BEGIN, HDF_FAILURE, - HDF_LOGI("error: unpacker PackBegin cmd not match, cmd(%{public}d)=%{public}s.", unpackCmd, - CmdUtils::CommandToString(unpackCmd))); + if (unpackCmd != CONTROL_CMD_REQUEST_BEGIN) { + HDF_LOGE("error: unpacker PackBegin cmd not match, cmd(%{public}d)=%{public}s.", unpackCmd, + CmdUtils::CommandToString(unpackCmd)); + request_->Reset(); + reply_->Reset(); + return HDF_FAILURE; + } DISPLAY_CHK_RETURN(PeriodDataReset() == HDF_FAILURE, HDF_FAILURE, HDF_LOGE("%{public}s: error: PeriodDataReset failed", __func__)); - while (ret == HDF_SUCCESS && unpacker.NextSection()) { - if (!unpacker.BeginSection(unpackCmd)) { + while (unpacker.NextSection()) { + DISPLAY_CHK_RETURN(unpacker.BeginSection(unpackCmd) == false, HDF_FAILURE, HDF_LOGE("error: PackSection failed, unpackCmd=%{public}s.", - CmdUtils::CommandToString(unpackCmd)); - ret = HDF_FAILURE; - break; + CmdUtils::CommandToString(unpackCmd))); + if (ProcessRequestCmd(unpacker, unpackCmd, inFds, outFds) != HDF_SUCCESS) { + HDF_LOGE("%{public}s: ProcessRequestCmd failed, unpackCmd=%{public}d", __func__, unpackCmd); + request_->Reset(); + reply_->Reset(); + return HDF_FAILURE; } - ret = ProcessRequestCmd(unpacker, unpackCmd, inFds, outFds); } - DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, - HDF_LOGE("%{public}s: ProcessRequestCmd failed", __func__)); /* pack request end commands */ replyPacker_.PackEnd(CONTROL_CMD_REPLY_END); @@ -458,6 +466,7 @@ private: using BaseType1_1::CmdRequestDataWrite; using BaseType1_1::requestMutex_; using BaseType1_1::replyMutex_; + using BaseType1_1::requestData_; }; using HdiDisplayCmdResponser = DisplayCmdResponser, DisplayComposerVdiAdapter>; -- Gitee