From 674691d17042933a86b1c24591af564f145e2f2f Mon Sep 17 00:00:00 2001 From: "Milczarek, Slawomir" Date: Tue, 28 Feb 2023 00:20:17 +0000 Subject: [PATCH] Fix check for page faults enabled in get memory access properties Related-To: NEO-6465 Signed-off-by: Milczarek, Slawomir --- level_zero/core/source/device/device_imp.cpp | 2 +- .../unit_tests/sources/device/test_l0_device.cpp | 8 ++++++++ shared/source/memory_manager/memory_manager.h | 1 + .../os_interface/linux/drm_memory_manager.cpp | 6 ++++++ .../os_interface/linux/drm_memory_manager.h | 1 + shared/test/common/mocks/mock_memory_manager.cpp | 7 +++++++ shared/test/common/mocks/mock_memory_manager.h | 1 + .../memory_manager/memory_manager_tests.cpp | 7 +++++++ .../linux/drm_memory_manager_tests.cpp | 15 +++++++++++++++ 9 files changed, 47 insertions(+), 1 deletion(-) diff --git a/level_zero/core/source/device/device_imp.cpp b/level_zero/core/source/device/device_imp.cpp index 48b7513371..a0237d3497 100644 --- a/level_zero/core/source/device/device_imp.cpp +++ b/level_zero/core/source/device/device_imp.cpp @@ -628,7 +628,7 @@ ze_result_t DeviceImp::getMemoryAccessProperties(ze_device_memory_access_propert auto memoryManager = this->getDriverHandle()->getMemoryManager(); if (memoryManager->isKmdMigrationAvailable(this->getRootDeviceIndex()) && - NEO::DebugManager.flags.EnableRecoverablePageFaults.get() == 1) { + memoryManager->hasPageFaultsEnabled(*this->getNEODevice())) { pMemAccessProperties->sharedCrossDeviceAllocCapabilities |= ZE_MEMORY_ACCESS_CAP_FLAG_CONCURRENT; if (this->getNEODevice()->getHardwareInfo().capabilityTable.p2pAtomicAccessSupported) { pMemAccessProperties->sharedCrossDeviceAllocCapabilities |= ZE_MEMORY_ACCESS_CAP_FLAG_ATOMIC | ZE_MEMORY_ACCESS_CAP_FLAG_CONCURRENT_ATOMIC; diff --git a/level_zero/core/test/unit_tests/sources/device/test_l0_device.cpp b/level_zero/core/test/unit_tests/sources/device/test_l0_device.cpp index 24a6225dbf..4c2e8c9486 100644 --- a/level_zero/core/test/unit_tests/sources/device/test_l0_device.cpp +++ b/level_zero/core/test/unit_tests/sources/device/test_l0_device.cpp @@ -2016,6 +2016,14 @@ TEST_F(DeviceHas64BitAtomicTest, givenDeviceWithSupportForInteger64BitAtomicsThe struct MockMemoryManagerMultiDevice : public MemoryManagerMock { MockMemoryManagerMultiDevice(NEO::ExecutionEnvironment &executionEnvironment) : MemoryManagerMock(const_cast(executionEnvironment)) {} + bool hasPageFaultsEnabled(const NEO::Device &neoDevice) override { + if (DebugManager.flags.EnableRecoverablePageFaults.get() != -1) { + return DebugManager.flags.EnableRecoverablePageFaults.get(); + } + + return false; + } + bool isKmdMigrationAvailable(uint32_t rootDeviceIndex) override { if (DebugManager.flags.UseKmdMigration.get() != -1) { return DebugManager.flags.UseKmdMigration.get(); diff --git a/shared/source/memory_manager/memory_manager.h b/shared/source/memory_manager/memory_manager.h index be962a882a..1fd6f80751 100644 --- a/shared/source/memory_manager/memory_manager.h +++ b/shared/source/memory_manager/memory_manager.h @@ -189,6 +189,7 @@ class MemoryManager { bool isLocalMemorySupported(uint32_t rootDeviceIndex) const; virtual bool isMemoryBudgetExhausted() const; + virtual bool hasPageFaultsEnabled(const Device &neoDevice) { return false; } virtual bool isKmdMigrationAvailable(uint32_t rootDeviceIndex) { return false; } virtual AlignedMallocRestrictions *getAlignedMallocRestrictions() { diff --git a/shared/source/os_interface/linux/drm_memory_manager.cpp b/shared/source/os_interface/linux/drm_memory_manager.cpp index bbd255c1bd..0b4065815d 100644 --- a/shared/source/os_interface/linux/drm_memory_manager.cpp +++ b/shared/source/os_interface/linux/drm_memory_manager.cpp @@ -8,6 +8,7 @@ #include "shared/source/os_interface/linux/drm_memory_manager.h" #include "shared/source/command_stream/command_stream_receiver.h" +#include "shared/source/device/device.h" #include "shared/source/execution_environment/execution_environment.h" #include "shared/source/execution_environment/root_device_environment.h" #include "shared/source/gmm_helper/cache_settings_helper.h" @@ -237,6 +238,11 @@ void DrmMemoryManager::releaseGpuRange(void *address, size_t unmapSize, uint32_t gfxPartition->freeGpuAddressRange(graphicsAddress, unmapSize); } +bool DrmMemoryManager::hasPageFaultsEnabled(const Device &neoDevice) { + auto *drm = neoDevice.getRootDeviceEnvironment().osInterface->getDriverModel()->as(); + return drm->hasPageFaultSupport(); +} + bool DrmMemoryManager::isKmdMigrationAvailable(uint32_t rootDeviceIndex) { auto hwInfo = executionEnvironment.rootDeviceEnvironments[rootDeviceIndex]->getHardwareInfo(); auto &gfxCoreHelper = executionEnvironment.rootDeviceEnvironments[rootDeviceIndex]->getHelper(); diff --git a/shared/source/os_interface/linux/drm_memory_manager.h b/shared/source/os_interface/linux/drm_memory_manager.h index e62173378b..9fbbd59b60 100644 --- a/shared/source/os_interface/linux/drm_memory_manager.h +++ b/shared/source/os_interface/linux/drm_memory_manager.h @@ -70,6 +70,7 @@ class DrmMemoryManager : public MemoryManager { MOCKABLE_VIRTUAL BufferObject *createBufferObjectInMemoryRegion(Drm *drm, Gmm *gmm, AllocationType allocationType, uint64_t gpuAddress, size_t size, uint32_t memoryBanks, size_t maxOsContextCount, int32_t pairHandle); + bool hasPageFaultsEnabled(const Device &neoDevice) override; bool isKmdMigrationAvailable(uint32_t rootDeviceIndex) override; bool setMemAdvise(GraphicsAllocation *gfxAllocation, MemAdviseFlags flags, uint32_t rootDeviceIndex) override; diff --git a/shared/test/common/mocks/mock_memory_manager.cpp b/shared/test/common/mocks/mock_memory_manager.cpp index f421cf8f5f..578d302985 100644 --- a/shared/test/common/mocks/mock_memory_manager.cpp +++ b/shared/test/common/mocks/mock_memory_manager.cpp @@ -195,6 +195,13 @@ void MockMemoryManager::forceLimitedRangeAllocator(uint32_t rootDeviceIndex, uin getGfxPartition(rootDeviceIndex)->init(range, 0, 0, gfxPartitions.size()); } +bool MockMemoryManager::hasPageFaultsEnabled(const Device &neoDevice) { + if (DebugManager.flags.EnableRecoverablePageFaults.get() != -1) { + return !!DebugManager.flags.EnableRecoverablePageFaults.get(); + } + return false; +} + bool MockMemoryManager::isKmdMigrationAvailable(uint32_t rootDeviceIndex) { if (DebugManager.flags.UseKmdMigration.get() != -1) { return !!DebugManager.flags.UseKmdMigration.get(); diff --git a/shared/test/common/mocks/mock_memory_manager.h b/shared/test/common/mocks/mock_memory_manager.h index 5320bf96b6..bef88d8672 100644 --- a/shared/test/common/mocks/mock_memory_manager.h +++ b/shared/test/common/mocks/mock_memory_manager.h @@ -159,6 +159,7 @@ class MockMemoryManager : public MemoryManagerCreate { return MemoryManager::setMemPrefetch(gfxAllocation, subDeviceIds, rootDeviceIndex); } + bool hasPageFaultsEnabled(const Device &neoDevice) override; bool isKmdMigrationAvailable(uint32_t rootDeviceIndex) override; struct CopyMemoryToAllocationBanksParams { diff --git a/shared/test/unit_test/memory_manager/memory_manager_tests.cpp b/shared/test/unit_test/memory_manager/memory_manager_tests.cpp index 3ce09e637f..23d5f2f1fb 100644 --- a/shared/test/unit_test/memory_manager/memory_manager_tests.cpp +++ b/shared/test/unit_test/memory_manager/memory_manager_tests.cpp @@ -19,6 +19,13 @@ using namespace NEO; +TEST(MemoryManagerTest, WhenCallingHasPageFaultsEnabledThenReturnFalse) { + MockExecutionEnvironment executionEnvironment(defaultHwInfo.get()); + OsAgnosticMemoryManager memoryManager(executionEnvironment); + MockDevice device; + EXPECT_FALSE(memoryManager.hasPageFaultsEnabled(device)); +} + TEST(MemoryManagerTest, WhenCallingIsAllocationTypeToCaptureThenScratchAndPrivateTypesReturnTrue) { MockMemoryManager mockMemoryManager; diff --git a/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp index d795732c8d..12fc7bb8dd 100644 --- a/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp @@ -150,6 +150,21 @@ TEST_P(MemoryManagerMultiDeviceSharedHandleTest, whenCreatingAllocationFromShare memoryManager->freeGraphicsMemory(gfxAllocation1); } +TEST_F(DrmMemoryManagerTest, whenCallingHasPageFaultsEnabledThenReturnCorrectValue) { + DebugManagerStateRestore dbgState; + + EXPECT_FALSE(memoryManager->hasPageFaultsEnabled(*device)); + + for (auto debugFlag : {-1, 0, 1}) { + DebugManager.flags.EnableRecoverablePageFaults.set(debugFlag); + if (debugFlag == 1) { + EXPECT_TRUE(memoryManager->hasPageFaultsEnabled(*device)); + } else { + EXPECT_FALSE(memoryManager->hasPageFaultsEnabled(*device)); + } + } +} + TEST_F(DrmMemoryManagerTest, givenEnableDirectSubmissionWhenCreateDrmMemoryManagerThenGemCloseWorkerInactive) { DebugManagerStateRestore dbgState; DebugManager.flags.EnableDirectSubmission.set(1);