fix: wrong return value of zeCommandQueueExecuteCommandLists when OOM

zeCommandQueueExecuteCommandLists return ZE_RESULT_ERROR_UNKNOWN when OOM
in some scenario of direct submission.

Related-To: NEO-7840

Signed-off-by: Pan Zhenjie <zhenjie.pan@intel.com>
This commit is contained in:
Zhenjie Pan
2023-03-24 09:01:23 +00:00
committed by Compute-Runtime-Automation
parent d77f2989c7
commit 1ce269a9dd
7 changed files with 68 additions and 18 deletions

View File

@@ -376,6 +376,29 @@ HWTEST_F(DrmDirectSubmissionTest, givenNoCompletionFenceSupportWhenSubmittingThe
ringBuffer->getBufferObjectToModify(0) = initialBO;
}
HWTEST_F(DrmDirectSubmissionTest, givenNoCompletionFenceSupportAndExecFailureWhenSubmittingThenGetDispatchErrorCode) {
uint64_t gpuAddress = 0x1000;
size_t size = 0x1000;
DebugManagerStateRestore restorer;
DebugManager.flags.EnableDrmCompletionFence.set(0);
MockDrmDirectSubmission<FamilyType, RenderDispatcher<FamilyType>> drmDirectSubmission(*device->getDefaultEngine().commandStreamReceiver);
drmDirectSubmission.completionFenceAllocation = nullptr;
EXPECT_TRUE(drmDirectSubmission.allocateResources());
auto ringBuffer = static_cast<DrmAllocation *>(drmDirectSubmission.ringBuffers[drmDirectSubmission.currentRingBuffer].ringBuffer);
auto initialBO = ringBuffer->getBufferObjectToModify(0);
auto drm = executionEnvironment.rootDeviceEnvironments[0]->osInterface->getDriverModel()->as<Drm>();
MockBufferObject mockBO(drm);
ringBuffer->getBufferObjectToModify(0) = &mockBO;
mockBO.execReturnValue = ENXIO;
EXPECT_FALSE(drmDirectSubmission.submit(gpuAddress, size));
EXPECT_EQ((uint32_t)ENXIO, drmDirectSubmission.getDispatchErrorCode());
ringBuffer->getBufferObjectToModify(0) = initialBO;
}
HWTEST_F(DrmDirectSubmissionTest, givenTile0AndCompletionFenceSupportWhenSubmittingThenCompletionAddressAndValueArePassedToExec) {
uint64_t gpuAddress = 0x1000;
size_t size = 0x1000;

View File

@@ -790,6 +790,10 @@ struct MockDrmDirectSubmissionDispatchCommandBuffer : public DrmDirectSubmission
ADDMETHOD_NOBASE(dispatchCommandBuffer, bool, false,
(BatchBuffer & batchBuffer, FlushStampTracker &flushStamp));
void setDispatchErrorCode(uint32_t errorCode) {
this->dispatchErrorCode = errorCode;
}
};
template <typename GfxFamily>
@@ -800,6 +804,10 @@ struct MockDrmBlitterDirectSubmissionDispatchCommandBuffer : public DrmDirectSub
ADDMETHOD_NOBASE(dispatchCommandBuffer, bool, false,
(BatchBuffer & batchBuffer, FlushStampTracker &flushStamp));
void setDispatchErrorCode(uint32_t errorCode) {
this->dispatchErrorCode = errorCode;
}
};
HWTEST_TEMPLATED_F(DrmCommandStreamDirectSubmissionTest, givenDirectSubmissionFailsThenFlushReturnsError) {
@@ -808,6 +816,7 @@ HWTEST_TEMPLATED_F(DrmCommandStreamDirectSubmissionTest, givenDirectSubmissionFa
testedCsr->directSubmission = std::make_unique<MockDrmDirectSubmissionDispatchCommandBuffer<FamilyType>>(*device->getDefaultEngine().commandStreamReceiver);
auto directSubmission = testedCsr->directSubmission.get();
static_cast<MockDrmDirectSubmissionDispatchCommandBuffer<FamilyType> *>(directSubmission)->dispatchCommandBufferResult = false;
static_cast<MockDrmDirectSubmissionDispatchCommandBuffer<FamilyType> *>(directSubmission)->setDispatchErrorCode(ENXIO);
auto &cs = csr->getCS();
CommandStreamReceiverHw<FamilyType>::addBatchBufferEnd(cs, nullptr);
@@ -819,7 +828,7 @@ HWTEST_TEMPLATED_F(DrmCommandStreamDirectSubmissionTest, givenDirectSubmissionFa
auto res = csr->flush(batchBuffer, csr->getResidencyAllocations());
EXPECT_GT(static_cast<MockDrmDirectSubmissionDispatchCommandBuffer<FamilyType> *>(directSubmission)->dispatchCommandBufferCalled, 0u);
EXPECT_EQ(NEO::SubmissionStatus::FAILED, res);
EXPECT_NE(NEO::SubmissionStatus::SUCCESS, res);
}
HWTEST_TEMPLATED_F(DrmCommandStreamBlitterDirectSubmissionTest, givenBlitterDirectSubmissionFailsThenFlushReturnsError) {
@@ -828,6 +837,7 @@ HWTEST_TEMPLATED_F(DrmCommandStreamBlitterDirectSubmissionTest, givenBlitterDire
testedCsr->blitterDirectSubmission = std::make_unique<MockDrmBlitterDirectSubmissionDispatchCommandBuffer<FamilyType>>(*csr);
auto blitterDirectSubmission = testedCsr->blitterDirectSubmission.get();
static_cast<MockDrmBlitterDirectSubmissionDispatchCommandBuffer<FamilyType> *>(blitterDirectSubmission)->dispatchCommandBufferResult = false;
static_cast<MockDrmBlitterDirectSubmissionDispatchCommandBuffer<FamilyType> *>(blitterDirectSubmission)->setDispatchErrorCode(ENXIO);
auto &cs = csr->getCS();
CommandStreamReceiverHw<FamilyType>::addBatchBufferEnd(cs, nullptr);
@@ -839,7 +849,7 @@ HWTEST_TEMPLATED_F(DrmCommandStreamBlitterDirectSubmissionTest, givenBlitterDire
auto res = csr->flush(batchBuffer, csr->getResidencyAllocations());
EXPECT_GT(static_cast<MockDrmBlitterDirectSubmissionDispatchCommandBuffer<FamilyType> *>(blitterDirectSubmission)->dispatchCommandBufferCalled, 0u);
EXPECT_EQ(NEO::SubmissionStatus::FAILED, res);
EXPECT_NE(NEO::SubmissionStatus::SUCCESS, res);
}
template <typename GfxFamily>