From ad654778683740d240fc3be29b5d18c296b274d8 Mon Sep 17 00:00:00 2001 From: "Zdunowski, Piotr" Date: Mon, 27 Aug 2018 11:33:25 +0200 Subject: [PATCH] Fix crash caused by missing residency data. Change-Id: Ib615e3b13382950ec8ecc128bea0032a126666e0 --- runtime/memory_manager/os_agnostic_memory_manager.cpp | 3 +++ runtime/os_interface/linux/drm_memory_manager.cpp | 3 +++ unit_tests/memory_manager/memory_manager_tests.cpp | 1 + unit_tests/os_interface/linux/drm_memory_manager_tests.cpp | 1 + 4 files changed, 8 insertions(+) diff --git a/runtime/memory_manager/os_agnostic_memory_manager.cpp b/runtime/memory_manager/os_agnostic_memory_manager.cpp index c203a4dfb9..b345f3162c 100644 --- a/runtime/memory_manager/os_agnostic_memory_manager.cpp +++ b/runtime/memory_manager/os_agnostic_memory_manager.cpp @@ -120,6 +120,7 @@ void OsAgnosticMemoryManager::addAllocationToHostPtrManager(GraphicsAllocation * fragment.fragmentCpuPointer = gfxAllocation->getUnderlyingBuffer(); fragment.fragmentSize = alignUp(gfxAllocation->getUnderlyingBufferSize(), MemoryConstants::pageSize); fragment.osInternalStorage = new OsHandle(); + fragment.residency = new ResidencyData(); hostPtrManager.storeFragment(fragment); } @@ -128,8 +129,10 @@ void OsAgnosticMemoryManager::removeAllocationFromHostPtrManager(GraphicsAllocat auto fragment = hostPtrManager.getFragment(buffer); if (fragment && fragment->driverAllocation) { OsHandle *osStorageToRelease = fragment->osInternalStorage; + ResidencyData *residencyDataToRelease = fragment->residency; if (hostPtrManager.releaseHostPtr(buffer)) { delete osStorageToRelease; + delete residencyDataToRelease; } } } diff --git a/runtime/os_interface/linux/drm_memory_manager.cpp b/runtime/os_interface/linux/drm_memory_manager.cpp index 29f13c7af4..856e7cc6f4 100644 --- a/runtime/os_interface/linux/drm_memory_manager.cpp +++ b/runtime/os_interface/linux/drm_memory_manager.cpp @@ -429,6 +429,7 @@ void DrmMemoryManager::addAllocationToHostPtrManager(GraphicsAllocation *gfxAllo fragment.fragmentCpuPointer = gfxAllocation->getUnderlyingBuffer(); fragment.fragmentSize = alignUp(gfxAllocation->getUnderlyingBufferSize(), MemoryConstants::pageSize); fragment.osInternalStorage = new OsHandle(); + fragment.residency = new ResidencyData(); fragment.osInternalStorage->bo = drmMemory->getBO(); hostPtrManager.storeFragment(fragment); } @@ -438,8 +439,10 @@ void DrmMemoryManager::removeAllocationFromHostPtrManager(GraphicsAllocation *gf auto fragment = hostPtrManager.getFragment(buffer); if (fragment && fragment->driverAllocation) { OsHandle *osStorageToRelease = fragment->osInternalStorage; + ResidencyData *residencyDataToRelease = fragment->residency; if (hostPtrManager.releaseHostPtr(buffer)) { delete osStorageToRelease; + delete residencyDataToRelease; } } } diff --git a/unit_tests/memory_manager/memory_manager_tests.cpp b/unit_tests/memory_manager/memory_manager_tests.cpp index 7a264f15a4..8bf26571cf 100644 --- a/unit_tests/memory_manager/memory_manager_tests.cpp +++ b/unit_tests/memory_manager/memory_manager_tests.cpp @@ -161,6 +161,7 @@ TEST_F(MemoryAllocatorTest, GivenGraphicsAllocationWhenAddAndRemoveAllocationToH EXPECT_EQ(fragment->fragmentCpuPointer, cpuPtr); EXPECT_EQ(fragment->fragmentSize, size); EXPECT_NE(fragment->osInternalStorage, nullptr); + EXPECT_NE(fragment->residency, nullptr); FragmentStorage fragmentStorage = {}; fragmentStorage.fragmentCpuPointer = cpuPtr; diff --git a/unit_tests/os_interface/linux/drm_memory_manager_tests.cpp b/unit_tests/os_interface/linux/drm_memory_manager_tests.cpp index ee342be6fa..c18b938f62 100644 --- a/unit_tests/os_interface/linux/drm_memory_manager_tests.cpp +++ b/unit_tests/os_interface/linux/drm_memory_manager_tests.cpp @@ -135,6 +135,7 @@ TEST_F(DrmMemoryManagerTest, GivenGraphicsAllocationWhenAddAndRemoveAllocationTo EXPECT_EQ(fragment->fragmentSize, size); EXPECT_NE(fragment->osInternalStorage, nullptr); EXPECT_EQ(fragment->osInternalStorage->bo, gfxAllocation.getBO()); + EXPECT_NE(fragment->residency, nullptr); FragmentStorage fragmentStorage = {}; fragmentStorage.fragmentCpuPointer = cpuPtr;