diff --git a/shared/source/ail/ail_configuration.h b/shared/source/ail/ail_configuration.h index 0935c274df..913d888ef6 100644 --- a/shared/source/ail/ail_configuration.h +++ b/shared/source/ail/ail_configuration.h @@ -70,6 +70,8 @@ class AILConfiguration { virtual bool is256BPrefetchDisableRequired() = 0; + virtual bool drainHostptrs() = 0; + virtual bool isBufferPoolEnabled() = 0; virtual ~AILConfiguration() = default; @@ -101,6 +103,7 @@ extern const std::set applicationsForceRcsDg2; extern const std::set applicationsBufferPoolDisabled; extern const std::set applicationsBufferPoolDisabledDg2; extern const std::set applicationsOverfetchDisabled; +extern const std::set applicationsDrainHostptrsDisabled; extern const std::set applicationsDeviceUSMRecyclingLimited; template @@ -116,6 +119,7 @@ class AILConfigurationHw : public AILConfiguration { void modifyKernelIfRequired(std::string &kernel) override; bool isContextSyncFlagRequired() override; bool is256BPrefetchDisableRequired() override; + bool drainHostptrs() override; bool isBufferPoolEnabled() override; bool useLegacyValidationLogic() override; bool forceRcs() override; diff --git a/shared/source/ail/ail_configuration_base.inl b/shared/source/ail/ail_configuration_base.inl index cff6f8ab7b..5179d70311 100644 --- a/shared/source/ail/ail_configuration_base.inl +++ b/shared/source/ail/ail_configuration_base.inl @@ -34,6 +34,11 @@ inline bool AILConfigurationHw::is256BPrefetchDisableRequired() { return false; } +template +inline bool AILConfigurationHw::drainHostptrs() { + return true; +} + template inline bool AILConfigurationHw::isBufferPoolEnabled() { return true; diff --git a/shared/source/ail/ail_configuration_extra.cpp b/shared/source/ail/ail_configuration_extra.cpp index 04293a7487..11021199bc 100644 --- a/shared/source/ail/ail_configuration_extra.cpp +++ b/shared/source/ail/ail_configuration_extra.cpp @@ -38,6 +38,8 @@ const std::set applicationsBufferPoolDisabledDg2 = {}; const std::set applicationsOverfetchDisabled = {}; +const std::set applicationsDrainHostptrsDisabled = {}; + const std::set applicationsDeviceUSMRecyclingLimited = {}; AILConfigurationCreateFunctionType ailConfigurationFactory[IGFX_MAX_PRODUCT]; diff --git a/shared/source/ail/xe2_hpg_core/lnl/ail_configuration_lnl.cpp b/shared/source/ail/xe2_hpg_core/lnl/ail_configuration_lnl.cpp index 22aca3dff3..089aa800ad 100644 --- a/shared/source/ail/xe2_hpg_core/lnl/ail_configuration_lnl.cpp +++ b/shared/source/ail/xe2_hpg_core/lnl/ail_configuration_lnl.cpp @@ -30,5 +30,11 @@ bool AILConfigurationHw::is256BPrefetchDisableRequired() { return iterator != applicationsOverfetchDisabled.end(); } +template <> +bool AILConfigurationHw::drainHostptrs() { + auto iterator = applicationsDrainHostptrsDisabled.find(processName); + return iterator == applicationsDrainHostptrsDisabled.end(); +} + template class AILConfigurationHw; } // namespace NEO diff --git a/shared/source/memory_manager/memory_manager.cpp b/shared/source/memory_manager/memory_manager.cpp index 1d91bf0a5b..db9f608937 100644 --- a/shared/source/memory_manager/memory_manager.cpp +++ b/shared/source/memory_manager/memory_manager.cpp @@ -7,6 +7,7 @@ #include "shared/source/memory_manager/memory_manager.h" +#include "shared/source/ail/ail_configuration.h" #include "shared/source/command_stream/command_stream_receiver.h" #include "shared/source/debug_settings/debug_settings_manager.h" #include "shared/source/device/device.h" @@ -744,9 +745,12 @@ bool MemoryManager::mapAuxGpuVA(GraphicsAllocation *graphicsAllocation) { } GraphicsAllocation *MemoryManager::allocateGraphicsMemory(const AllocationData &allocationData) { + auto ail = executionEnvironment.rootDeviceEnvironments[allocationData.rootDeviceIndex]->getAILConfigurationHelper(); + if (allocationData.type == AllocationType::externalHostPtr && allocationData.hostPtr && - this->getDeferredDeleter()) { + this->getDeferredDeleter() && + (!ail || ail->drainHostptrs())) { this->getDeferredDeleter()->drain(true, true); } diff --git a/shared/test/common/mocks/mock_ail_configuration.h b/shared/test/common/mocks/mock_ail_configuration.h index d75a21b23d..184ba36da3 100644 --- a/shared/test/common/mocks/mock_ail_configuration.h +++ b/shared/test/common/mocks/mock_ail_configuration.h @@ -68,6 +68,10 @@ class MockAILConfiguration : public AILConfiguration { } bool disableBindlessAddressingValue = false; + bool drainHostptrs() override { + return true; + } + protected: void applyExt(RuntimeCapabilityTable &runtimeCapabilityTable) override {} }; diff --git a/shared/test/unit_test/ail/ail_tests.cpp b/shared/test/unit_test/ail/ail_tests.cpp index 364060dbbd..729ed1cf78 100644 --- a/shared/test/unit_test/ail/ail_tests.cpp +++ b/shared/test/unit_test/ail/ail_tests.cpp @@ -124,4 +124,10 @@ HWTEST2_F(AILTests, GivenAilWhenCheckingOverfetchDisableRequiredThenExpectFalse, EXPECT_FALSE(ail.is256BPrefetchDisableRequired()); } +HWTEST2_F(AILTests, GivenAilWhenCheckingDrainHostptrsRequiredThenExpectTrue, MatchAny) { + AILWhitebox ail; + ail.processName = "other"; + EXPECT_TRUE(ail.drainHostptrs()); +} + } // namespace NEO