From 39198dfda2e261084ac39369f0bf2979e0db3d60 Mon Sep 17 00:00:00 2001 From: kamdiedrich Date: Fri, 24 Jan 2020 11:30:07 +0100 Subject: [PATCH] Add flag for forcing usage of hostPtrTracking Change-Id: I1a7c27145fcb23a54d49edf24659225621dd4496 --- runtime/memory_manager/memory_manager.h | 17 +++++++++++++++-- .../memory_manager/memory_manager_tests.cpp | 9 +++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/runtime/memory_manager/memory_manager.h b/runtime/memory_manager/memory_manager.h index e929f1850c..3d6c33fe90 100644 --- a/runtime/memory_manager/memory_manager.h +++ b/runtime/memory_manager/memory_manager.h @@ -140,6 +140,10 @@ class MemoryManager { MOCKABLE_VIRTUAL bool isHostPointerTrackingEnabled(); + void setForceNonSvmForExternalHostPtr(bool mode) { + forceNonSvmForExternalHostPtr = mode; + } + const ExecutionEnvironment &peekExecutionEnvironment() const { return executionEnvironment; } OsContext *createAndRegisterOsContext(CommandStreamReceiver *commandStreamReceiver, aub_stream::EngineType engineType, @@ -197,8 +201,16 @@ class MemoryManager { static bool isCopyRequired(ImageInfo &imgInfo, const void *hostPtr); bool useNonSvmHostPtrAlloc(GraphicsAllocation::AllocationType allocationType) { - return ((allocationType == GraphicsAllocation::AllocationType::EXTERNAL_HOST_PTR || allocationType == GraphicsAllocation::AllocationType::MAP_ALLOCATION) && - (!peekExecutionEnvironment().isFullRangeSvm() || !isHostPointerTrackingEnabled()) & !is32bit); + bool isExternalHostPtrAlloc = (allocationType == GraphicsAllocation::AllocationType::EXTERNAL_HOST_PTR); + bool isMapAlloc = (allocationType == GraphicsAllocation::AllocationType::MAP_ALLOCATION); + + if (forceNonSvmForExternalHostPtr && isExternalHostPtrAlloc) { + return true; + } + + bool isNonSvmPtrCapable = ((!peekExecutionEnvironment().isFullRangeSvm() || !isHostPointerTrackingEnabled()) & !is32bit); + + return isNonSvmPtrCapable && (isExternalHostPtrAlloc || isMapAlloc); } StorageInfo createStorageInfoFromProperties(const AllocationProperties &properties); @@ -219,6 +231,7 @@ class MemoryManager { virtual void freeAssociatedResourceImpl(GraphicsAllocation &graphicsAllocation) { return unlockResourceImpl(graphicsAllocation); }; uint32_t getBanksCount(); + bool forceNonSvmForExternalHostPtr = false; bool force32bitAllocations = false; bool virtualPaddingAvailable = false; std::unique_ptr deferredDeleter; diff --git a/unit_tests/memory_manager/memory_manager_tests.cpp b/unit_tests/memory_manager/memory_manager_tests.cpp index c4a9fba878..06c43be3bf 100644 --- a/unit_tests/memory_manager/memory_manager_tests.cpp +++ b/unit_tests/memory_manager/memory_manager_tests.cpp @@ -2187,6 +2187,15 @@ HWTEST_F(MemoryAllocatorTest, givenMemoryManagerWhen64BitAndHostPtrTrackingDisab EXPECT_EQ(expectedValue, result); } +HWTEST_F(MemoryAllocatorTest, givenMemoryManagerWhenHostPtrTrackingModeThenNonSvmHostPtrUsageIsSet) { + memoryManager->setForceNonSvmForExternalHostPtr(true); + + auto result = memoryManager->useNonSvmHostPtrAlloc(GraphicsAllocation::AllocationType::EXTERNAL_HOST_PTR); + EXPECT_EQ(true, result); + result = memoryManager->useNonSvmHostPtrAlloc(GraphicsAllocation::AllocationType::BUFFER_HOST_MEMORY); + EXPECT_EQ(false, result); +} + HWTEST_F(MemoryAllocatorTest, givenMemoryManagerWhenHostPtrTrackingEnabledThenNonSvmHostPtrUsageDependsOnFullRangeSvm) { DebugManagerStateRestore dbgRestore; DebugManager.flags.EnableHostPtrTracking.set(1);