Skip to content

Commit ca45573

Browse files
fix: Handle new ring buffer residency when switch ULLS light ring
Related-To: NEO-14406, NEO-13922 Signed-off-by: Lukasz Jobczyk <[email protected]>
1 parent ff1dcc1 commit ca45573

File tree

6 files changed

+51
-19
lines changed

6 files changed

+51
-19
lines changed

shared/source/direct_submission/direct_submission_hw.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ class DirectSubmissionHw {
115115
virtual bool submit(uint64_t gpuAddress, size_t size, const ResidencyContainer *allocationsForResidency) = 0;
116116
virtual bool handleResidency() = 0;
117117
virtual void handleRingRestartForUllsLightResidency(const ResidencyContainer *allocationsForResidency){};
118+
virtual void handleResidencyContainerForUllsLightNewRingAllocation(ResidencyContainer *allocationsForResidency){};
118119
void handleNewResourcesSubmission();
119120
bool isNewResourceHandleNeeded();
120121
size_t getSizeNewResourceHandler();
@@ -123,7 +124,7 @@ class DirectSubmissionHw {
123124
void switchRingBuffersNeeded(size_t size, ResidencyContainer *allocationsForResidency);
124125
uint64_t switchRingBuffers(ResidencyContainer *allocationsForResidency);
125126
virtual void handleSwitchRingBuffers(ResidencyContainer *allocationsForResidency) = 0;
126-
GraphicsAllocation *switchRingBuffersAllocations();
127+
GraphicsAllocation *switchRingBuffersAllocations(ResidencyContainer *allocationsForResidency);
127128

128129
constexpr static uint64_t updateTagValueFail = std::numeric_limits<uint64_t>::max();
129130
virtual uint64_t updateTagValue(bool requireMonitorFence) = 0;

shared/source/direct_submission/direct_submission_hw.inl

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,7 +1098,10 @@ void DirectSubmissionHw<GfxFamily, Dispatcher>::switchRingBuffersNeeded(size_t s
10981098

10991099
template <typename GfxFamily, typename Dispatcher>
11001100
inline uint64_t DirectSubmissionHw<GfxFamily, Dispatcher>::switchRingBuffers(ResidencyContainer *allocationsForResidency) {
1101-
GraphicsAllocation *nextRingBuffer = switchRingBuffersAllocations();
1101+
GraphicsAllocation *nextRingBuffer = switchRingBuffersAllocations(allocationsForResidency);
1102+
1103+
this->handleRingRestartForUllsLightResidency(allocationsForResidency);
1104+
11021105
void *flushPtr = ringCommandStream.getSpace(0);
11031106
uint64_t currentBufferGpuVa = ringCommandStream.getCurrentGpuAddressPosition();
11041107

@@ -1116,7 +1119,7 @@ inline uint64_t DirectSubmissionHw<GfxFamily, Dispatcher>::switchRingBuffers(Res
11161119
}
11171120

11181121
template <typename GfxFamily, typename Dispatcher>
1119-
inline GraphicsAllocation *DirectSubmissionHw<GfxFamily, Dispatcher>::switchRingBuffersAllocations() {
1122+
inline GraphicsAllocation *DirectSubmissionHw<GfxFamily, Dispatcher>::switchRingBuffersAllocations(ResidencyContainer *allocationsForResidency) {
11201123
this->previousRingBuffer = this->currentRingBuffer;
11211124
GraphicsAllocation *nextAllocation = nullptr;
11221125
for (uint32_t ringBufferIndex = 0; ringBufferIndex < this->ringBuffers.size(); ringBufferIndex++) {
@@ -1145,6 +1148,8 @@ inline GraphicsAllocation *DirectSubmissionHw<GfxFamily, Dispatcher>::switchRing
11451148
this->ringBuffers.emplace_back(0ull, nextAllocation);
11461149
auto ret = memoryOperationHandler->makeResidentWithinOsContext(&this->osContext, ArrayRef<GraphicsAllocation *>(&nextAllocation, 1u), false, false, false) == MemoryOperationsStatus::success;
11471150
UNRECOVERABLE_IF(!ret);
1151+
1152+
this->handleResidencyContainerForUllsLightNewRingAllocation(allocationsForResidency);
11481153
}
11491154
}
11501155
UNRECOVERABLE_IF(this->currentRingBuffer == this->previousRingBuffer);

shared/source/direct_submission/linux/drm_direct_submission.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class DrmDirectSubmission : public DirectSubmissionHw<GfxFamily, Dispatcher> {
3030

3131
bool handleResidency() override;
3232
void handleRingRestartForUllsLightResidency(const ResidencyContainer *allocationsForResidency) override;
33+
void handleResidencyContainerForUllsLightNewRingAllocation(ResidencyContainer *allocationsForResidency) override;
3334
void handleStopRingBuffer() override;
3435

3536
void ensureRingCompletion() override;

shared/source/direct_submission/linux/drm_direct_submission.inl

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,14 @@ void DrmDirectSubmission<GfxFamily, Dispatcher>::handleRingRestartForUllsLightRe
227227
}
228228
}
229229

230+
template <typename GfxFamily, typename Dispatcher>
231+
inline void DrmDirectSubmission<GfxFamily, Dispatcher>::handleResidencyContainerForUllsLightNewRingAllocation(ResidencyContainer *allocationsForResidency) {
232+
if (allocationsForResidency) {
233+
allocationsForResidency->clear();
234+
static_cast<DrmMemoryOperationsHandler *>(this->memoryOperationHandler)->mergeWithResidencyContainer(&this->osContext, *allocationsForResidency);
235+
}
236+
}
237+
230238
template <typename GfxFamily, typename Dispatcher>
231239
void DrmDirectSubmission<GfxFamily, Dispatcher>::handleStopRingBuffer() {
232240
if (this->disableMonitorFence) {
@@ -248,11 +256,6 @@ void DrmDirectSubmission<GfxFamily, Dispatcher>::handleSwitchRingBuffers(Residen
248256
this->ringBuffers[this->previousRingBuffer].completionFence = this->currentTagData.tagValue;
249257
}
250258
}
251-
252-
if (allocationsForResidency) {
253-
allocationsForResidency->clear();
254-
static_cast<DrmMemoryOperationsHandler *>(this->memoryOperationHandler)->mergeWithResidencyContainer(&this->osContext, *allocationsForResidency);
255-
}
256259
}
257260

258261
template <typename GfxFamily, typename Dispatcher>

shared/test/unit_test/direct_submission/direct_submission_tests_1.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionSwitchBuffersWhenCurrentIsPr
336336
EXPECT_TRUE(ret);
337337
EXPECT_EQ(0u, directSubmission.currentRingBuffer);
338338

339-
GraphicsAllocation *nextRing = directSubmission.switchRingBuffersAllocations();
339+
GraphicsAllocation *nextRing = directSubmission.switchRingBuffersAllocations(nullptr);
340340
EXPECT_EQ(directSubmission.ringBuffers[1].ringBuffer, nextRing);
341341
EXPECT_EQ(1u, directSubmission.currentRingBuffer);
342342
}
@@ -348,11 +348,11 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionSwitchBuffersWhenCurrentIsSe
348348
EXPECT_TRUE(ret);
349349
EXPECT_EQ(0u, directSubmission.currentRingBuffer);
350350

351-
GraphicsAllocation *nextRing = directSubmission.switchRingBuffersAllocations();
351+
GraphicsAllocation *nextRing = directSubmission.switchRingBuffersAllocations(nullptr);
352352
EXPECT_EQ(directSubmission.ringBuffers[1].ringBuffer, nextRing);
353353
EXPECT_EQ(1u, directSubmission.currentRingBuffer);
354354

355-
nextRing = directSubmission.switchRingBuffersAllocations();
355+
nextRing = directSubmission.switchRingBuffersAllocations(nullptr);
356356
EXPECT_EQ(directSubmission.ringBuffers[0].ringBuffer, nextRing);
357357
EXPECT_EQ(0u, directSubmission.currentRingBuffer);
358358
}
@@ -368,46 +368,46 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionCurrentRingBuffersInUseWhenS
368368
EXPECT_EQ(0u, directSubmission.currentRingBuffer);
369369
EXPECT_EQ(2u, directSubmission.ringBuffers.size());
370370

371-
auto nextRing = directSubmission.switchRingBuffersAllocations();
371+
auto nextRing = directSubmission.switchRingBuffersAllocations(nullptr);
372372
EXPECT_EQ(3u, directSubmission.ringBuffers.size());
373373
EXPECT_EQ(directSubmission.ringBuffers[2].ringBuffer, nextRing);
374374
EXPECT_EQ(2u, directSubmission.currentRingBuffer);
375375

376-
nextRing = directSubmission.switchRingBuffersAllocations();
376+
nextRing = directSubmission.switchRingBuffersAllocations(nullptr);
377377
EXPECT_EQ(4u, directSubmission.ringBuffers.size());
378378
EXPECT_EQ(directSubmission.ringBuffers[3].ringBuffer, nextRing);
379379
EXPECT_EQ(3u, directSubmission.currentRingBuffer);
380380

381381
directSubmission.isCompletedReturn = true;
382382

383-
nextRing = directSubmission.switchRingBuffersAllocations();
383+
nextRing = directSubmission.switchRingBuffersAllocations(nullptr);
384384
EXPECT_EQ(4u, directSubmission.ringBuffers.size());
385385
EXPECT_EQ(directSubmission.ringBuffers[0].ringBuffer, nextRing);
386386
EXPECT_EQ(0u, directSubmission.currentRingBuffer);
387387

388-
nextRing = directSubmission.switchRingBuffersAllocations();
388+
nextRing = directSubmission.switchRingBuffersAllocations(nullptr);
389389
EXPECT_EQ(4u, directSubmission.ringBuffers.size());
390390
EXPECT_EQ(directSubmission.ringBuffers[1].ringBuffer, nextRing);
391391
EXPECT_EQ(1u, directSubmission.currentRingBuffer);
392392

393-
nextRing = directSubmission.switchRingBuffersAllocations();
393+
nextRing = directSubmission.switchRingBuffersAllocations(nullptr);
394394
EXPECT_EQ(4u, directSubmission.ringBuffers.size());
395395
EXPECT_EQ(directSubmission.ringBuffers[0].ringBuffer, nextRing);
396396
EXPECT_EQ(0u, directSubmission.currentRingBuffer);
397397

398-
nextRing = directSubmission.switchRingBuffersAllocations();
398+
nextRing = directSubmission.switchRingBuffersAllocations(nullptr);
399399
EXPECT_EQ(4u, directSubmission.ringBuffers.size());
400400
EXPECT_EQ(directSubmission.ringBuffers[1].ringBuffer, nextRing);
401401
EXPECT_EQ(1u, directSubmission.currentRingBuffer);
402402

403-
nextRing = directSubmission.switchRingBuffersAllocations();
403+
nextRing = directSubmission.switchRingBuffersAllocations(nullptr);
404404
EXPECT_EQ(4u, directSubmission.ringBuffers.size());
405405
EXPECT_EQ(directSubmission.ringBuffers[0].ringBuffer, nextRing);
406406
EXPECT_EQ(0u, directSubmission.currentRingBuffer);
407407

408408
directSubmission.isCompletedReturn = false;
409409

410-
nextRing = directSubmission.switchRingBuffersAllocations();
410+
nextRing = directSubmission.switchRingBuffersAllocations(nullptr);
411411
EXPECT_EQ(5u, directSubmission.ringBuffers.size());
412412
EXPECT_EQ(directSubmission.ringBuffers[4].ringBuffer, nextRing);
413413
EXPECT_EQ(4u, directSubmission.currentRingBuffer);

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ struct MockDrmDirectSubmission : public DrmDirectSubmission<GfxFamily, Dispatche
9595
using BaseClass::isNewResourceHandleNeeded;
9696
using BaseClass::lastUllsLightExecTimestamp;
9797
using BaseClass::miMemFenceRequired;
98+
using BaseClass::osContext;
9899
using BaseClass::partitionConfigSet;
99100
using BaseClass::partitionedMode;
100101
using BaseClass::pciBarrierPtr;
@@ -167,6 +168,27 @@ HWTEST_F(DrmDirectSubmissionTest, givenDrmDirectSubmissionWhenCallingLinuxImplem
167168
*drmDirectSubmission.tagAddress = 1u;
168169
}
169170

171+
HWTEST_F(DrmDirectSubmissionTest, givenUllsLightWhenSwitchRingBufferNeedsToAllocateNewRingBufferThenAddToResidencyVectorAndRingStop) {
172+
MockDrmDirectSubmission<FamilyType, RenderDispatcher<FamilyType>> drmDirectSubmission(*device->getDefaultEngine().commandStreamReceiver);
173+
drmDirectSubmission.osContext.setDirectSubmissionActive();
174+
auto drm = static_cast<DrmMock *>(executionEnvironment.rootDeviceEnvironments[0]->osInterface->getDriverModel()->as<Drm>());
175+
EXPECT_TRUE(drm->isDirectSubmissionActive());
176+
EXPECT_TRUE(drmDirectSubmission.allocateResources());
177+
178+
drmDirectSubmission.ringBuffers[1].completionFence = 1u;
179+
drmDirectSubmission.ringStart = true;
180+
ResidencyContainer residencyContainer{};
181+
static_cast<DrmMemoryOperationsHandler *>(executionEnvironment.rootDeviceEnvironments[device->getRootDeviceIndex()]->memoryOperationsInterface.get())->mergeWithResidencyContainer(&drmDirectSubmission.osContext, residencyContainer);
182+
const auto expectedSize = residencyContainer.size() + 1u;
183+
184+
EXPECT_NE(0ull, drmDirectSubmission.switchRingBuffers(&residencyContainer));
185+
186+
EXPECT_EQ(residencyContainer.size(), expectedSize);
187+
EXPECT_FALSE(drmDirectSubmission.ringStart);
188+
189+
drmDirectSubmission.ringBuffers[1].completionFence = 0u;
190+
}
191+
170192
HWTEST_F(DrmDirectSubmissionTest, givenDrmDirectSubmissionWhenCallingIsCompletedThenProperValueReturned) {
171193
MockDrmDirectSubmission<FamilyType, RenderDispatcher<FamilyType>> drmDirectSubmission(*device->getDefaultEngine().commandStreamReceiver);
172194

0 commit comments

Comments
 (0)