From 92316c8cd60cf2a978e62736d19a86892e0e7fcb Mon Sep 17 00:00:00 2001 From: Mateusz Jablonski Date: Thu, 11 Sep 2025 14:10:05 +0000 Subject: [PATCH] fix: don't setup notifyAubCapture callback when not needed Related-To: NEO-11080 Signed-off-by: Mateusz Jablonski --- .../source/gmm_helper/wddm/gmm_callbacks.inl | 16 +++--- .../os_interface/linux/drm_command_stream.inl | 3 +- .../configure_device_address_space_wddm.cpp | 5 +- .../source/os_interface/windows/wddm/wddm.cpp | 4 ++ .../source/os_interface/windows/wddm/wddm.h | 1 + .../windows/wddm_device_command_stream.inl | 4 +- .../gmm_helper/gmm_callbacks_tests.cpp | 10 ---- .../windows/device_command_stream_tests.cpp | 23 +++++--- .../windows/wddm_windows_tests.cpp | 53 ++++++++++++++++++- 9 files changed, 88 insertions(+), 31 deletions(-) diff --git a/shared/source/gmm_helper/wddm/gmm_callbacks.inl b/shared/source/gmm_helper/wddm/gmm_callbacks.inl index 4a000e50a2..dbdc50db79 100644 --- a/shared/source/gmm_helper/wddm/gmm_callbacks.inl +++ b/shared/source/gmm_helper/wddm/gmm_callbacks.inl @@ -18,15 +18,13 @@ template long __stdcall GmmCallbacks::notifyAubCapture(void *csrHandle, uint64_t gfxAddress, size_t gfxSize, bool allocate) { auto csr = reinterpret_cast *>(csrHandle); - if (obtainCsrTypeFromIntegerValue(debugManager.flags.SetCommandStreamReceiver.get(), CommandStreamReceiverType::hardware) == CommandStreamReceiverType::hardwareWithAub) { - auto csrWithAub = static_cast> *>(csr); - auto aubCsr = static_cast *>(csrWithAub->aubCSR.get()); - if (allocate) { - AllocationView externalAllocation(gfxAddress, gfxSize); - aubCsr->makeResidentExternal(externalAllocation); - } else { - aubCsr->makeNonResidentExternal(gfxAddress); - } + auto csrWithAub = static_cast> *>(csr); + auto aubCsr = static_cast *>(csrWithAub->aubCSR.get()); + if (allocate) { + AllocationView externalAllocation(gfxAddress, gfxSize); + aubCsr->makeResidentExternal(externalAllocation); + } else { + aubCsr->makeNonResidentExternal(gfxAddress); } return 1; diff --git a/shared/source/os_interface/linux/drm_command_stream.inl b/shared/source/os_interface/linux/drm_command_stream.inl index 34f7cdf6b5..e5e25059cf 100644 --- a/shared/source/os_interface/linux/drm_command_stream.inl +++ b/shared/source/os_interface/linux/drm_command_stream.inl @@ -300,7 +300,6 @@ GmmPageTableMngr *DrmCommandStreamReceiver::createPageTableManager() gmmClientContext->setGmmDeviceInfo(&deviceInfo); auto gmmPageTableMngr = GmmPageTableMngr::create(gmmClientContext, TT_TYPE::AUXTT, nullptr); - gmmPageTableMngr->setCsrHandle(this); this->pageTableManager.reset(gmmPageTableMngr); @@ -390,4 +389,4 @@ template bool DrmCommandStreamReceiver::isKmdWaitOnTaskCountAllowed() const { return this->isDirectSubmissionEnabled() && this->vmBindAvailable; } -} // namespace NEO \ No newline at end of file +} // namespace NEO diff --git a/shared/source/os_interface/windows/wddm/configure_device_address_space_wddm.cpp b/shared/source/os_interface/windows/wddm/configure_device_address_space_wddm.cpp index 7133132c76..c68eb5503d 100644 --- a/shared/source/os_interface/windows/wddm/configure_device_address_space_wddm.cpp +++ b/shared/source/os_interface/windows/wddm/configure_device_address_space_wddm.cpp @@ -39,8 +39,9 @@ bool Wddm::configureDeviceAddressSpace() { deviceCallbacks.DevCbPtrs.KmtCbPtrs.pfnFreeGPUVA = getGdi()->freeGpuVirtualAddress; auto hwInfo = rootDeviceEnvironment.getHardwareInfo(); - - deviceCallbacks.DevCbPtrs.KmtCbPtrs.pfnNotifyAubCapture = notifyAubCaptureFuncFactory[hwInfo->platform.eRenderCoreFamily]; + if (needsNotifyAubCaptureCallback()) { + deviceCallbacks.DevCbPtrs.KmtCbPtrs.pfnNotifyAubCapture = notifyAubCaptureFuncFactory[hwInfo->platform.eRenderCoreFamily]; + } GMM_DEVICE_INFO deviceInfo{}; deviceInfo.pGfxPartition = &gfxPartition; diff --git a/shared/source/os_interface/windows/wddm/wddm.cpp b/shared/source/os_interface/windows/wddm/wddm.cpp index 42172e2bea..c9bb75b958 100644 --- a/shared/source/os_interface/windows/wddm/wddm.cpp +++ b/shared/source/os_interface/windows/wddm/wddm.cpp @@ -1432,4 +1432,8 @@ void Wddm::setNewResourceBoundToPageTable() { } this->forEachContextWithinWddm([](const EngineControl &engine) { engine.osContext->setNewResourceBound(); }); } + +bool Wddm::needsNotifyAubCaptureCallback() const { + return obtainCsrTypeFromIntegerValue(debugManager.flags.SetCommandStreamReceiver.get(), CommandStreamReceiverType::hardware) == CommandStreamReceiverType::hardwareWithAub; +} } // namespace NEO diff --git a/shared/source/os_interface/windows/wddm/wddm.h b/shared/source/os_interface/windows/wddm/wddm.h index 96661e14be..c51f3b1615 100644 --- a/shared/source/os_interface/windows/wddm/wddm.h +++ b/shared/source/os_interface/windows/wddm/wddm.h @@ -230,6 +230,7 @@ class Wddm : public DriverModel { bool getDeviceExecutionState(D3DKMT_DEVICESTATE_TYPE stateType, void *privateData); MOCKABLE_VIRTUAL bool getDeviceState(); + bool needsNotifyAubCaptureCallback() const; protected: bool translateTopologyInfo(TopologyMapping &mapping); diff --git a/shared/source/os_interface/windows/wddm_device_command_stream.inl b/shared/source/os_interface/windows/wddm_device_command_stream.inl index d91677edcb..2bd0f68230 100644 --- a/shared/source/os_interface/windows/wddm_device_command_stream.inl +++ b/shared/source/os_interface/windows/wddm_device_command_stream.inl @@ -177,7 +177,9 @@ GmmPageTableMngr *WddmCommandStreamReceiver::createPageTableManager() ttCallbacks.pfWriteL3Adr = writeL3AddressFuncFactory[hwInfo->platform.eRenderCoreFamily]; GmmPageTableMngr *gmmPageTableMngr = GmmPageTableMngr::create(rootDeviceEnvironment->getGmmClientContext(), TT_TYPE::AUXTT, &ttCallbacks); - gmmPageTableMngr->setCsrHandle(this); + if (this->wddm->needsNotifyAubCaptureCallback()) { + gmmPageTableMngr->setCsrHandle(this); + } this->pageTableManager.reset(gmmPageTableMngr); return gmmPageTableMngr; } diff --git a/shared/test/unit_test/gmm_helper/gmm_callbacks_tests.cpp b/shared/test/unit_test/gmm_helper/gmm_callbacks_tests.cpp index 5fa7915f80..830f5ae393 100644 --- a/shared/test/unit_test/gmm_helper/gmm_callbacks_tests.cpp +++ b/shared/test/unit_test/gmm_helper/gmm_callbacks_tests.cpp @@ -14,16 +14,6 @@ using GmmCallbacksTests = ::Test; -HWTEST_F(GmmCallbacksTests, givenCsrWithoutAubDumpWhenNotifyAubCaptureCallbackIsCalledThenDoNothing) { - UltCommandStreamReceiver csr(*executionEnvironment, 0, 1); - uint64_t address = 0xFEDCBA9876543210; - size_t size = 1024; - - auto res = GmmCallbacks::notifyAubCapture(&csr, address, size, true); - - EXPECT_EQ(1, res); -} - HWTEST_F(GmmCallbacksTests, whenWriteL3CalledThenWriteTwoMmio) { using MI_LOAD_REGISTER_IMM = typename FamilyType::MI_LOAD_REGISTER_IMM; diff --git a/shared/test/unit_test/os_interface/windows/device_command_stream_tests.cpp b/shared/test/unit_test/os_interface/windows/device_command_stream_tests.cpp index ce19b34f63..d5d7d67080 100644 --- a/shared/test/unit_test/os_interface/windows/device_command_stream_tests.cpp +++ b/shared/test/unit_test/os_interface/windows/device_command_stream_tests.cpp @@ -863,12 +863,17 @@ struct WddmCsrCompressionTests : ::testing::Test { WddmMock *myMockWddm; }; -struct WddmCsrCompressionParameterizedTest : WddmCsrCompressionTests, ::testing::WithParamInterface { +struct WddmCsrCompressionParameterizedTest : WddmCsrCompressionTests, ::testing::WithParamInterface> { void SetUp() override { - compressionEnabled = GetParam(); + std::tie(compressionEnabled, aubCaptureMode) = GetParam(); + if (aubCaptureMode) { + debugManager.flags.SetCommandStreamReceiver.set(3); + } } + DebugManagerStateRestore restorer; bool compressionEnabled; + bool aubCaptureMode; }; HWTEST_P(WddmCsrCompressionParameterizedTest, givenEnabledCompressionWhenInitializedThenCreatePagetableMngr) { @@ -884,8 +889,13 @@ HWTEST_P(WddmCsrCompressionParameterizedTest, givenEnabledCompressionWhenInitial ASSERT_NE(nullptr, mockWddmCsr.pageTableManager.get()); auto mockMngr = reinterpret_cast(mockWddmCsr.pageTableManager.get()); - EXPECT_EQ(1u, mockMngr->setCsrHanleCalled); - EXPECT_EQ(&mockWddmCsr, mockMngr->passedCsrHandle); + + if (aubCaptureMode) { + EXPECT_EQ(1u, mockMngr->setCsrHanleCalled); + EXPECT_EQ(&mockWddmCsr, mockMngr->passedCsrHandle); + } else { + EXPECT_EQ(0u, mockMngr->setCsrHanleCalled); + } GMM_TRANSLATIONTABLE_CALLBACKS expectedTTCallbacks = {}; unsigned int expectedFlags = TT_TYPE::AUXTT; @@ -908,9 +918,10 @@ HWTEST_F(WddmCsrCompressionTests, givenDisabledCompressionWhenInitializedThenDon } INSTANTIATE_TEST_SUITE_P( - WddmCsrCompressionParameterizedTestCreate, + , WddmCsrCompressionParameterizedTest, - ::testing::Bool()); + ::testing::Combine(::testing::Bool(), + ::testing::Bool())); struct WddmCsrCompressionTestsWithMockWddmCsr : public WddmCsrCompressionTests { diff --git a/shared/test/unit_test/os_interface/windows/wddm_windows_tests.cpp b/shared/test/unit_test/os_interface/windows/wddm_windows_tests.cpp index 12de8ecf45..9dee9fccd0 100644 --- a/shared/test/unit_test/os_interface/windows/wddm_windows_tests.cpp +++ b/shared/test/unit_test/os_interface/windows/wddm_windows_tests.cpp @@ -185,7 +185,58 @@ TEST(WddmGfxPartitionTests, WhenInitializingGfxPartitionThen64KBHeapsAreUsed) { EXPECT_EQ(wddm->gfxPartition.Standard64KB.Base + rootDeviceIndex * heapStandard64KBSize, gfxPartition.getHeapBase(HeapIndex::heapStandard64KB)); } -TEST_F(Wddm20WithMockGdiDllTests, whenSetDeviceInfoSucceedsThenDeviceCallbacksArePassedToGmmMemory) { +TEST_F(Wddm20WithMockGdiDllTests, givenDefaultScenarioWhenSetDeviceInfoSucceedsThenDeviceCallbacksWithoutNotifyAubCaptureArePassedToGmmMemory) { + GMM_DEVICE_CALLBACKS_INT expectedDeviceCb{}; + wddm->init(); + auto gdi = wddm->getGdi(); + auto gmmMemory = static_cast(wddm->getGmmMemory()); + + expectedDeviceCb.Adapter.KmtHandle = wddm->getAdapter(); + expectedDeviceCb.hDevice.KmtHandle = wddm->getDeviceHandle(); + expectedDeviceCb.hCsr = nullptr; + expectedDeviceCb.PagingQueue = wddm->getPagingQueue(); + expectedDeviceCb.PagingFence = wddm->getPagingQueueSyncObject(); + + expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnAllocate = gdi->createAllocation; + expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnDeallocate = gdi->destroyAllocation; + expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnDeallocate2 = gdi->destroyAllocation2; + expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnMapGPUVA = gdi->mapGpuVirtualAddress; + expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnMakeResident = gdi->makeResident; + expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnEvict = gdi->evict; + expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnReserveGPUVA = gdi->reserveGpuVirtualAddress; + expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnUpdateGPUVA = gdi->updateGpuVirtualAddress; + expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnWaitFromCpu = gdi->waitForSynchronizationObjectFromCpu; + expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnLock = gdi->lock2; + expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnUnLock = gdi->unlock2; + expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnEscape = gdi->escape; + expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnFreeGPUVA = gdi->freeGpuVirtualAddress; + expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnNotifyAubCapture = nullptr; + + EXPECT_EQ(expectedDeviceCb.Adapter.KmtHandle, gmmMemory->deviceCallbacks.Adapter.KmtHandle); + EXPECT_EQ(expectedDeviceCb.hDevice.KmtHandle, gmmMemory->deviceCallbacks.hDevice.KmtHandle); + EXPECT_EQ(expectedDeviceCb.hCsr, gmmMemory->deviceCallbacks.hCsr); + EXPECT_EQ(expectedDeviceCb.PagingQueue, gmmMemory->deviceCallbacks.PagingQueue); + EXPECT_EQ(expectedDeviceCb.PagingFence, gmmMemory->deviceCallbacks.PagingFence); + EXPECT_EQ(expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnAllocate, gmmMemory->deviceCallbacks.DevCbPtrs.KmtCbPtrs.pfnAllocate); + EXPECT_EQ(expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnDeallocate, gmmMemory->deviceCallbacks.DevCbPtrs.KmtCbPtrs.pfnDeallocate); + EXPECT_EQ(expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnDeallocate2, gmmMemory->deviceCallbacks.DevCbPtrs.KmtCbPtrs.pfnDeallocate2); + EXPECT_EQ(expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnMapGPUVA, gmmMemory->deviceCallbacks.DevCbPtrs.KmtCbPtrs.pfnMapGPUVA); + EXPECT_EQ(expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnMakeResident, gmmMemory->deviceCallbacks.DevCbPtrs.KmtCbPtrs.pfnMakeResident); + EXPECT_EQ(expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnEvict, gmmMemory->deviceCallbacks.DevCbPtrs.KmtCbPtrs.pfnEvict); + EXPECT_EQ(expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnReserveGPUVA, gmmMemory->deviceCallbacks.DevCbPtrs.KmtCbPtrs.pfnReserveGPUVA); + EXPECT_EQ(expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnUpdateGPUVA, gmmMemory->deviceCallbacks.DevCbPtrs.KmtCbPtrs.pfnUpdateGPUVA); + EXPECT_EQ(expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnWaitFromCpu, gmmMemory->deviceCallbacks.DevCbPtrs.KmtCbPtrs.pfnWaitFromCpu); + EXPECT_EQ(expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnLock, gmmMemory->deviceCallbacks.DevCbPtrs.KmtCbPtrs.pfnLock); + EXPECT_EQ(expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnUnLock, gmmMemory->deviceCallbacks.DevCbPtrs.KmtCbPtrs.pfnUnLock); + EXPECT_EQ(expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnEscape, gmmMemory->deviceCallbacks.DevCbPtrs.KmtCbPtrs.pfnEscape); + EXPECT_EQ(expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnFreeGPUVA, gmmMemory->deviceCallbacks.DevCbPtrs.KmtCbPtrs.pfnFreeGPUVA); + EXPECT_EQ(expectedDeviceCb.DevCbPtrs.KmtCbPtrs.pfnNotifyAubCapture, gmmMemory->deviceCallbacks.DevCbPtrs.KmtCbPtrs.pfnNotifyAubCapture); +} + +TEST_F(Wddm20WithMockGdiDllTests, givenHwWithAubCaptureWhenSetDeviceInfoSucceedsThenNotifyAubCaptureDeviceCallbackIsPassedToGmmMemory) { + + DebugManagerStateRestore restorer{}; + debugManager.flags.SetCommandStreamReceiver.set(3); GMM_DEVICE_CALLBACKS_INT expectedDeviceCb{}; wddm->init(); auto gdi = wddm->getGdi();