Revert "Deferred deletion of allocations in main thread"

This reverts commit 418e0f7322.

Signed-off-by: Compute-Runtime-Validation <compute-runtime-validation@intel.com>
This commit is contained in:
Compute-Runtime-Validation
2022-12-20 13:32:52 +01:00
committed by Compute-Runtime-Automation
parent 0e6cc86821
commit cac134028c
11 changed files with 13 additions and 144 deletions

View File

@@ -2186,7 +2186,7 @@ HWTEST_F(GraphicsAllocationTests, givenAllocationUsedByManyOsContextsWhenCheckin
auto memoryManager = new MockMemoryManager(false, false, *executionEnvironment); auto memoryManager = new MockMemoryManager(false, false, *executionEnvironment);
executionEnvironment->memoryManager.reset(memoryManager); executionEnvironment->memoryManager.reset(memoryManager);
auto multiContextDestructor = new MockDeferredDeleter(); auto multiContextDestructor = new MockDeferredDeleter();
multiContextDestructor->expectClearQueueTillFirstFailure(); multiContextDestructor->expectDrainBlockingValue(false);
memoryManager->multiContextResourceDestructor.reset(multiContextDestructor); memoryManager->multiContextResourceDestructor.reset(multiContextDestructor);
auto device = std::unique_ptr<MockDevice>(MockDevice::create<MockDevice>(executionEnvironment, 0u)); auto device = std::unique_ptr<MockDevice>(MockDevice::create<MockDevice>(executionEnvironment, 0u));

View File

@@ -30,7 +30,7 @@ struct ClearQueueTest : public ::testing::Test,
static void threadMethod(MockDeferredDeleter *deleter) { static void threadMethod(MockDeferredDeleter *deleter) {
while (!startClear) while (!startClear)
; ;
deleter->clearQueue(false); deleter->clearQueue();
threadStopped++; threadStopped++;
} }
MockDeferrableDeletion *createDeletion() { MockDeferrableDeletion *createDeletion() {

View File

@@ -224,20 +224,3 @@ TEST_F(DeferredDeleterTest, givenDeferredDeleterWhenNonBlockingDrainIsCalledThen
EXPECT_EQ(0, deleter->areElementsReleasedCalled); EXPECT_EQ(0, deleter->areElementsReleasedCalled);
EXPECT_EQ(1, deleter->drainCalled); EXPECT_EQ(1, deleter->drainCalled);
} }
TEST_F(DeferredDeleterTest, GivenAsyncThreadStartedThenCallClearQueueTillFirstFailure) {
deleter->DeferredDeleter::addClient();
waitForAsyncThread();
auto deletion = createDeletion();
deleter->DeferredDeleter::deferDeletion(deletion);
deleter->clearQueueTillFirstFailure();
EXPECT_TRUE(deleter->isThreadRunning());
EXPECT_TRUE(deleter->isWorking());
EXPECT_EQ(0, deleter->clearCalledWithBreakTillFailure);
deleter->allowEarlyStopThread();
deleter->DeferredDeleter::removeClient();
EXPECT_TRUE(deleter->isQueueEmpty());
}

View File

@@ -96,7 +96,7 @@ void *DeferredDeleter::run(void *arg) {
} }
lock.unlock(); lock.unlock();
// Delete items placed into deferred delete queue // Delete items placed into deferred delete queue
self->clearQueue(false); self->clearQueue();
lock.lock(); lock.lock();
// Check whether working thread should be stopped // Check whether working thread should be stopped
} while (!self->shouldStop()); } while (!self->shouldStop());
@@ -105,33 +105,21 @@ void *DeferredDeleter::run(void *arg) {
} }
void DeferredDeleter::drain(bool blocking) { void DeferredDeleter::drain(bool blocking) {
clearQueue(false); clearQueue();
if (blocking) { if (blocking) {
while (!areElementsReleased()) while (!areElementsReleased())
; ;
} }
} }
void DeferredDeleter::clearQueueTillFirstFailure() { void DeferredDeleter::clearQueue() {
if (numClients > 0) {
return;
}
clearQueue(true);
}
void DeferredDeleter::clearQueue(bool breakOnFailure) {
do { do {
auto deletion = queue.removeFrontOne(); auto deletion = queue.removeFrontOne();
if (deletion) { if (deletion) {
if (deletion->apply()) { if (deletion->apply()) {
elementsToRelease--; elementsToRelease--;
} else { } else {
if (breakOnFailure) { queue.pushTailOne(*deletion.release());
queue.pushFrontOne(*deletion.release());
break;
} else {
queue.pushTailOne(*deletion.release());
}
} }
} }
} while (!queue.peekIsEmpty()); } while (!queue.peekIsEmpty());

View File

@@ -31,13 +31,11 @@ class DeferredDeleter {
MOCKABLE_VIRTUAL void drain(bool blocking); MOCKABLE_VIRTUAL void drain(bool blocking);
MOCKABLE_VIRTUAL void clearQueueTillFirstFailure();
protected: protected:
void stop(); void stop();
void safeStop(); void safeStop();
void ensureThread(); void ensureThread();
MOCKABLE_VIRTUAL void clearQueue(bool breakOnFailure); MOCKABLE_VIRTUAL void clearQueue();
MOCKABLE_VIRTUAL bool areElementsReleased(); MOCKABLE_VIRTUAL bool areElementsReleased();
MOCKABLE_VIRTUAL bool shouldStop(); MOCKABLE_VIRTUAL bool shouldStop();

View File

@@ -258,7 +258,7 @@ void MemoryManager::checkGpuUsageAndDestroyGraphicsAllocations(GraphicsAllocatio
if (gfxAllocation->isUsed()) { if (gfxAllocation->isUsed()) {
if (gfxAllocation->isUsedByManyOsContexts()) { if (gfxAllocation->isUsedByManyOsContexts()) {
multiContextResourceDestructor->deferDeletion(new DeferrableAllocationDeletion{*this, *gfxAllocation}); multiContextResourceDestructor->deferDeletion(new DeferrableAllocationDeletion{*this, *gfxAllocation});
multiContextResourceDestructor->clearQueueTillFirstFailure(); multiContextResourceDestructor->drain(false);
return; return;
} }
for (auto &engine : getRegisteredEngines()) { for (auto &engine : getRegisteredEngines()) {

View File

@@ -10,9 +10,9 @@
namespace NEO { namespace NEO {
bool MockDeferrableDeletion::apply() { bool MockDeferrableDeletion::apply() {
applyCalled++; applyCalled++;
return (applyCalled < trialTimes) ? false : true; return true;
} }
MockDeferrableDeletion::~MockDeferrableDeletion() { MockDeferrableDeletion::~MockDeferrableDeletion() {
EXPECT_EQ(trialTimes, applyCalled); EXPECT_EQ(1, applyCalled);
} }
} // namespace NEO } // namespace NEO

View File

@@ -16,11 +16,6 @@ class MockDeferrableDeletion : public DeferrableDeletion {
bool apply() override; bool apply() override;
~MockDeferrableDeletion() override; ~MockDeferrableDeletion() override;
void setTrialTimes(int times) { trialTimes = times; }
int applyCalled = 0; int applyCalled = 0;
private:
int trialTimes = 1;
}; };
} // namespace NEO } // namespace NEO

View File

@@ -18,7 +18,6 @@ namespace NEO {
MockDeferredDeleter::MockDeferredDeleter() { MockDeferredDeleter::MockDeferredDeleter() {
shouldStopCalled = 0; shouldStopCalled = 0;
clearCalled = 0; clearCalled = 0;
clearCalledWithBreakTillFailure = 0;
} }
void MockDeferredDeleter::deferDeletion(DeferrableDeletion *deletion) { void MockDeferredDeleter::deferDeletion(DeferrableDeletion *deletion) {
@@ -43,11 +42,6 @@ void MockDeferredDeleter::drain(bool blocking) {
drainCalled++; drainCalled++;
} }
void MockDeferredDeleter::clearQueueTillFirstFailure() {
DeferredDeleter::clearQueueTillFirstFailure();
clearQueueTillFirstFailureCalled++;
}
void MockDeferredDeleter::drain() { void MockDeferredDeleter::drain() {
return drain(true); return drain(true);
} }
@@ -71,12 +65,9 @@ bool MockDeferredDeleter::shouldStop() {
return shouldStopCalled > 1; return shouldStopCalled > 1;
} }
void MockDeferredDeleter::clearQueue(bool breakOnFailure) { void MockDeferredDeleter::clearQueue() {
DeferredDeleter::clearQueue(breakOnFailure); DeferredDeleter::clearQueue();
clearCalled++; clearCalled++;
if (breakOnFailure) {
clearCalledWithBreakTillFailure++;
}
} }
int MockDeferredDeleter::getClientsNum() { int MockDeferredDeleter::getClientsNum() {
@@ -142,17 +133,10 @@ MockDeferredDeleter::~MockDeferredDeleter() {
if (expectDrainCalled) { if (expectDrainCalled) {
EXPECT_NE(0, drainCalled); EXPECT_NE(0, drainCalled);
} }
if (expectClearQueueTillFirstFailureCalled) {
EXPECT_NE(0, clearQueueTillFirstFailureCalled);
}
} }
void MockDeferredDeleter::expectDrainBlockingValue(bool value) { void MockDeferredDeleter::expectDrainBlockingValue(bool value) {
expectedDrainValue = value; expectedDrainValue = value;
expectDrainCalled = true; expectDrainCalled = true;
} }
void MockDeferredDeleter::expectClearQueueTillFirstFailure() {
expectClearQueueTillFirstFailureCalled = true;
}
} // namespace NEO } // namespace NEO

View File

@@ -24,8 +24,6 @@ class MockDeferredDeleter : public DeferredDeleter {
void drain(bool blocking) override; void drain(bool blocking) override;
void clearQueueTillFirstFailure() override;
bool areElementsReleased() override; bool areElementsReleased() override;
bool shouldStop() override; bool shouldStop() override;
@@ -62,8 +60,6 @@ class MockDeferredDeleter : public DeferredDeleter {
std::atomic<int> clearCalled; std::atomic<int> clearCalled;
std::atomic<int> clearCalledWithBreakTillFailure;
int deferDeletionCalled = 0; int deferDeletionCalled = 0;
bool stopAfter3loopsInRun = false; bool stopAfter3loopsInRun = false;
@@ -73,16 +69,10 @@ class MockDeferredDeleter : public DeferredDeleter {
void expectDrainBlockingValue(bool value); void expectDrainBlockingValue(bool value);
void expectClearQueueTillFirstFailure();
bool expectedDrainValue = false; bool expectedDrainValue = false;
bool expectDrainCalled = false; bool expectDrainCalled = false;
bool expectClearQueueTillFirstFailureCalled = false; void clearQueue() override;
int clearQueueTillFirstFailureCalled = 0;
void clearQueue(bool breakOnFailure) override;
}; };
} // namespace NEO } // namespace NEO

View File

@@ -5,7 +5,6 @@
* *
*/ */
#include "shared/test/common/mocks/mock_deferrable_deletion.h"
#include "shared/test/common/mocks/mock_deferred_deleter.h" #include "shared/test/common/mocks/mock_deferred_deleter.h"
#include "gtest/gtest.h" #include "gtest/gtest.h"
@@ -21,71 +20,3 @@ TEST(DeferredDeleter, WhenDeferredDeleterIsCreatedThenItIsNotAssignable) {
EXPECT_FALSE(std::is_move_assignable<DeferredDeleter>::value); EXPECT_FALSE(std::is_move_assignable<DeferredDeleter>::value);
EXPECT_FALSE(std::is_copy_assignable<DeferredDeleter>::value); EXPECT_FALSE(std::is_copy_assignable<DeferredDeleter>::value);
} }
struct DeferredDeleterTest : public ::testing::Test {
void SetUp() override {
deleter.reset(new MockDeferredDeleter());
}
void TearDown() override {
EXPECT_TRUE(deleter->isQueueEmpty());
EXPECT_EQ(0, deleter->getElementsToRelease());
}
std::unique_ptr<MockDeferredDeleter> deleter;
};
TEST_F(DeferredDeleterTest, WhenTheAllocationsAreReadyThenCallClearQueueTillFirstFailure) {
auto deletion1 = new MockDeferrableDeletion();
auto deletion2 = new MockDeferrableDeletion();
deleter->DeferredDeleter::deferDeletion(deletion1);
deleter->DeferredDeleter::deferDeletion(deletion2);
EXPECT_FALSE(deleter->isQueueEmpty());
deleter->clearQueueTillFirstFailure();
EXPECT_TRUE(deleter->isQueueEmpty());
EXPECT_EQ(1, deleter->clearQueueTillFirstFailureCalled);
EXPECT_EQ(1, deleter->clearCalled);
EXPECT_EQ(1, deleter->clearCalledWithBreakTillFailure);
}
TEST_F(DeferredDeleterTest, WhenSomeAllocationIsNotReadyThenCallClearQueueTillFirstFailureMultipleTimes) {
auto deletionReady = new MockDeferrableDeletion();
auto deletionNotReadyTill3 = new MockDeferrableDeletion();
deletionNotReadyTill3->setTrialTimes(3);
deleter->DeferredDeleter::deferDeletion(deletionReady);
deleter->DeferredDeleter::deferDeletion(deletionNotReadyTill3);
EXPECT_FALSE(deleter->isQueueEmpty());
deleter->clearQueueTillFirstFailure();
EXPECT_FALSE(deleter->isQueueEmpty());
EXPECT_EQ(1, deleter->clearQueueTillFirstFailureCalled);
EXPECT_EQ(1, deleter->clearCalled);
EXPECT_EQ(1, deleter->clearCalledWithBreakTillFailure);
deleter->clearQueueTillFirstFailure();
EXPECT_FALSE(deleter->isQueueEmpty());
deleter->clearQueueTillFirstFailure();
EXPECT_TRUE(deleter->isQueueEmpty());
}
TEST_F(DeferredDeleterTest, WhenSomeAllocationIsNotReadyThenCallClearQueueTillFirstFailureAndThenDrain) {
auto deletionReady = new MockDeferrableDeletion();
auto deletionNotReadyTill3 = new MockDeferrableDeletion();
deletionNotReadyTill3->setTrialTimes(3);
deleter->DeferredDeleter::deferDeletion(deletionReady);
deleter->DeferredDeleter::deferDeletion(deletionNotReadyTill3);
EXPECT_FALSE(deleter->isQueueEmpty());
deleter->clearQueueTillFirstFailure();
EXPECT_FALSE(deleter->isQueueEmpty());
EXPECT_EQ(1, deleter->clearQueueTillFirstFailureCalled);
EXPECT_EQ(1, deleter->clearCalled);
EXPECT_EQ(1, deleter->clearCalledWithBreakTillFailure);
deleter->drain();
EXPECT_EQ(1, deleter->drainCalled);
EXPECT_TRUE(deleter->isQueueEmpty());
}
TEST_F(DeferredDeleterTest, GivenDeferredDeleterWithEmptyQueueThenCallClearQueueTillFirstFailure) {
deleter->clearQueueTillFirstFailure();
EXPECT_EQ(0, deleter->areElementsReleasedCalled);
EXPECT_EQ(1, deleter->clearQueueTillFirstFailureCalled);
}