From 67a31d097595a868be18a335ee0553fde20a7e0c Mon Sep 17 00:00:00 2001 From: Igor Venevtsev Date: Mon, 26 Oct 2020 23:16:49 +0100 Subject: [PATCH] Check for supported CPU VA size in GfxPartition initialization Resolves: NEO-5220 Change-Id: I081b0c693e9d7a468be81e12d7f816fada5da21d Signed-off-by: Igor Venevtsev --- .../memory_manager/gfx_partition_tests.inl | 30 ++++++++++++++++++- .../source/memory_manager/gfx_partition.cpp | 6 ++-- shared/source/memory_manager/gfx_partition.h | 2 +- .../gfx_partition_init_additional_range.cpp | 2 +- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/opencl/test/unit_test/memory_manager/gfx_partition_tests.inl b/opencl/test/unit_test/memory_manager/gfx_partition_tests.inl index 1ee5b989f5..23670bb704 100644 --- a/opencl/test/unit_test/memory_manager/gfx_partition_tests.inl +++ b/opencl/test/unit_test/memory_manager/gfx_partition_tests.inl @@ -9,11 +9,29 @@ #include "shared/source/helpers/basic_math.h" #include "shared/source/helpers/ptr_math.h" #include "shared/source/os_interface/os_memory.h" +#include "shared/source/utilities/cpu_info.h" #include "opencl/test/unit_test/mocks/mock_gfx_partition.h" #include "gtest/gtest.h" +// CpuInfo is a singleton object so we have to patch it in place +class CpuInfoOverrideCpuVirtualAddressSize { + public: + class MockCpuInfo : public CpuInfo { + public: + using CpuInfo::virtualAddressSize; + } *mockCpuInfo = reinterpret_cast(const_cast(&CpuInfo::getInstance())); + CpuInfoOverrideCpuVirtualAddressSize(uint32_t newCpuVirtualAddressSize) { + virtualAddressSizeSave = mockCpuInfo->getVirtualAddressSize(); + mockCpuInfo->virtualAddressSize = newCpuVirtualAddressSize; + } + ~CpuInfoOverrideCpuVirtualAddressSize() { + mockCpuInfo->virtualAddressSize = virtualAddressSizeSave; + } + uint32_t virtualAddressSizeSave = 0; +}; + using namespace NEO; constexpr size_t reservedCpuAddressRangeSize = is64bit ? (6 * 4 * GB) : 0; @@ -141,6 +159,16 @@ TEST(GfxPartitionTest, testGfxPartitionUnsupportedRange) { EXPECT_FALSE(gfxPartition.init(maxNBitValue(48 + 1), reservedCpuAddressRangeSize, 0, 1)); } +TEST(GfxPartitionTest, testGfxPartitionUnsupportedCpuVirualAddressSize) { + if (is32bit) { + GTEST_SKIP(); + } + + CpuInfoOverrideCpuVirtualAddressSize overrideCpuVirtualAddressSize(48 + 1); + MockGfxPartition gfxPartition; + EXPECT_FALSE(gfxPartition.init(maxNBitValue(48), reservedCpuAddressRangeSize, 0, 1)); +} + TEST(GfxPartitionTest, testGfxPartitionFullRange48BitSVMHeap64KBSplit) { uint32_t rootDeviceIndex = 3; size_t numRootDevices = 5; @@ -330,4 +358,4 @@ TEST(GfxPartitionTest, givenInternalHeapWhenAllocatingSmallOrBigChunkThenAddress EXPECT_EQ(gfxPartition.getHeapBase(heaps[i]) + GfxPartition::internalFrontWindowPoolSize, address); gfxPartition.heapFree(heaps[i], address, sizeToAlloc); } -} \ No newline at end of file +} diff --git a/shared/source/memory_manager/gfx_partition.cpp b/shared/source/memory_manager/gfx_partition.cpp index 51feb6542f..cdea17ce67 100644 --- a/shared/source/memory_manager/gfx_partition.cpp +++ b/shared/source/memory_manager/gfx_partition.cpp @@ -10,6 +10,7 @@ #include "shared/source/helpers/aligned_memory.h" #include "shared/source/helpers/heap_assigner.h" #include "shared/source/memory_manager/memory_manager.h" +#include "shared/source/utilities/cpu_info.h" namespace NEO { @@ -138,7 +139,8 @@ bool GfxPartition::init(uint64_t gpuAddressSpace, size_t cpuAddressRangeSizeToRe gfxBase = maxNBitValue(32) + 1; heapInit(HeapIndex::HEAP_SVM, 0ull, gfxBase); } else { - if (gpuAddressSpace == maxNBitValue(48)) { + auto cpuVirtualAddressSize = CpuInfo::getInstance().getVirtualAddressSize(); + if (cpuVirtualAddressSize == 48 && gpuAddressSpace == maxNBitValue(48)) { gfxBase = maxNBitValue(48 - 1) + 1; heapInit(HeapIndex::HEAP_SVM, 0ull, gfxBase); } else if (gpuAddressSpace == maxNBitValue(47)) { @@ -161,7 +163,7 @@ bool GfxPartition::init(uint64_t gpuAddressSpace, size_t cpuAddressRangeSizeToRe gfxBase = 0ull; heapInit(HeapIndex::HEAP_SVM, 0ull, 0ull); } else { - if (!initAdditionalRange(gpuAddressSpace, gfxBase, gfxTop, rootDeviceIndex, numRootDevices)) { + if (!initAdditionalRange(cpuVirtualAddressSize, gpuAddressSpace, gfxBase, gfxTop, rootDeviceIndex, numRootDevices)) { return false; } } diff --git a/shared/source/memory_manager/gfx_partition.h b/shared/source/memory_manager/gfx_partition.h index a430dfc9b9..731ac55da2 100644 --- a/shared/source/memory_manager/gfx_partition.h +++ b/shared/source/memory_manager/gfx_partition.h @@ -107,7 +107,7 @@ class GfxPartition { static const std::array heapNonSvmNames; protected: - bool initAdditionalRange(uint64_t gpuAddressSpace, uint64_t &gfxBase, uint64_t &gfxTop, uint32_t rootDeviceIndex, size_t numRootDevices); + bool initAdditionalRange(uint32_t cpuAddressWidth, uint64_t gpuAddressSpace, uint64_t &gfxBase, uint64_t &gfxTop, uint32_t rootDeviceIndex, size_t numRootDevices); class Heap { public: diff --git a/shared/source/memory_manager/gfx_partition_init_additional_range.cpp b/shared/source/memory_manager/gfx_partition_init_additional_range.cpp index cfef320773..06c4618b82 100644 --- a/shared/source/memory_manager/gfx_partition_init_additional_range.cpp +++ b/shared/source/memory_manager/gfx_partition_init_additional_range.cpp @@ -9,7 +9,7 @@ namespace NEO { -bool GfxPartition::initAdditionalRange(uint64_t gpuAddressSpace, uint64_t &gfxBase, uint64_t &gfxTop, uint32_t rootDeviceIndex, size_t numRootDevices) { +bool GfxPartition::initAdditionalRange(uint32_t cpuVirtualAddressSize, uint64_t gpuAddressSpace, uint64_t &gfxBase, uint64_t &gfxTop, uint32_t rootDeviceIndex, size_t numRootDevices) { return false; }