Skip to content

Commit 5961850

Browse files
fix: blink ULLS light
Related-To: NEO-13922 Signed-off-by: Lukasz Jobczyk <[email protected]>
1 parent 681ef36 commit 5961850

File tree

3 files changed

+76
-1
lines changed

3 files changed

+76
-1
lines changed

shared/source/direct_submission/linux/drm_direct_submission.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class DrmDirectSubmission : public DirectSubmissionHw<GfxFamily, Dispatcher> {
3939
bool isCompleted(uint32_t ringBufferIndex) override;
4040
bool isCompletionFenceSupported();
4141
bool isGpuHangDetected(std::chrono::high_resolution_clock::time_point &lastHangCheckTime);
42+
MOCKABLE_VIRTUAL std::chrono::steady_clock::time_point getCpuTimePoint();
4243

4344
MOCKABLE_VIRTUAL void wait(TaskCountType taskCountToWait);
4445

@@ -47,6 +48,9 @@ class DrmDirectSubmission : public DirectSubmissionHw<GfxFamily, Dispatcher> {
4748
TaskCountType completionFenceValue{};
4849
std::chrono::microseconds gpuHangCheckPeriod{CommonConstants::gpuHangCheckTimeInUS};
4950

51+
constexpr static size_t ullsLightTimeout = 2'000'000;
52+
std::chrono::steady_clock::time_point lastUllsLightExecTimestamp{};
53+
5054
std::vector<BufferObject *> residency{};
5155
std::vector<ExecObject> execObjectsStorage{};
5256
};

shared/source/direct_submission/linux/drm_direct_submission.inl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ bool DrmDirectSubmission<GfxFamily, Dispatcher>::submit(uint64_t gpuAddress, siz
141141

142142
if (!allocationsForResidency) {
143143
this->handleResidency();
144+
} else {
145+
this->lastUllsLightExecTimestamp = std::chrono::steady_clock::now();
144146
}
145147

146148
auto currentBase = this->ringCommandStream.getGraphicsAllocation()->getGpuAddress();
@@ -212,7 +214,8 @@ bool DrmDirectSubmission<GfxFamily, Dispatcher>::handleResidency() {
212214
template <typename GfxFamily, typename Dispatcher>
213215
void DrmDirectSubmission<GfxFamily, Dispatcher>::handleRingRestartForUllsLightResidency(ResidencyContainer *allocationsForResidency) {
214216
if (allocationsForResidency) {
215-
auto restartNeeded = static_cast<DrmMemoryOperationsHandler *>(this->memoryOperationHandler)->obtainAndResetNewResourcesSinceLastRingSubmit();
217+
auto restartNeeded = (static_cast<DrmMemoryOperationsHandler *>(this->memoryOperationHandler)->obtainAndResetNewResourcesSinceLastRingSubmit() ||
218+
std::chrono::duration_cast<std::chrono::microseconds>(this->getCpuTimePoint() - this->lastUllsLightExecTimestamp) > std::chrono::microseconds{ullsLightTimeout});
216219
if (restartNeeded) {
217220
this->stopRingBuffer(false);
218221
}
@@ -292,6 +295,11 @@ void DrmDirectSubmission<GfxFamily, Dispatcher>::wait(TaskCountType taskCountToW
292295
}
293296
}
294297

298+
template <typename GfxFamily, typename Dispatcher>
299+
std::chrono::steady_clock::time_point DrmDirectSubmission<GfxFamily, Dispatcher>::getCpuTimePoint() {
300+
return std::chrono::steady_clock::now();
301+
}
302+
295303
template <typename GfxFamily, typename Dispatcher>
296304
bool DrmDirectSubmission<GfxFamily, Dispatcher>::isGpuHangDetected(std::chrono::high_resolution_clock::time_point &lastHangCheckTime) {
297305
if (!this->detectGpuHang) {

shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ struct MockDrmDirectSubmission : public DrmDirectSubmission<GfxFamily, Dispatche
9393
using BaseClass::inputMonitorFenceDispatchRequirement;
9494
using BaseClass::isCompleted;
9595
using BaseClass::isNewResourceHandleNeeded;
96+
using BaseClass::lastUllsLightExecTimestamp;
9697
using BaseClass::miMemFenceRequired;
9798
using BaseClass::partitionConfigSet;
9899
using BaseClass::partitionedMode;
@@ -106,6 +107,16 @@ struct MockDrmDirectSubmission : public DrmDirectSubmission<GfxFamily, Dispatche
106107
using BaseClass::updateTagValue;
107108
using BaseClass::wait;
108109
using BaseClass::workPartitionAllocation;
110+
111+
MockDrmDirectSubmission(const DirectSubmissionInputParams &inputParams) : BaseClass(inputParams) {
112+
this->lastUllsLightExecTimestamp = std::chrono::time_point<std::chrono::steady_clock>::max();
113+
}
114+
115+
std::chrono::steady_clock::time_point getCpuTimePoint() override {
116+
return this->callBaseGetCpuTimePoint ? BaseClass::getCpuTimePoint() : cpuTimePointReturnValue;
117+
}
118+
std::chrono::steady_clock::time_point cpuTimePointReturnValue{};
119+
bool callBaseGetCpuTimePoint = true;
109120
};
110121

111122
using namespace NEO;
@@ -810,6 +821,58 @@ HWTEST_F(DrmDirectSubmissionTest, givenDirectSubmissionLightWhenRegisterResource
810821
executionEnvironment.memoryManager->freeGraphicsMemory(commandBuffer);
811822
}
812823

824+
HWTEST_F(DrmDirectSubmissionTest, givenDirectSubmissionLightWhenExecTimeoutReachedThenRestart) {
825+
using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL;
826+
using BATCH_BUFFER_END = typename FamilyType::MI_BATCH_BUFFER_END;
827+
MockDrmDirectSubmission<FamilyType, RenderDispatcher<FamilyType>> drmDirectSubmission(*device->getDefaultEngine().commandStreamReceiver);
828+
EXPECT_TRUE(drmDirectSubmission.initialize(false));
829+
830+
FlushStampTracker flushStamp(true);
831+
BatchBuffer batchBuffer = {};
832+
GraphicsAllocation *commandBuffer = nullptr;
833+
LinearStream stream;
834+
835+
const AllocationProperties commandBufferProperties{device->getRootDeviceIndex(), 0x1000,
836+
AllocationType::commandBuffer, device->getDeviceBitfield()};
837+
commandBuffer = executionEnvironment.memoryManager->allocateGraphicsMemoryWithProperties(commandBufferProperties);
838+
839+
stream.replaceGraphicsAllocation(commandBuffer);
840+
stream.replaceBuffer(commandBuffer->getUnderlyingBuffer(), commandBuffer->getUnderlyingBufferSize());
841+
stream.getSpace(0x20);
842+
843+
memset(stream.getCpuBase(), 0, 0x20);
844+
845+
batchBuffer.endCmdPtr = ptrOffset(stream.getCpuBase(), 0x20);
846+
batchBuffer.commandBufferAllocation = commandBuffer;
847+
batchBuffer.usedSize = 0x40;
848+
batchBuffer.taskStartAddress = 0x881112340000;
849+
batchBuffer.stream = &stream;
850+
batchBuffer.hasStallingCmds = true;
851+
852+
ResidencyContainer residencyContainer{};
853+
batchBuffer.allocationsForResidency = &residencyContainer;
854+
drmDirectSubmission.ringStart = true;
855+
static_cast<DrmMemoryOperationsHandler *>(executionEnvironment.rootDeviceEnvironments[device->getRootDeviceIndex()]->memoryOperationsInterface.get())->obtainAndResetNewResourcesSinceLastRingSubmit();
856+
857+
drmDirectSubmission.lastUllsLightExecTimestamp = std::chrono::steady_clock::time_point{};
858+
drmDirectSubmission.cpuTimePointReturnValue = std::chrono::time_point<std::chrono::steady_clock>::max();
859+
drmDirectSubmission.callBaseGetCpuTimePoint = false;
860+
861+
EXPECT_TRUE(drmDirectSubmission.dispatchCommandBuffer(batchBuffer, flushStamp));
862+
863+
HardwareParse hwParse;
864+
hwParse.parsePipeControl = true;
865+
hwParse.parseCommands<FamilyType>(drmDirectSubmission.ringCommandStream, 0);
866+
hwParse.findHardwareCommands<FamilyType>();
867+
auto *pipeControl = hwParse.getCommand<PIPE_CONTROL>();
868+
EXPECT_NE(pipeControl, nullptr);
869+
auto *bbe = hwParse.getCommand<BATCH_BUFFER_END>();
870+
EXPECT_NE(bbe, nullptr);
871+
872+
drmDirectSubmission.ringStart = false;
873+
executionEnvironment.memoryManager->freeGraphicsMemory(commandBuffer);
874+
}
875+
813876
HWTEST_F(DrmDirectSubmissionTest, givenDirectSubmissionLightWhenNoRegisteredResourcesThenNoRestart) {
814877
using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL;
815878
using BATCH_BUFFER_END = typename FamilyType::MI_BATCH_BUFFER_END;

0 commit comments

Comments
 (0)