From 57cea7365ec98a004a584f3982a98d8c32568419 Mon Sep 17 00:00:00 2001 From: Mateusz Jablonski Date: Wed, 9 Nov 2022 11:18:06 +0000 Subject: [PATCH] Return submission status from flushTagUpdate method Related-To: NEO-7412 Signed-off-by: Mateusz Jablonski --- .../command_queue/blit_enqueue_1_tests.cpp | 2 +- ...and_stream_receiver_flush_task_2_tests.cpp | 4 +-- ...and_stream_receiver_flush_task_3_tests.cpp | 2 +- ...ceiver_flush_task_tests_xehp_and_later.cpp | 4 +-- .../command_stream_receiver_hw_2_tests.cpp | 2 +- .../ult_command_stream_receiver_fixture.h | 4 +-- opencl/test/unit_test/kernel/kernel_tests.cpp | 2 +- .../command_stream/command_stream_receiver.h | 2 +- .../command_stream_receiver_hw.h | 10 +++--- .../command_stream_receiver_hw_base.inl | 22 ++++++++----- .../mocks/mock_command_stream_receiver.h | 2 +- shared/test/common/mocks/mock_tbx_csr.h | 3 +- .../command_stream_receiver_tests.cpp | 33 +++++++++++++++++++ 13 files changed, 65 insertions(+), 27 deletions(-) diff --git a/opencl/test/unit_test/command_queue/blit_enqueue_1_tests.cpp b/opencl/test/unit_test/command_queue/blit_enqueue_1_tests.cpp index 035b0a85ed..e88da86e22 100644 --- a/opencl/test/unit_test/command_queue/blit_enqueue_1_tests.cpp +++ b/opencl/test/unit_test/command_queue/blit_enqueue_1_tests.cpp @@ -219,7 +219,7 @@ HWTEST_TEMPLATED_F(BlitAuxTranslationTests, givenBlitTranslationWhenConstructing HWTEST_TEMPLATED_F(BlitAuxTranslationTests, whenFlushTagUpdateThenMiFlushDwIsFlushed) { using MI_FLUSH_DW = typename FamilyType::MI_FLUSH_DW; - bcsCsr->flushTagUpdate(); + EXPECT_EQ(SubmissionStatus::SUCCESS, bcsCsr->flushTagUpdate()); auto cmdListBcs = getCmdList(bcsCsr->getCS(0), 0); diff --git a/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_2_tests.cpp b/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_2_tests.cpp index 42619588c5..2cf09607ec 100644 --- a/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_2_tests.cpp +++ b/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_2_tests.cpp @@ -558,7 +558,7 @@ HWTEST_F(CommandStreamReceiverFlushTaskTests, givenCommandStreamReceiverWhenFenc EXPECT_FALSE(csr.isMadeResident(csr.globalFenceAllocation)); EXPECT_FALSE(csr.isMadeNonResident(csr.globalFenceAllocation)); - flushSmallTask(csr); + EXPECT_EQ(SubmissionStatus::SUCCESS, flushSmallTask(csr)); EXPECT_TRUE(csr.isMadeResident(csr.globalFenceAllocation)); EXPECT_TRUE(csr.isMadeNonResident(csr.globalFenceAllocation)); @@ -575,7 +575,7 @@ HWTEST_F(CommandStreamReceiverFlushTaskTests, givenCommandStreamReceiverWhenFenc EXPECT_EQ(nullptr, csr.globalFenceAllocation); - flushSmallTask(csr); + EXPECT_EQ(SubmissionStatus::SUCCESS, flushSmallTask(csr)); ASSERT_EQ(nullptr, csr.globalFenceAllocation); } diff --git a/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_3_tests.cpp b/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_3_tests.cpp index 1ddf14f9b6..fb8ee5a948 100644 --- a/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_3_tests.cpp +++ b/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_3_tests.cpp @@ -157,7 +157,7 @@ HWTEST_F(CommandStreamReceiverFlushTaskTests, whenFlushSmallTaskThenCommandStrea auto &stream = csr.getCS(2 * MemoryConstants::cacheLineSize); stream.getSpace(MemoryConstants::cacheLineSize - sizeof(MI_BATCH_BUFFER_END) - 2); - csr.flushSmallTask(stream, stream.getUsed()); + EXPECT_EQ(SubmissionStatus::SUCCESS, csr.flushSmallTask(stream, stream.getUsed())); auto used = csr.commandStream.getUsed(); auto expected = 2 * MemoryConstants::cacheLineSize; diff --git a/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_tests_xehp_and_later.cpp b/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_tests_xehp_and_later.cpp index 25ec011c76..a1670254a7 100644 --- a/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_tests_xehp_and_later.cpp +++ b/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_tests_xehp_and_later.cpp @@ -972,7 +972,7 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, CommandStreamReceiverFlushTaskXeHPAndLaterMultiTile commandStreamReceiver.taskCount = 3; EXPECT_TRUE(commandStreamReceiver.staticWorkPartitioningEnabled); flushTask(commandStreamReceiver, true); - commandStreamReceiver.flushTagUpdate(); + EXPECT_EQ(SubmissionStatus::SUCCESS, commandStreamReceiver.flushTagUpdate()); EXPECT_EQ(2u, commandStreamReceiver.activePartitionsConfig); prepareLinearStream(commandStream, 0); @@ -1065,7 +1065,7 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, CommandStreamReceiverFlushTaskXeHPAndLaterMultiTile commandStreamReceiver.activePartitions = 2; commandStreamReceiver.taskCount = 3; commandStreamReceiver.staticWorkPartitioningEnabled = false; - commandStreamReceiver.flushTagUpdate(); + EXPECT_EQ(SubmissionStatus::SUCCESS, commandStreamReceiver.flushTagUpdate()); prepareLinearStream(commandStreamReceiver.commandStream, 0); verifyPipeControl(commandStreamReceiver, 4, false); diff --git a/opencl/test/unit_test/command_stream/command_stream_receiver_hw_2_tests.cpp b/opencl/test/unit_test/command_stream/command_stream_receiver_hw_2_tests.cpp index 0bd7302d2d..8c454e77f6 100644 --- a/opencl/test/unit_test/command_stream/command_stream_receiver_hw_2_tests.cpp +++ b/opencl/test/unit_test/command_stream/command_stream_receiver_hw_2_tests.cpp @@ -1465,7 +1465,7 @@ HWTEST_F(BcsTests, givenBlitterDirectSubmissionEnabledWhenFlushTagUpdateThenBatc bool initRet = directSubmission->initialize(true, false); EXPECT_TRUE(initRet); - csr.flushTagUpdate(); + EXPECT_EQ(SubmissionStatus::SUCCESS, csr.flushTagUpdate()); HardwareParse hwParser; hwParser.parseCommands(csr.commandStream, 0u); diff --git a/opencl/test/unit_test/fixtures/ult_command_stream_receiver_fixture.h b/opencl/test/unit_test/fixtures/ult_command_stream_receiver_fixture.h index 1a6cada359..1b9f08cfc2 100644 --- a/opencl/test/unit_test/fixtures/ult_command_stream_receiver_fixture.h +++ b/opencl/test/unit_test/fixtures/ult_command_stream_receiver_fixture.h @@ -110,8 +110,8 @@ struct UltCommandStreamReceiverTest } template - void flushSmallTask(CommandStreamReceiverType &commandStreamReceiver, - size_t startOffset = 0) { + SubmissionStatus flushSmallTask(CommandStreamReceiverType &commandStreamReceiver, + size_t startOffset = 0) { return commandStreamReceiver.flushSmallTask( commandStream, startOffset); diff --git a/opencl/test/unit_test/kernel/kernel_tests.cpp b/opencl/test/unit_test/kernel/kernel_tests.cpp index e31bf6b696..4c11896a89 100644 --- a/opencl/test/unit_test/kernel/kernel_tests.cpp +++ b/opencl/test/unit_test/kernel/kernel_tests.cpp @@ -504,7 +504,7 @@ class CommandStreamReceiverMock : public CommandStreamReceiver { TagAllocatorBase *getTimestampPacketAllocator() override { return nullptr; } - void flushTagUpdate() override{}; + SubmissionStatus flushTagUpdate() override { return SubmissionStatus::SUCCESS; }; void updateTagFromWait() override{}; bool isUpdateTagFromWaitEnabled() override { return false; }; void createKernelArgsBufferAllocation() override {} diff --git a/shared/source/command_stream/command_stream_receiver.h b/shared/source/command_stream/command_stream_receiver.h index 5fffac37ba..7450f95959 100644 --- a/shared/source/command_stream/command_stream_receiver.h +++ b/shared/source/command_stream/command_stream_receiver.h @@ -233,7 +233,7 @@ class CommandStreamReceiver { virtual uint32_t flushBcsTask(const BlitPropertiesContainer &blitPropertiesContainer, bool blocking, bool profilingEnabled, Device &device) = 0; - virtual void flushTagUpdate() = 0; + virtual SubmissionStatus flushTagUpdate() = 0; virtual void updateTagFromWait() = 0; virtual bool isUpdateTagFromWaitEnabled() = 0; diff --git a/shared/source/command_stream/command_stream_receiver_hw.h b/shared/source/command_stream/command_stream_receiver_hw.h index 9a57f5d960..b8f00e8542 100644 --- a/shared/source/command_stream/command_stream_receiver_hw.h +++ b/shared/source/command_stream/command_stream_receiver_hw.h @@ -99,11 +99,11 @@ class CommandStreamReceiverHw : public CommandStreamReceiver { uint32_t flushBcsTask(const BlitPropertiesContainer &blitPropertiesContainer, bool blocking, bool profilingEnabled, Device &device) override; - void flushTagUpdate() override; - void flushMiFlushDW(); - void flushPipeControl(); - void flushSmallTask(LinearStream &commandStreamTask, - size_t commandStreamStartTask); + SubmissionStatus flushTagUpdate() override; + SubmissionStatus flushMiFlushDW(); + SubmissionStatus flushPipeControl(); + SubmissionStatus flushSmallTask(LinearStream &commandStreamTask, + size_t commandStreamStartTask); SubmissionStatus flushHandler(BatchBuffer &batchBuffer, ResidencyContainer &allocationsForResidency); bool isUpdateTagFromWaitEnabled() override; diff --git a/shared/source/command_stream/command_stream_receiver_hw_base.inl b/shared/source/command_stream/command_stream_receiver_hw_base.inl index 0cf81a60b7..a5b62ed7ad 100644 --- a/shared/source/command_stream/command_stream_receiver_hw_base.inl +++ b/shared/source/command_stream/command_stream_receiver_hw_base.inl @@ -1195,18 +1195,19 @@ uint32_t CommandStreamReceiverHw::flushBcsTask(const BlitPropertiesCo } template -inline void CommandStreamReceiverHw::flushTagUpdate() { +inline SubmissionStatus CommandStreamReceiverHw::flushTagUpdate() { if (this->osContext != nullptr) { if (EngineHelpers::isBcs(this->osContext->getEngineType())) { - this->flushMiFlushDW(); + return this->flushMiFlushDW(); } else { - this->flushPipeControl(); + return this->flushPipeControl(); } } + return SubmissionStatus::DEVICE_UNINITIALIZED; } template -inline void CommandStreamReceiverHw::flushMiFlushDW() { +inline SubmissionStatus CommandStreamReceiverHw::flushMiFlushDW() { auto lock = obtainUniqueOwnership(); auto &commandStream = getCS(EncodeMiFlushDW::getMiFlushDwCmdSizeForDataWrite()); @@ -1220,12 +1221,13 @@ inline void CommandStreamReceiverHw::flushMiFlushDW() { makeResident(*tagAllocation); - this->flushSmallTask(commandStream, commandStreamStart); + auto submissionStatus = this->flushSmallTask(commandStream, commandStreamStart); this->latestFlushedTaskCount = taskCount.load(); + return submissionStatus; } template -void CommandStreamReceiverHw::flushPipeControl() { +SubmissionStatus CommandStreamReceiverHw::flushPipeControl() { auto lock = obtainUniqueOwnership(); const auto &hwInfo = peekHwInfo(); @@ -1247,12 +1249,13 @@ void CommandStreamReceiverHw::flushPipeControl() { makeResident(*tagAllocation); - this->flushSmallTask(commandStream, commandStreamStart); + auto submissionStatus = this->flushSmallTask(commandStream, commandStreamStart); this->latestFlushedTaskCount = taskCount.load(); + return submissionStatus; } template -void CommandStreamReceiverHw::flushSmallTask(LinearStream &commandStreamTask, size_t commandStreamStartTask) { +SubmissionStatus CommandStreamReceiverHw::flushSmallTask(LinearStream &commandStreamTask, size_t commandStreamStartTask) { using MI_BATCH_BUFFER_START = typename GfxFamily::MI_BATCH_BUFFER_START; using MI_BATCH_BUFFER_END = typename GfxFamily::MI_BATCH_BUFFER_END; @@ -1272,8 +1275,9 @@ void CommandStreamReceiverHw::flushSmallTask(LinearStream &commandStr commandStreamTask.getUsed(), &commandStreamTask, endingCmdPtr, false}; this->latestSentTaskCount = taskCount + 1; - flushHandler(batchBuffer, getResidencyAllocations()); + auto submissionStatus = flushHandler(batchBuffer, getResidencyAllocations()); taskCount++; + return submissionStatus; } template diff --git a/shared/test/common/mocks/mock_command_stream_receiver.h b/shared/test/common/mocks/mock_command_stream_receiver.h index 3313db9ec0..9e86d732a0 100644 --- a/shared/test/common/mocks/mock_command_stream_receiver.h +++ b/shared/test/common/mocks/mock_command_stream_receiver.h @@ -64,7 +64,7 @@ class MockCommandStreamReceiver : public CommandStreamReceiver { SubmissionStatus flush(BatchBuffer &batchBuffer, ResidencyContainer &allocationsForResidency) override; - void flushTagUpdate() override{}; + SubmissionStatus flushTagUpdate() override { return SubmissionStatus::SUCCESS; }; void updateTagFromWait() override{}; bool isUpdateTagFromWaitEnabled() override { return false; }; diff --git a/shared/test/common/mocks/mock_tbx_csr.h b/shared/test/common/mocks/mock_tbx_csr.h index d65e876765..c0c2d215e4 100644 --- a/shared/test/common/mocks/mock_tbx_csr.h +++ b/shared/test/common/mocks/mock_tbx_csr.h @@ -98,8 +98,9 @@ struct MockTbxCsrRegisterDownloadedAllocations : TbxCommandStreamReceiverHw obtainUniqueOwnership() override { diff --git a/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp b/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp index 8d8fa9d9f8..05114f4043 100644 --- a/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp +++ b/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp @@ -2377,4 +2377,37 @@ HWTEST_F(CommandStreamReceiverHwTest, givenOutOfDeviceMemoryFailureOnFlushWhenFl *pDevice); EXPECT_EQ(CompletionStamp::outOfDeviceMemory, completionStamp.taskCount); +} + +HWTEST_F(CommandStreamReceiverHwTest, givenOutOfMemoryFailureOnFlushWhenFlushingMiDWThenErrorIsPropagated) { + auto &commandStreamReceiver = pDevice->getUltCommandStreamReceiver(); + + commandStreamReceiver.flushReturnValue = SubmissionStatus::OUT_OF_MEMORY; + + EXPECT_EQ(SubmissionStatus::OUT_OF_MEMORY, commandStreamReceiver.flushMiFlushDW()); + + commandStreamReceiver.flushReturnValue = SubmissionStatus::OUT_OF_HOST_MEMORY; + EXPECT_EQ(SubmissionStatus::OUT_OF_HOST_MEMORY, commandStreamReceiver.flushMiFlushDW()); +} + +HWTEST_F(CommandStreamReceiverHwTest, givenOutOfMemoryFailureOnFlushWhenFlushingPipeControlThenErrorIsPropagated) { + auto &commandStreamReceiver = pDevice->getUltCommandStreamReceiver(); + + commandStreamReceiver.flushReturnValue = SubmissionStatus::OUT_OF_MEMORY; + + EXPECT_EQ(SubmissionStatus::OUT_OF_MEMORY, commandStreamReceiver.flushPipeControl()); + + commandStreamReceiver.flushReturnValue = SubmissionStatus::OUT_OF_HOST_MEMORY; + EXPECT_EQ(SubmissionStatus::OUT_OF_HOST_MEMORY, commandStreamReceiver.flushPipeControl()); +} + +HWTEST_F(CommandStreamReceiverHwTest, givenOutOfMemoryFailureOnFlushWhenFlushingTagUpdateThenErrorIsPropagated) { + auto &commandStreamReceiver = pDevice->getUltCommandStreamReceiver(); + + commandStreamReceiver.flushReturnValue = SubmissionStatus::OUT_OF_MEMORY; + + EXPECT_EQ(SubmissionStatus::OUT_OF_MEMORY, commandStreamReceiver.flushTagUpdate()); + + commandStreamReceiver.flushReturnValue = SubmissionStatus::OUT_OF_HOST_MEMORY; + EXPECT_EQ(SubmissionStatus::OUT_OF_HOST_MEMORY, commandStreamReceiver.flushTagUpdate()); } \ No newline at end of file