Skip to content

Commit 43b8872

Browse files
fix: track registered CSR clients
In L0 its not possible to track objects relations. For example CmdList may be removed before Event. In such case, Event needs to safely skip unregister call, without accessing CmdList/CmdQueue object. Related-To: NEO-8884 Signed-off-by: Dunajski, Bartosz <[email protected]> Source: 53f635e
1 parent 12d60ca commit 43b8872

File tree

18 files changed

+127
-77
lines changed

18 files changed

+127
-77
lines changed

level_zero/core/source/cmdlist/cmdlist_hw_immediate.inl

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -339,9 +339,7 @@ inline ze_result_t CommandListCoreFamilyImmediate<gfxCoreFamily>::executeCommand
339339
svmAllocMgr->prefetchSVMAllocs(*this->device->getNEODevice(), *csr);
340340
}
341341

342-
if (cmdQ->getClientId() == CommandQueue::clientNotRegistered) {
343-
cmdQ->setClientId(csr->registerClient());
344-
}
342+
cmdQ->registerCsrClient();
345343

346344
std::unique_lock<std::mutex> lockForIndirect;
347345
if (this->hasIndirectAllocationsAllowed()) {

level_zero/core/source/cmdqueue/cmdqueue.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -253,10 +253,11 @@ CommandQueue *CommandQueue::create(uint32_t productFamily, Device *device, NEO::
253253
}
254254

255255
void CommandQueueImp::unregisterCsrClient() {
256-
if (getClientId() != CommandQueue::clientNotRegistered) {
257-
this->csr->unregisterClient();
258-
setClientId(CommandQueue::clientNotRegistered);
259-
}
256+
this->csr->unregisterClient(this);
257+
}
258+
259+
void CommandQueueImp::registerCsrClient() {
260+
this->csr->registerClient(this);
260261
}
261262

262263
ze_command_queue_mode_t CommandQueueImp::getSynchronousMode() const {

level_zero/core/source/cmdqueue/cmdqueue.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,19 +62,15 @@ struct CommandQueue : _ze_command_queue_handle_t {
6262

6363
bool peekIsCopyOnlyCommandQueue() const { return this->isCopyOnlyCommandQueue; }
6464

65-
uint32_t getClientId() const { return this->clientId; }
66-
void setClientId(uint32_t value) { this->clientId = value; }
6765
virtual void unregisterCsrClient() = 0;
66+
virtual void registerCsrClient() = 0;
6867

6968
TaskCountType getTaskCount() const { return taskCount; }
7069
void setTaskCount(TaskCountType newTaskCount) { taskCount = newTaskCount; }
7170

72-
static constexpr uint32_t clientNotRegistered = std::numeric_limits<uint32_t>::max();
73-
7471
protected:
7572
bool frontEndTrackingEnabled() const;
7673

77-
uint32_t clientId = clientNotRegistered;
7874
uint32_t partitionCount = 1;
7975
uint32_t activeSubDevices = 1;
8076
std::atomic<TaskCountType> taskCount = 0;

level_zero/core/source/cmdqueue/cmdqueue_hw.inl

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,7 @@ ze_result_t CommandQueueHw<gfxCoreFamily>::executeCommandLists(
7373
svmAllocMgr->prefetchSVMAllocs(*device->getNEODevice(), *csr);
7474
}
7575

76-
if (this->clientId == CommandQueue::clientNotRegistered) {
77-
this->clientId = this->csr->registerClient();
78-
}
76+
registerCsrClient();
7977

8078
auto neoDevice = device->getNEODevice();
8179
auto ctx = CommandListExecutionContext{phCommandLists,

level_zero/core/source/cmdqueue/cmdqueue_imp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ struct CommandQueueImp : public CommandQueue {
9090
void printKernelsPrintfOutput(bool hangDetected);
9191
void checkAssert();
9292
void unregisterCsrClient() override;
93+
void registerCsrClient() override;
9394

9495
protected:
9596
MOCKABLE_VIRTUAL NEO::SubmissionStatus submitBatchBuffer(size_t offset, NEO::ResidencyContainer &residencyContainer, void *endingCmdPtr,

level_zero/core/source/event/event.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,9 +402,10 @@ void Event::setLatestUsedCmdQueue(CommandQueue *newCmdQ) {
402402
}
403403

404404
void Event::unsetCmdQueue() {
405-
if (latestUsedCmdQueue) {
406-
latestUsedCmdQueue->unregisterCsrClient();
405+
for (auto &csr : csrs) {
406+
csr->unregisterClient(latestUsedCmdQueue);
407407
}
408+
408409
latestUsedCmdQueue = nullptr;
409410
}
410411

level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_1.cpp

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,7 +1200,6 @@ HWTEST2_F(CommandListCreate, givenDirectSubmissionAndImmCmdListWhenDispatchingDi
12001200

12011201
auto ultCsr = static_cast<NEO::UltCommandStreamReceiver<FamilyType> *>(whiteBoxCmdList->csr);
12021202
ultCsr->recordFlusheBatchBuffer = true;
1203-
ultCsr->unregisterClient();
12041203

12051204
EXPECT_FALSE(NEO::RelaxedOrderingHelper::isRelaxedOrderingDispatchAllowed(*ultCsr, 1));
12061205

@@ -1299,8 +1298,9 @@ HWTEST2_F(CommandListCreate, whenDispatchingThenPassNumCsrClients, IsAtLeastXeHp
12991298
auto ultCsr = static_cast<NEO::UltCommandStreamReceiver<FamilyType> *>(whiteBoxCmdList->csr);
13001299
ultCsr->recordFlusheBatchBuffer = true;
13011300

1302-
ultCsr->registerClient();
1303-
ultCsr->registerClient();
1301+
int client1, client2;
1302+
ultCsr->registerClient(&client1);
1303+
ultCsr->registerClient(&client2);
13041304

13051305
auto result = commandList->appendLaunchKernel(kernel.toHandle(), &groupCount, nullptr, 0, nullptr, launchParams, false);
13061306

@@ -1458,8 +1458,9 @@ HWTEST2_F(CommandListCreate, givenDirectSubmissionAndImmCmdListWhenDispatchingTh
14581458

14591459
auto directSubmission = new MockDirectSubmissionHw<FamilyType, RenderDispatcher<FamilyType>>(*ultCsr);
14601460
ultCsr->directSubmission.reset(directSubmission);
1461-
ultCsr->registerClient();
1462-
ultCsr->registerClient();
1461+
int client1, client2;
1462+
ultCsr->registerClient(&client1);
1463+
ultCsr->registerClient(&client2);
14631464

14641465
auto verifyFlags = [&ultCsr, useImmediateFlushTask](ze_result_t result, bool dispatchFlag, bool bbFlag) {
14651466
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
@@ -1580,8 +1581,9 @@ HWTEST2_F(CommandListCreate, givenInOrderExecutionWhenDispatchingRelaxedOrdering
15801581

15811582
auto directSubmission = new MockDirectSubmissionHw<FamilyType, RenderDispatcher<FamilyType>>(*ultCsr);
15821583
ultCsr->directSubmission.reset(directSubmission);
1583-
ultCsr->registerClient();
1584-
ultCsr->registerClient();
1584+
int client1, client2;
1585+
ultCsr->registerClient(&client1);
1586+
ultCsr->registerClient(&client2);
15851587

15861588
commandList->appendLaunchKernel(kernel.toHandle(), &groupCount, event, 0, nullptr, launchParams, false);
15871589

@@ -1628,8 +1630,9 @@ HWTEST2_F(CommandListCreate, givenInOrderExecutionWhenDispatchingBarrierThenAllo
16281630

16291631
auto directSubmission = new MockDirectSubmissionHw<FamilyType, RenderDispatcher<FamilyType>>(*ultCsr);
16301632
ultCsr->directSubmission.reset(directSubmission);
1631-
ultCsr->registerClient();
1632-
ultCsr->registerClient();
1633+
int client1, client2;
1634+
ultCsr->registerClient(&client1);
1635+
ultCsr->registerClient(&client2);
16331636

16341637
// Initialize NP state
16351638
commandList->appendBarrier(nullptr, 1, &event, false);
@@ -1687,8 +1690,9 @@ HWTEST2_F(CommandListCreate, givenInOrderExecutionWhenDispatchingRelaxedOrdering
16871690

16881691
auto directSubmission = new MockDirectSubmissionHw<FamilyType, RenderDispatcher<FamilyType>>(*ultCsr);
16891692
ultCsr->directSubmission.reset(directSubmission);
1690-
ultCsr->registerClient();
1691-
ultCsr->registerClient();
1693+
int client1, client2;
1694+
ultCsr->registerClient(&client1);
1695+
ultCsr->registerClient(&client2);
16921696

16931697
auto cmdStream = cmdList->getCmdContainer().getCommandStream();
16941698

level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_7.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2964,7 +2964,8 @@ HWTEST2_F(ImmediateCommandListHostSynchronize, givenCsrClientCountWhenCallingSyn
29642964

29652965
auto cmdList = createCmdList<gfxCoreFamily>(csr);
29662966

2967-
cmdList->cmdQImmediate->setClientId(csr->registerClient());
2967+
cmdList->cmdQImmediate->registerCsrClient();
2968+
29682969
auto clientCount = csr->getNumClients();
29692970

29702971
EXPECT_EQ(cmdList->hostSynchronize(0), ZE_RESULT_SUCCESS);
@@ -2975,7 +2976,8 @@ HWTEST2_F(ImmediateCommandListHostSynchronize, givenCsrClientCountWhenCallingSyn
29752976

29762977
EXPECT_EQ(clientCount - 1, csr->getNumClients());
29772978

2978-
cmdList->cmdQImmediate->setClientId(csr->registerClient());
2979+
cmdList->cmdQImmediate->registerCsrClient();
2980+
29792981
clientCount = csr->getNumClients();
29802982

29812983
csr->callBaseWaitForCompletionWithTimeout = false;

level_zero/core/test/unit_tests/xe_hpc_core/test_cmdqueue_xe_hpc_core.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -715,7 +715,8 @@ HWTEST2_F(CommandQueueCommandsXeHpc, givenFlushTaskSubmissionEnabledAndSplitBcsC
715715
context->allocHostMem(&hostDesc, size, alignment, &dstPtr);
716716
auto ultCsr = static_cast<NEO::UltCommandStreamReceiver<FamilyType> *>(whiteBoxCmdList->csr);
717717
ultCsr->recordFlusheBatchBuffer = true;
718-
ultCsr->registerClient();
718+
int client;
719+
ultCsr->registerClient(&client);
719720

720721
auto result = commandList0->appendMemoryCopy(dstPtr, srcPtr, size, nullptr, 0, nullptr, false, false);
721722
ASSERT_EQ(ZE_RESULT_SUCCESS, result);
@@ -778,8 +779,9 @@ HWTEST2_F(CommandQueueCommandsXeHpc, givenFlushTaskSubmissionEnabledAndSplitBcsC
778779
context->allocHostMem(&hostDesc, size, alignment, &dstPtr);
779780
auto ultCsr = static_cast<NEO::UltCommandStreamReceiver<FamilyType> *>(whiteBoxCmdList->csr);
780781
ultCsr->recordFlusheBatchBuffer = true;
781-
ultCsr->registerClient();
782-
ultCsr->registerClient();
782+
int client1, client2;
783+
ultCsr->registerClient(&client1);
784+
ultCsr->registerClient(&client2);
783785

784786
auto directSubmission = new MockDirectSubmissionHw<FamilyType, RenderDispatcher<FamilyType>>(*ultCsr);
785787
ultCsr->directSubmission.reset(directSubmission);

opencl/source/command_queue/command_queue.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1406,7 +1406,7 @@ void CommandQueue::registerGpgpuCsrClient() {
14061406
if (!gpgpuCsrClientRegistered) {
14071407
gpgpuCsrClientRegistered = true;
14081408

1409-
getGpgpuCommandStreamReceiver().registerClient();
1409+
getGpgpuCommandStreamReceiver().registerClient(this);
14101410
}
14111411
}
14121412

@@ -1417,13 +1417,13 @@ void CommandQueue::registerBcsCsrClient(CommandStreamReceiver &bcsCsr) {
14171417

14181418
if (!bcsState.csrClientRegistered) {
14191419
bcsState.csrClientRegistered = true;
1420-
bcsCsr.registerClient();
1420+
bcsCsr.registerClient(this);
14211421
}
14221422
}
14231423

14241424
void CommandQueue::unregisterGpgpuCsrClient() {
14251425
if (gpgpuCsrClientRegistered) {
1426-
gpgpuEngine->commandStreamReceiver->unregisterClient();
1426+
gpgpuEngine->commandStreamReceiver->unregisterClient(this);
14271427
gpgpuCsrClientRegistered = false;
14281428
}
14291429
}
@@ -1434,7 +1434,7 @@ void CommandQueue::unregisterBcsCsrClient(CommandStreamReceiver &bcsCsr) {
14341434
auto &bcsState = bcsStates[EngineHelpers::getBcsIndex(engineType)];
14351435

14361436
if (bcsState.isValid() && bcsState.csrClientRegistered) {
1437-
bcsCsr.unregisterClient();
1437+
bcsCsr.unregisterClient(this);
14381438
bcsState.csrClientRegistered = false;
14391439
}
14401440
}

0 commit comments

Comments
 (0)