From 77b00fa7497d6f1cc6305bb6314d3421bc7138ec Mon Sep 17 00:00:00 2001 From: "Mrozek, Michal" Date: Mon, 22 Oct 2018 17:15:13 +0200 Subject: [PATCH] Do not execute trim callback if there are no registered contexts. Change-Id: I9a274281a085cdbeb98a1d495ce9ef9ab897d08a --- runtime/os_interface/windows/wddm_memory_manager.cpp | 4 ++++ .../os_interface/windows/wddm_memory_manager_tests.cpp | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/runtime/os_interface/windows/wddm_memory_manager.cpp b/runtime/os_interface/windows/wddm_memory_manager.cpp index bad5b6aed1..b13818ae5e 100644 --- a/runtime/os_interface/windows/wddm_memory_manager.cpp +++ b/runtime/os_interface/windows/wddm_memory_manager.cpp @@ -57,6 +57,10 @@ void APIENTRY WddmMemoryManager::trimCallback(_Inout_ D3DKMT_TRIMNOTIFICATION *t WddmMemoryManager *wddmMemMngr = (WddmMemoryManager *)trimNotification->Context; DEBUG_BREAK_IF(wddmMemMngr == nullptr); + if (wddmMemMngr->getOsContextCount() == 0) { + return; + } + wddmMemMngr->getRegisteredOsContext(0)->get()->getResidencyController().acquireTrimCallbackLock(); wddmMemMngr->trimResidency(trimNotification->Flags, trimNotification->NumBytesToTrim); wddmMemMngr->getRegisteredOsContext(0)->get()->getResidencyController().releaseTrimCallbackLock(); diff --git a/unit_tests/os_interface/windows/wddm_memory_manager_tests.cpp b/unit_tests/os_interface/windows/wddm_memory_manager_tests.cpp index 5d93419b00..728af52beb 100644 --- a/unit_tests/os_interface/windows/wddm_memory_manager_tests.cpp +++ b/unit_tests/os_interface/windows/wddm_memory_manager_tests.cpp @@ -113,6 +113,13 @@ TEST_F(WddmMemoryManagerSimpleTest, givenMemoryManagerWhenAllocateGraphicsMemory memoryManager->freeGraphicsMemory(allocation); } +TEST_F(WddmMemoryManagerSimpleTest, givenMemoryManagerWhichDoesntRegisteredAnyOsContextWhenTrimCallbackIsCalledThenItReturnsWithoutDoingAnyWork) { + memoryManager.reset(new MockWddmMemoryManager(false, false, wddm, executionEnvironment)); + D3DKMT_TRIMNOTIFICATION trimNotification = {}; + trimNotification.Context = memoryManager.get(); + WddmMemoryManager::trimCallback(&trimNotification); +} + TEST_F(WddmMemoryManagerSimpleTest, givenMemoryManagerWith64KBPagesEnabledWhenAllocateGraphicsMemory64kbIsCalledThenMemoryPoolIsSystem64KBPages) { memoryManager.reset(new MockWddmMemoryManager(false, false, wddm, executionEnvironment)); auto size = 4096u;