performance: Ensure hostptrs removed before creating new one

Signed-off-by: Lukasz Jobczyk <lukasz.jobczyk@intel.com>
This commit is contained in:
Lukasz Jobczyk
2024-10-08 12:20:29 +00:00
committed by Compute-Runtime-Automation
parent 33d2a40cc8
commit 7f3896d05f
14 changed files with 87 additions and 56 deletions

View File

@@ -34,19 +34,20 @@ void MockDeferredDeleter::removeClient() {
--numClients;
}
void MockDeferredDeleter::drain(bool blocking) {
void MockDeferredDeleter::drain(bool blocking, bool hostptrsOnly) {
if (expectDrainCalled) {
EXPECT_EQ(expectedDrainValue, blocking);
}
DeferredDeleter::drain(blocking);
DeferredDeleter::drain(blocking, hostptrsOnly);
drainCalled++;
}
void MockDeferredDeleter::drain() {
return drain(true);
return drain(true, false);
}
bool MockDeferredDeleter::areElementsReleased() {
bool MockDeferredDeleter::areElementsReleased(bool hostptrsOnly) {
this->areElementsReleasedCalledForHostptrs = hostptrsOnly;
areElementsReleasedCalled++;
return areElementsReleasedCalled != 1;
}
@@ -65,8 +66,8 @@ bool MockDeferredDeleter::shouldStop() {
return shouldStopCalled > 1;
}
void MockDeferredDeleter::clearQueue() {
DeferredDeleter::clearQueue();
void MockDeferredDeleter::clearQueue(bool hostptrsOnly) {
DeferredDeleter::clearQueue(hostptrsOnly);
clearCalled++;
}
@@ -100,7 +101,7 @@ void MockDeferredDeleter::setDoWorkInBackgroundValue(bool value) {
}
bool MockDeferredDeleter::baseAreElementsReleased() {
return DeferredDeleter::areElementsReleased();
return DeferredDeleter::areElementsReleased(false);
}
bool MockDeferredDeleter::baseShouldStop() {

View File

@@ -22,9 +22,9 @@ class MockDeferredDeleter : public DeferredDeleter {
void removeClient() override;
void drain(bool blocking) override;
void drain(bool blocking, bool hostptrsOnly) override;
bool areElementsReleased() override;
bool areElementsReleased(bool hostptrsOnly) override;
bool shouldStop() override;
@@ -56,6 +56,8 @@ class MockDeferredDeleter : public DeferredDeleter {
int areElementsReleasedCalled = 0;
bool areElementsReleasedCalledForHostptrs = false;
std::atomic<int> shouldStopCalled;
std::atomic<int> clearCalled;
@@ -73,6 +75,6 @@ class MockDeferredDeleter : public DeferredDeleter {
bool expectDrainCalled = false;
void clearQueue() override;
void clearQueue(bool hostptrsOnly) override;
};
} // namespace NEO

View File

@@ -23,14 +23,23 @@ TEST(DeferredDeleter, WhenDeferredDeleterIsCreatedThenItIsNotAssignable) {
TEST(DeferredDeleter, givenDeferredDeleterWhenBlockingDrainIsCalledThenArElementsReleasedIsCalled) {
auto deleter = std::make_unique<MockDeferredDeleter>();
deleter->drain(true);
deleter->drain(true, false);
EXPECT_NE(0, deleter->areElementsReleasedCalled);
EXPECT_FALSE(deleter->areElementsReleasedCalledForHostptrs);
EXPECT_EQ(1, deleter->drainCalled);
}
TEST(DeferredDeleter, givenDeferredDeleterWhenBlockingDrainOnlyForHostptrsIsCalledThenArElementsReleasedIsCalledWithHostptrsOnly) {
auto deleter = std::make_unique<MockDeferredDeleter>();
deleter->drain(true, true);
EXPECT_NE(0, deleter->areElementsReleasedCalled);
EXPECT_TRUE(deleter->areElementsReleasedCalledForHostptrs);
EXPECT_EQ(1, deleter->drainCalled);
}
TEST(DeferredDeleter, givenDeferredDeleterWhenNonBlockingDrainIsCalledThenArElementsReleasedIsNotCalled) {
auto deleter = std::make_unique<MockDeferredDeleter>();
deleter->drain(false);
deleter->drain(false, false);
EXPECT_EQ(0, deleter->areElementsReleasedCalled);
EXPECT_EQ(1, deleter->drainCalled);
}

View File

@@ -51,18 +51,21 @@ class DeferrableDeletionTest : public ::testing::Test {
};
TEST_F(DeferrableDeletionTest, givenDeferrableDeletionWhenIsCreatedThenObjectMembersAreSetProperly) {
MockDeferrableDeletion deletion(wddm.get(), &handle, allocationCount, resourceHandle);
MockDeferrableDeletion deletion(wddm.get(), &handle, allocationCount, resourceHandle, AllocationType::buffer);
EXPECT_EQ(wddm.get(), deletion.wddm);
EXPECT_NE(nullptr, deletion.handles);
EXPECT_EQ(handle, *deletion.handles);
EXPECT_NE(&handle, deletion.handles);
EXPECT_EQ(allocationCount, deletion.allocationCount);
EXPECT_EQ(resourceHandle, deletion.resourceHandle);
EXPECT_FALSE(deletion.isExternalHostptr());
MockDeferrableDeletion deletion2(wddm.get(), &handle, allocationCount, resourceHandle, AllocationType::externalHostPtr);
EXPECT_TRUE(deletion2.isExternalHostptr());
}
TEST_F(DeferrableDeletionTest, givenDeferrableDeletionWhenApplyIsCalledThenDeletionIsApplied) {
wddm->callBaseDestroyAllocations = false;
std::unique_ptr<DeferrableDeletion> deletion(DeferrableDeletion::create((Wddm *)wddm.get(), &handle, allocationCount, resourceHandle));
std::unique_ptr<DeferrableDeletion> deletion(DeferrableDeletion::create((Wddm *)wddm.get(), &handle, allocationCount, resourceHandle, AllocationType::buffer));
EXPECT_EQ(0u, wddm->destroyAllocationResult.called);
deletion->apply();
EXPECT_EQ(1u, wddm->destroyAllocationResult.called);

View File

@@ -4044,13 +4044,6 @@ struct WddmMemoryManagerWithAsyncDeleterTest : public ::testing::Test {
WddmMock *wddm;
};
TEST_F(WddmMemoryManagerWithAsyncDeleterTest, givenWddmWhenAsyncDeleterIsEnabledThenDoNotDeferExternalHostptrDeletions) {
EXPECT_EQ(0, deleter->deferDeletionCalled);
memoryManager->tryDeferDeletions(nullptr, 0, 0, 0, AllocationType::externalHostPtr);
EXPECT_EQ(0, deleter->deferDeletionCalled);
EXPECT_EQ(1u, wddm->destroyAllocationResult.called);
}
TEST_F(WddmMemoryManagerWithAsyncDeleterTest, givenWddmWhenAsyncDeleterIsEnabledThenCanDeferDeletions) {
EXPECT_EQ(0, deleter->deferDeletionCalled);
memoryManager->tryDeferDeletions(nullptr, 0, 0, 0, AllocationType::unknown);