mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-03 06:49:52 +08:00
Free allocated BOs for read-only user pointer
- when pinning fails with EFAULT due to read-only memory used for allocation (BO), mark the allocated fragments to be freed, as cpu copy will be used. - prevent possible leaks Change-Id: I200ba276da5e3a8557df28fe2e411ef30d69a86a
This commit is contained in:
committed by
sys_ocldev
parent
1e81426599
commit
eec43f65a7
@@ -2571,3 +2571,49 @@ TEST_F(DrmMemoryManagerWithExplicitExpectationsTest, givenForcePinNotAllowedAndH
|
||||
|
||||
::alignedFree(ptr);
|
||||
}
|
||||
|
||||
TEST_F(DrmMemoryManagerWithExplicitExpectationsTest, givenEnabledValidateHostMemoryWhenReadOnlyPointerCausesPinningFailWithEfaultThenPopulateOsHandlesMarksFragmentsToFree) {
|
||||
std::unique_ptr<TestedDrmMemoryManager> testedMemoryManager(new TestedDrmMemoryManager(this->mock, false, true));
|
||||
ASSERT_NE(nullptr, testedMemoryManager.get());
|
||||
ASSERT_NE(nullptr, testedMemoryManager->getPinBB());
|
||||
|
||||
mock->reset();
|
||||
|
||||
DrmMockCustom::IoctlResExt ioctlResExt = {2, -1};
|
||||
mock->ioctl_res_ext = &ioctlResExt;
|
||||
mock->errnoValue = EFAULT;
|
||||
mock->ioctl_expected.gemUserptr = 2;
|
||||
mock->ioctl_expected.execbuffer2 = 1;
|
||||
|
||||
OsHandleStorage handleStorage;
|
||||
OsHandle handle1;
|
||||
handleStorage.fragmentStorageData[0].osHandleStorage = &handle1;
|
||||
handleStorage.fragmentStorageData[0].cpuPtr = (void *)0x1000;
|
||||
handleStorage.fragmentStorageData[0].fragmentSize = 4096;
|
||||
|
||||
handleStorage.fragmentStorageData[1].osHandleStorage = nullptr;
|
||||
handleStorage.fragmentStorageData[1].cpuPtr = (void *)0x2000;
|
||||
handleStorage.fragmentStorageData[1].fragmentSize = 8192;
|
||||
|
||||
handleStorage.fragmentStorageData[2].osHandleStorage = nullptr;
|
||||
handleStorage.fragmentStorageData[2].cpuPtr = (void *)0x4000;
|
||||
handleStorage.fragmentStorageData[2].fragmentSize = 4096;
|
||||
|
||||
auto result = testedMemoryManager->populateOsHandles(handleStorage);
|
||||
EXPECT_EQ(MemoryManager::AllocationStatus::InvalidHostPointer, result);
|
||||
|
||||
mock->testIoctls();
|
||||
|
||||
EXPECT_NE(nullptr, handleStorage.fragmentStorageData[0].osHandleStorage);
|
||||
EXPECT_NE(nullptr, handleStorage.fragmentStorageData[1].osHandleStorage);
|
||||
EXPECT_NE(nullptr, handleStorage.fragmentStorageData[2].osHandleStorage);
|
||||
|
||||
EXPECT_TRUE(handleStorage.fragmentStorageData[1].freeTheFragment);
|
||||
EXPECT_TRUE(handleStorage.fragmentStorageData[2].freeTheFragment);
|
||||
|
||||
handleStorage.fragmentStorageData[0].freeTheFragment = false;
|
||||
handleStorage.fragmentStorageData[1].freeTheFragment = true;
|
||||
handleStorage.fragmentStorageData[2].freeTheFragment = true;
|
||||
|
||||
testedMemoryManager->cleanOsHandles(handleStorage);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user