Skip to content

Commit 42b2ed6

Browse files
Register trimCallback with WddmResidencyController as Context
Change-Id: Ibc34aac17e79df3a3096c29c34506039e2c5bdcc Signed-off-by: Maciej Dziuban <maciej.dziuban@intel.com>
1 parent 5336e87 commit 42b2ed6

File tree

11 files changed

+56
-55
lines changed

11 files changed

+56
-55
lines changed

runtime/os_interface/windows/wddm/wddm.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -811,14 +811,14 @@ uint64_t Wddm::getHeap32Size() {
811811
return alignDown(gfxPartition.Heap32[0].Limit, MemoryConstants::pageSize);
812812
}
813813

814-
VOID *Wddm::registerTrimCallback(PFND3DKMT_TRIMNOTIFICATIONCALLBACK callback, WddmMemoryManager *memoryManager) {
814+
VOID *Wddm::registerTrimCallback(PFND3DKMT_TRIMNOTIFICATIONCALLBACK callback, WddmResidencyController &residencyController) {
815815
if (DebugManager.flags.DoNotRegisterTrimCallback.get()) {
816816
return nullptr;
817817
}
818818
D3DKMT_REGISTERTRIMNOTIFICATION registerTrimNotification;
819819
registerTrimNotification.Callback = callback;
820820
registerTrimNotification.AdapterLuid = this->adapterLuid;
821-
registerTrimNotification.Context = memoryManager;
821+
registerTrimNotification.Context = &residencyController;
822822
registerTrimNotification.hDevice = this->device;
823823

824824
NTSTATUS status = gdi->registerTrimNotification(&registerTrimNotification);

runtime/os_interface/windows/wddm/wddm.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
namespace OCLRT {
2727

2828
class WddmAllocation;
29-
class WddmMemoryManager;
3029
class Gdi;
3130
class Gmm;
3231
class LinearStream;
@@ -79,7 +78,7 @@ class Wddm {
7978
MOCKABLE_VIRTUAL bool waitFromCpu(uint64_t lastFenceValue, const MonitoredFence &monitoredFence);
8079

8180
NTSTATUS escape(D3DKMT_ESCAPE &escapeCommand);
82-
VOID *registerTrimCallback(PFND3DKMT_TRIMNOTIFICATIONCALLBACK callback, WddmMemoryManager *memoryManager);
81+
VOID *registerTrimCallback(PFND3DKMT_TRIMNOTIFICATIONCALLBACK callback, WddmResidencyController &residencyController);
8382
void unregisterTrimCallback(PFND3DKMT_TRIMNOTIFICATIONCALLBACK callback, VOID *trimCallbackHandle);
8483
MOCKABLE_VIRTUAL void releaseReservedAddress(void *reservedAddress);
8584
MOCKABLE_VIRTUAL bool reserveValidAddressRange(size_t size, void *&reservedMem);

runtime/os_interface/windows/wddm_memory_manager.cpp

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,42 +28,24 @@ namespace OCLRT {
2828

2929
WddmMemoryManager::~WddmMemoryManager() {
3030
applyCommonCleanup();
31-
32-
for (auto osContext : this->registeredOsContexts) {
33-
if (osContext) {
34-
auto &residencyController = osContext->get()->getResidencyController();
35-
36-
auto lock = residencyController.acquireTrimCallbackLock();
37-
wddm->unregisterTrimCallback(trimCallback, this->trimCallbackHandle);
38-
lock.unlock();
39-
40-
// Wait for lock to ensure trimCallback ended
41-
lock.lock();
42-
}
43-
}
4431
}
4532

4633
WddmMemoryManager::WddmMemoryManager(bool enable64kbPages, bool enableLocalMemory, Wddm *wddm, ExecutionEnvironment &executionEnvironment) : MemoryManager(enable64kbPages, enableLocalMemory, executionEnvironment) {
4734
DEBUG_BREAK_IF(wddm == nullptr);
4835
this->wddm = wddm;
4936
allocator32Bit = std::unique_ptr<Allocator32bit>(new Allocator32bit(wddm->getHeap32Base(), wddm->getHeap32Size()));
50-
this->trimCallbackHandle = wddm->registerTrimCallback(trimCallback, this);
5137
asyncDeleterEnabled = DebugManager.flags.EnableDeferredDeleter.get();
5238
if (asyncDeleterEnabled)
5339
deferredDeleter = createDeferredDeleter();
5440
mallocRestrictions.minAddress = wddm->getWddmMinAddress();
5541
}
5642

5743
void APIENTRY WddmMemoryManager::trimCallback(_Inout_ D3DKMT_TRIMNOTIFICATION *trimNotification) {
58-
WddmMemoryManager *wddmMemMngr = (WddmMemoryManager *)trimNotification->Context;
59-
DEBUG_BREAK_IF(wddmMemMngr == nullptr);
60-
61-
if (wddmMemMngr->getOsContextCount() == 0) {
62-
return;
63-
}
44+
auto residencyController = static_cast<WddmResidencyController *>(trimNotification->Context);
45+
DEBUG_BREAK_IF(residencyController == nullptr);
6446

65-
auto lock = wddmMemMngr->getRegisteredOsContext(0)->get()->getResidencyController().acquireTrimCallbackLock();
66-
wddmMemMngr->getRegisteredOsContext(0)->get()->getResidencyController().trimResidency(trimNotification->Flags, trimNotification->NumBytesToTrim);
47+
auto lock = residencyController->acquireTrimCallbackLock();
48+
residencyController->trimResidency(trimNotification->Flags, trimNotification->NumBytesToTrim);
6749
}
6850

6951
GraphicsAllocation *WddmMemoryManager::allocateGraphicsMemoryForImage(ImageInfo &imgInfo, Gmm *gmm) {

runtime/os_interface/windows/wddm_memory_manager.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,6 @@ class WddmMemoryManager : public MemoryManager {
7979
AlignedMallocRestrictions *getAlignedMallocRestrictions() override;
8080

8181
protected:
82-
VOID *trimCallbackHandle = nullptr;
83-
8482
GraphicsAllocation *createAllocationFromHandle(osHandle handle, bool requireSpecificBitness, bool ntHandle);
8583
static bool validateAllocation(WddmAllocation *alloc);
8684
bool createWddmAllocation(WddmAllocation *allocation, AllocationOrigin origin);

runtime/os_interface/windows/wddm_residency_controller.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,25 @@
88
#include "runtime/os_interface/windows/wddm_residency_controller.h"
99
#include "runtime/os_interface/windows/wddm_allocation.h"
1010
#include "runtime/os_interface/debug_settings_manager.h"
11+
#include "runtime/os_interface/windows/wddm_memory_manager.h"
1112
#include "runtime/os_interface/windows/wddm/wddm.h"
13+
1214
#include "runtime/utilities/spinlock.h"
1315

1416
namespace OCLRT {
1517

16-
WddmResidencyController::WddmResidencyController(Wddm &wddm, uint32_t osContextId) : wddm(wddm), osContextId(osContextId) {}
18+
WddmResidencyController::WddmResidencyController(Wddm &wddm, uint32_t osContextId) : wddm(wddm), osContextId(osContextId) {
19+
this->trimCallbackHandle = wddm.registerTrimCallback(WddmMemoryManager::trimCallback, *this);
20+
}
21+
22+
WddmResidencyController::~WddmResidencyController() {
23+
auto lock = this->acquireTrimCallbackLock();
24+
wddm.unregisterTrimCallback(WddmMemoryManager::trimCallback, this->trimCallbackHandle);
25+
lock.unlock();
26+
27+
// Wait for lock to ensure trimCallback ended
28+
lock.lock();
29+
}
1730

1831
std::unique_lock<SpinLock> WddmResidencyController::acquireLock() {
1932
return std::unique_lock<SpinLock>{this->lock};

runtime/os_interface/windows/wddm_residency_controller.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class Wddm;
2424
class WddmResidencyController {
2525
public:
2626
WddmResidencyController(Wddm &wddm, uint32_t osContextId);
27+
MOCKABLE_VIRTUAL ~WddmResidencyController();
2728

2829
MOCKABLE_VIRTUAL std::unique_lock<SpinLock> acquireLock();
2930
std::unique_lock<SpinLock> acquireTrimCallbackLock();
@@ -59,5 +60,7 @@ class WddmResidencyController {
5960
uint64_t lastTrimFenceValue = 0u;
6061
ResidencyContainer trimCandidateList;
6162
uint32_t trimCandidatesCount = 0;
63+
64+
VOID *trimCallbackHandle = nullptr;
6265
};
6366
} // namespace OCLRT

unit_tests/os_interface/windows/mock_gdi_interface.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class MockGdi : public Gdi {
4949

5050
static NTSTATUS __stdcall unregisterTrimNotificationMock(IN D3DKMT_UNREGISTERTRIMNOTIFICATION *arg) {
5151
getUnregisterTrimNotificationArg() = *arg;
52+
arg->Handle = reinterpret_cast<VOID *>(1);
5253
return 0;
5354
}
5455

unit_tests/os_interface/windows/mock_wddm_memory_manager.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ class MockWddmMemoryManager : public WddmMemoryManager {
1616

1717
public:
1818
using BaseClass::createWddmAllocation;
19-
using BaseClass::trimCallbackHandle;
2019
using BaseClass::WddmMemoryManager;
2120

2221
MockWddmMemoryManager(Wddm *wddm, ExecutionEnvironment &executionEnvironment) : WddmMemoryManager(false, false, wddm, executionEnvironment) {

unit_tests/os_interface/windows/wddm20_tests.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -782,11 +782,13 @@ TEST_F(Wddm20Tests, whenContextIsInitializedThenApplyAdditionalContextFlagsIsCal
782782
TEST_F(Wddm20Tests, givenTrimCallbackRegistrationIsDisabledInDebugVariableWhenRegisteringCallbackThenReturnNullptr) {
783783
DebugManagerStateRestore stateRestore;
784784
DebugManager.flags.DoNotRegisterTrimCallback.set(true);
785-
EXPECT_EQ(nullptr, wddm->registerTrimCallback([](D3DKMT_TRIMNOTIFICATION *) {}, nullptr));
785+
WddmResidencyController residencyController{*wddm, 0u};
786+
EXPECT_EQ(nullptr, wddm->registerTrimCallback([](D3DKMT_TRIMNOTIFICATION *) {}, residencyController));
786787
}
787788

788789
TEST_F(Wddm20Tests, givenSuccessWhenRegisteringTrimCallbackThenReturnTrimCallbackHandle) {
789-
auto trimCallbackHandle = wddm->registerTrimCallback([](D3DKMT_TRIMNOTIFICATION *) {}, nullptr);
790+
WddmResidencyController residencyController{*wddm, 0u};
791+
auto trimCallbackHandle = wddm->registerTrimCallback([](D3DKMT_TRIMNOTIFICATION *) {}, residencyController);
790792
EXPECT_NE(nullptr, trimCallbackHandle);
791793
}
792794

unit_tests/os_interface/windows/wddm_memory_manager_tests.cpp

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,6 @@ TEST_F(WddmMemoryManagerSimpleTest, givenMemoryManagerWhenAllocateGraphicsMemory
113113
memoryManager->freeGraphicsMemory(allocation);
114114
}
115115

116-
TEST_F(WddmMemoryManagerSimpleTest, givenMemoryManagerWhichDoesntRegisteredAnyOsContextWhenTrimCallbackIsCalledThenItReturnsWithoutDoingAnyWork) {
117-
memoryManager.reset(new MockWddmMemoryManager(false, false, wddm, executionEnvironment));
118-
D3DKMT_TRIMNOTIFICATION trimNotification = {};
119-
trimNotification.Context = memoryManager.get();
120-
WddmMemoryManager::trimCallback(&trimNotification);
121-
}
122-
123116
TEST_F(WddmMemoryManagerSimpleTest, givenMemoryManagerWith64KBPagesEnabledWhenAllocateGraphicsMemory64kbIsCalledThenMemoryPoolIsSystem64KBPages) {
124117
memoryManager.reset(new MockWddmMemoryManager(false, false, wddm, executionEnvironment));
125118
auto size = 4096u;
@@ -937,22 +930,6 @@ TEST_F(WddmMemoryManagerResidencyTest, makeResidentResidencyAllocationsSetsLastF
937930
memoryManager->freeGraphicsMemory(allocationTriple);
938931
}
939932

940-
TEST_F(WddmMemoryManagerResidencyTest, trimCallbackIsRegisteredInWddmMemoryManagerCtor) {
941-
EXPECT_EQ((PFND3DKMT_TRIMNOTIFICATIONCALLBACK)memoryManager->trimCallback, gdi->getRegisterTrimNotificationArg().Callback);
942-
EXPECT_EQ(reinterpret_cast<void *>(memoryManager.get()), gdi->getRegisterTrimNotificationArg().Context);
943-
EXPECT_EQ(wddm->getDevice(), gdi->getRegisterTrimNotificationArg().hDevice);
944-
}
945-
946-
TEST_F(WddmMemoryManagerResidencyTest, givenWddmMemoryManagerWhenCallingDestructorThenUnregisterTrimCallback) {
947-
auto trimCallbackHandle = memoryManager->trimCallbackHandle;
948-
auto trimCallbackAddress = reinterpret_cast<PFND3DKMT_TRIMNOTIFICATIONCALLBACK>(memoryManager->trimCallback);
949-
memoryManager.reset();
950-
951-
auto &unregisterNotification = gdi->getUnregisterTrimNotificationArg();
952-
EXPECT_EQ(trimCallbackAddress, unregisterNotification.Callback);
953-
EXPECT_EQ(trimCallbackHandle, unregisterNotification.Handle);
954-
}
955-
956933
TEST_F(BufferWithWddmMemory, ValidHostPtr) {
957934
flags = CL_MEM_USE_HOST_PTR;
958935

0 commit comments

Comments
 (0)