From 3d15a1e29148bb0469f81377ab6bd57efa06c4b1 Mon Sep 17 00:00:00 2001 From: Christophe Paquot Date: Fri, 10 Jul 2020 08:32:15 -0700 Subject: [PATCH] Make append and setLastQueuedCommand atomic Two threads can enqueue to the same HostQueue (HostQueue::enqueue) and result in last queued command being the first one reachine queue_.enqueue NOTE: Temporarly make setLastQueuedCommand empty function to pass the build Change-Id: Id09c3a28d184986f52b2ec86a2f6a18c40df1f0b --- rocclr/platform/command.cpp | 3 --- rocclr/platform/commandqueue.cpp | 22 ++++++++++------------ rocclr/platform/commandqueue.hpp | 2 +- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/rocclr/platform/command.cpp b/rocclr/platform/command.cpp index 3b7d3ab2a3..b52e84aa21 100644 --- a/rocclr/platform/command.cpp +++ b/rocclr/platform/command.cpp @@ -258,9 +258,6 @@ void Command::enqueue() { ClPrint(LOG_DEBUG, LOG_CMD, "command is enqueued: %p", this); queue_->append(*this); - if (IS_HIP) { - queue_->setLastQueuedCommand(this); - } queue_->flush(); if ((queue_->device().settings().waitCommand_ && (type_ != 0)) || ((commandWaitBits_ & 0x2) != 0)) { diff --git a/rocclr/platform/commandqueue.cpp b/rocclr/platform/commandqueue.cpp index a1e96023df..7ca3ba7878 100644 --- a/rocclr/platform/commandqueue.cpp +++ b/rocclr/platform/commandqueue.cpp @@ -185,7 +185,17 @@ void HostQueue::append(Command& command) { } command.retain(); command.setStatus(CL_QUEUED); + ScopedLock l(lastCmdLock_); queue_.enqueue(&command); + if (!IS_HIP) { + return; + } + // Set last submitted command + if (lastEnqueueCommand_ != nullptr) { + lastEnqueueCommand_->release(); + } + lastEnqueueCommand_ = &command; + lastEnqueueCommand_->retain(); } bool HostQueue::isEmpty() { @@ -193,18 +203,6 @@ bool HostQueue::isEmpty() { return queue_.empty(); } -void HostQueue::setLastQueuedCommand(Command* lastCommand) { - // Set last submitted command - ScopedLock l(lastCmdLock_); - if (lastEnqueueCommand_ != nullptr) { - lastEnqueueCommand_->release(); - } - lastEnqueueCommand_ = lastCommand; - if (lastCommand != nullptr) { - lastEnqueueCommand_->retain(); - } -} - Command* HostQueue::getLastQueuedCommand(bool retain) { // Get last submitted command ScopedLock l(lastCmdLock_); diff --git a/rocclr/platform/commandqueue.hpp b/rocclr/platform/commandqueue.hpp index 7def25bb73..cd39a041c9 100644 --- a/rocclr/platform/commandqueue.hpp +++ b/rocclr/platform/commandqueue.hpp @@ -236,7 +236,7 @@ class HostQueue : public CommandQueue { Command* getLastQueuedCommand(bool retain); //! Set last enqueued command - void setLastQueuedCommand(Command* lastCommand); + void setLastQueuedCommand(Command* lastCommand) {} };