fix: disable fence wait if not supported on given CSR type
Signed-off-by: Bartosz Dunajski <bartosz.dunajski@intel.com>
This commit is contained in:
parent
d8a4f92856
commit
9629ab3cc3
|
@ -651,7 +651,7 @@ ze_result_t EventImp<TagSizeT>::hostSynchronize(uint64_t timeout) {
|
||||||
waitStartTime = std::chrono::high_resolution_clock::now();
|
waitStartTime = std::chrono::high_resolution_clock::now();
|
||||||
lastHangCheckTime = waitStartTime;
|
lastHangCheckTime = waitStartTime;
|
||||||
|
|
||||||
const bool fenceWait = isKmdWaitModeEnabled() && isCounterBased() && !this->tbxMode;
|
const bool fenceWait = isKmdWaitModeEnabled() && isCounterBased() && csrs[0]->waitUserFenceSupported();
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (fenceWait) {
|
if (fenceWait) {
|
||||||
|
|
|
@ -370,6 +370,7 @@ HWTEST2_F(InOrderCmdListTests, givenDebugFlagSetWhenEventHostSyncCalledThenCallW
|
||||||
|
|
||||||
auto ultCsr = static_cast<UltCommandStreamReceiver<FamilyType> *>(device->getNEODevice()->getDefaultEngine().commandStreamReceiver);
|
auto ultCsr = static_cast<UltCommandStreamReceiver<FamilyType> *>(device->getNEODevice()->getDefaultEngine().commandStreamReceiver);
|
||||||
|
|
||||||
|
ultCsr->isUserFenceWaitSupported = true;
|
||||||
ultCsr->waitUserFenceParams.forceRetStatusEnabled = true;
|
ultCsr->waitUserFenceParams.forceRetStatusEnabled = true;
|
||||||
ultCsr->waitUserFenceParams.forceRetStatusValue = false;
|
ultCsr->waitUserFenceParams.forceRetStatusValue = false;
|
||||||
EXPECT_EQ(0u, ultCsr->waitUserFenceParams.callCount);
|
EXPECT_EQ(0u, ultCsr->waitUserFenceParams.callCount);
|
||||||
|
@ -581,7 +582,7 @@ HWTEST2_F(InOrderCmdListTests, givenUserInterruptEventWhenWaitingThenWaitForUser
|
||||||
immCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, events[1]->toHandle(), 0, nullptr, launchParams, false);
|
immCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, events[1]->toHandle(), 0, nullptr, launchParams, false);
|
||||||
|
|
||||||
auto ultCsr = static_cast<UltCommandStreamReceiver<FamilyType> *>(device->getNEODevice()->getDefaultEngine().commandStreamReceiver);
|
auto ultCsr = static_cast<UltCommandStreamReceiver<FamilyType> *>(device->getNEODevice()->getDefaultEngine().commandStreamReceiver);
|
||||||
|
ultCsr->isUserFenceWaitSupported = true;
|
||||||
ultCsr->waitUserFenceParams.forceRetStatusEnabled = true;
|
ultCsr->waitUserFenceParams.forceRetStatusEnabled = true;
|
||||||
|
|
||||||
EXPECT_EQ(0u, ultCsr->waitUserFenceParams.callCount);
|
EXPECT_EQ(0u, ultCsr->waitUserFenceParams.callCount);
|
||||||
|
@ -606,6 +607,8 @@ HWTEST2_F(InOrderCmdListTests, givenUserInterruptEventAndTbxModeWhenWaitingThenD
|
||||||
ultCsr->waitUserFenceParams.forceRetStatusEnabled = true;
|
ultCsr->waitUserFenceParams.forceRetStatusEnabled = true;
|
||||||
ultCsr->commandStreamReceiverType = CommandStreamReceiverType::tbx;
|
ultCsr->commandStreamReceiverType = CommandStreamReceiverType::tbx;
|
||||||
|
|
||||||
|
EXPECT_FALSE(ultCsr->waitUserFenceSupported());
|
||||||
|
|
||||||
auto eventPool = createEvents<FamilyType>(2, false);
|
auto eventPool = createEvents<FamilyType>(2, false);
|
||||||
events[0]->enableKmdWaitMode();
|
events[0]->enableKmdWaitMode();
|
||||||
events[0]->enableInterruptMode();
|
events[0]->enableInterruptMode();
|
||||||
|
@ -642,7 +645,7 @@ HWTEST2_F(InOrderCmdListTests, givenUserInterruptEventWhenWaitingThenPassCorrect
|
||||||
duplicatedStorageImmCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, events[1]->toHandle(), 0, nullptr, launchParams, false);
|
duplicatedStorageImmCmdList->appendLaunchKernel(kernel->toHandle(), groupCount, events[1]->toHandle(), 0, nullptr, launchParams, false);
|
||||||
|
|
||||||
auto ultCsr = static_cast<UltCommandStreamReceiver<FamilyType> *>(device->getNEODevice()->getDefaultEngine().commandStreamReceiver);
|
auto ultCsr = static_cast<UltCommandStreamReceiver<FamilyType> *>(device->getNEODevice()->getDefaultEngine().commandStreamReceiver);
|
||||||
|
ultCsr->isUserFenceWaitSupported = true;
|
||||||
ultCsr->waitUserFenceParams.forceRetStatusEnabled = true;
|
ultCsr->waitUserFenceParams.forceRetStatusEnabled = true;
|
||||||
|
|
||||||
EXPECT_EQ(0u, ultCsr->waitUserFenceParams.callCount);
|
EXPECT_EQ(0u, ultCsr->waitUserFenceParams.callCount);
|
||||||
|
|
|
@ -519,6 +519,7 @@ class CommandStreamReceiver {
|
||||||
|
|
||||||
bool isRecyclingTagForHeapStorageRequired() const { return heapStorageRequiresRecyclingTag; }
|
bool isRecyclingTagForHeapStorageRequired() const { return heapStorageRequiresRecyclingTag; }
|
||||||
|
|
||||||
|
virtual bool waitUserFenceSupported() { return false; }
|
||||||
virtual bool waitUserFence(TaskCountType waitValue, uint64_t hostAddress, int64_t timeout, bool userInterrupt, uint32_t externalInterruptId, GraphicsAllocation *allocForInterruptWait) { return false; }
|
virtual bool waitUserFence(TaskCountType waitValue, uint64_t hostAddress, int64_t timeout, bool userInterrupt, uint32_t externalInterruptId, GraphicsAllocation *allocForInterruptWait) { return false; }
|
||||||
void setPrimaryCsr(CommandStreamReceiver *primaryCsr) {
|
void setPrimaryCsr(CommandStreamReceiver *primaryCsr) {
|
||||||
this->primaryCsr = primaryCsr;
|
this->primaryCsr = primaryCsr;
|
||||||
|
|
|
@ -64,6 +64,7 @@ class DrmCommandStreamReceiver : public DeviceCommandStreamReceiver<GfxFamily> {
|
||||||
|
|
||||||
SubmissionStatus printBOsForSubmit(ResidencyContainer &allocationsForResidency, GraphicsAllocation &cmdBufferAllocation);
|
SubmissionStatus printBOsForSubmit(ResidencyContainer &allocationsForResidency, GraphicsAllocation &cmdBufferAllocation);
|
||||||
|
|
||||||
|
bool waitUserFenceSupported() override { return isUserFenceWaitActive(); }
|
||||||
bool waitUserFence(TaskCountType waitValue, uint64_t hostAddress, int64_t timeout, bool userInterrupt, uint32_t externalInterruptId, GraphicsAllocation *allocForInterruptWait) override;
|
bool waitUserFence(TaskCountType waitValue, uint64_t hostAddress, int64_t timeout, bool userInterrupt, uint32_t externalInterruptId, GraphicsAllocation *allocForInterruptWait) override;
|
||||||
|
|
||||||
using CommandStreamReceiver::pageTableManager;
|
using CommandStreamReceiver::pageTableManager;
|
||||||
|
|
|
@ -530,6 +530,8 @@ class UltCommandStreamReceiver : public CommandStreamReceiverHw<GfxFamily>, publ
|
||||||
return BaseClass::waitUserFence(waitValue, hostAddress, timeout, userInterrupt, externalInterruptId, allocForInterruptWait);
|
return BaseClass::waitUserFence(waitValue, hostAddress, timeout, userInterrupt, externalInterruptId, allocForInterruptWait);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool waitUserFenceSupported() override { return isUserFenceWaitSupported; }
|
||||||
|
|
||||||
void unblockPagingFenceSemaphore(uint64_t pagingFenceValue) override {
|
void unblockPagingFenceSemaphore(uint64_t pagingFenceValue) override {
|
||||||
this->pagingFenceValueToUnblock = pagingFenceValue;
|
this->pagingFenceValueToUnblock = pagingFenceValue;
|
||||||
BaseClass::unblockPagingFenceSemaphore(pagingFenceValue);
|
BaseClass::unblockPagingFenceSemaphore(pagingFenceValue);
|
||||||
|
@ -619,6 +621,7 @@ class UltCommandStreamReceiver : public CommandStreamReceiverHw<GfxFamily>, publ
|
||||||
bool stopDirectSubmissionCalled = false;
|
bool stopDirectSubmissionCalled = false;
|
||||||
bool stopDirectSubmissionCalledBlocking = false;
|
bool stopDirectSubmissionCalledBlocking = false;
|
||||||
bool registeredDcFlushForDcFlushMitigation = false;
|
bool registeredDcFlushForDcFlushMitigation = false;
|
||||||
|
bool isUserFenceWaitSupported = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace NEO
|
} // namespace NEO
|
||||||
|
|
|
@ -121,6 +121,7 @@ TEST_F(CommandStreamReceiverTest, givenCsrWhenGettingCompletionAddressThenUnderl
|
||||||
|
|
||||||
TEST_F(CommandStreamReceiverTest, givenBaseCsrWhenCallingWaitUserFenceThenReturnFalse) {
|
TEST_F(CommandStreamReceiverTest, givenBaseCsrWhenCallingWaitUserFenceThenReturnFalse) {
|
||||||
EXPECT_FALSE(commandStreamReceiver->waitUserFence(1, commandStreamReceiver->getCompletionAddress(), -1, false, InterruptId::notUsed, nullptr));
|
EXPECT_FALSE(commandStreamReceiver->waitUserFence(1, commandStreamReceiver->getCompletionAddress(), -1, false, InterruptId::notUsed, nullptr));
|
||||||
|
EXPECT_FALSE(commandStreamReceiver->waitUserFenceSupported());
|
||||||
}
|
}
|
||||||
|
|
||||||
HWTEST_F(CommandStreamReceiverTest, WhenCreatingCsrThenDefaultValuesAreSet) {
|
HWTEST_F(CommandStreamReceiverTest, WhenCreatingCsrThenDefaultValuesAreSet) {
|
||||||
|
|
|
@ -233,6 +233,7 @@ HWTEST_TEMPLATED_F(DrmCommandStreamEnhancedTestDrmPrelim, givenExternalInterrupt
|
||||||
testDrmCsr->useUserFenceWait = true;
|
testDrmCsr->useUserFenceWait = true;
|
||||||
testDrmCsr->activePartitions = 2u;
|
testDrmCsr->activePartitions = 2u;
|
||||||
EXPECT_NE(0u, testDrmCsr->immWritePostSyncWriteOffset);
|
EXPECT_NE(0u, testDrmCsr->immWritePostSyncWriteOffset);
|
||||||
|
EXPECT_TRUE(testDrmCsr->waitUserFenceSupported());
|
||||||
|
|
||||||
auto rootExecEnvironment = executionEnvironment->rootDeviceEnvironments[0].get();
|
auto rootExecEnvironment = executionEnvironment->rootDeviceEnvironments[0].get();
|
||||||
auto &gfxCoreHelper = rootExecEnvironment->getHelper<GfxCoreHelper>();
|
auto &gfxCoreHelper = rootExecEnvironment->getHelper<GfxCoreHelper>();
|
||||||
|
|
Loading…
Reference in New Issue