From 7aea294c85a267b920a832168cfe7df71f080618 Mon Sep 17 00:00:00 2001 From: Mateusz Hoppe Date: Wed, 15 Jul 2020 08:07:53 +0200 Subject: [PATCH] Allow perContext VMs Related-To: NEO-4637 Change-Id: I599aba9c1c06fd9414cfa14ebb2de3fc504d1cad Signed-off-by: Mateusz Hoppe --- opencl/source/dll/linux/drm_neo_create.cpp | 7 ++++--- opencl/test/unit_test/linux/main_linux_dll.cpp | 17 +++++++++++++++++ .../unit_test/os_interface/linux/drm_mock.h | 5 ++++- .../os_interface/linux/drm_neo_create.cpp | 4 +++- .../unit_test/os_interface/linux/drm_tests.cpp | 14 ++++++++++++++ shared/source/os_interface/linux/drm_neo.cpp | 4 ++++ shared/source/os_interface/linux/drm_neo.h | 7 ++++++- 7 files changed, 52 insertions(+), 6 deletions(-) diff --git a/opencl/source/dll/linux/drm_neo_create.cpp b/opencl/source/dll/linux/drm_neo_create.cpp index 9d85ede2ce..c03222a630 100644 --- a/opencl/source/dll/linux/drm_neo_create.cpp +++ b/opencl/source/dll/linux/drm_neo_create.cpp @@ -103,10 +103,11 @@ Drm *Drm::create(std::unique_ptr hwDeviceId, RootDeviceEnvironment & } } - if (!drmObject->createVirtualMemoryAddressSpace(HwHelper::getSubDevicesCount(rootDeviceEnvironment.getHardwareInfo()))) { - printDebugString(DebugManager.flags.PrintDebugMessages.get(), stderr, "%s", "INFO: Device doesn't support GEM Virtual Memory\n"); + if (!rootDeviceEnvironment.executionEnvironment.isPerContextMemorySpaceRequired()) { + if (!drmObject->createVirtualMemoryAddressSpace(HwHelper::getSubDevicesCount(rootDeviceEnvironment.getHardwareInfo()))) { + printDebugString(DebugManager.flags.PrintDebugMessages.get(), stderr, "%s", "INFO: Device doesn't support GEM Virtual Memory\n"); + } } - return drmObject.release(); } } // namespace NEO diff --git a/opencl/test/unit_test/linux/main_linux_dll.cpp b/opencl/test/unit_test/linux/main_linux_dll.cpp index 8424c9ac13..45e39ec5c7 100644 --- a/opencl/test/unit_test/linux/main_linux_dll.cpp +++ b/opencl/test/unit_test/linux/main_linux_dll.cpp @@ -430,6 +430,23 @@ TEST_F(DrmTests, whenDrmIsCreatedWithMultipleSubDevicesThenCreateMultipleVirtual } } +TEST_F(DrmTests, givenRequiredPerContextMemorySpaceWhenDrmIsCreatedThenGetVirtualMemoryAddressSpaceReturnsZeroAndVMsAreNotCreated) { + DebugManagerStateRestore restore; + DebugManager.flags.CreateMultipleSubDevices.set(2); + + rootDeviceEnvironment->executionEnvironment.setPerContextMemorySpace(); + + auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + EXPECT_NE(drm, nullptr); + EXPECT_TRUE(drm->isPerContextVMRequired()); + + auto numSubDevices = HwHelper::getSubDevicesCount(rootDeviceEnvironment->getHardwareInfo()); + for (auto id = 0u; id < numSubDevices; id++) { + EXPECT_EQ(0u, drm->getVirtualMemoryAddressSpace(id)); + } + EXPECT_EQ(0u, static_cast(drm.get())->virtualMemoryIds.size()); +} + TEST_F(DrmTests, givenDrmIsCreatedWhenCreateVirtualMemoryFailsThenReturnVirtualMemoryIdZeroAndPrintDebugMessage) { DebugManagerStateRestore dbgRestorer; DebugManager.flags.PrintDebugMessages.set(true); diff --git a/opencl/test/unit_test/os_interface/linux/drm_mock.h b/opencl/test/unit_test/os_interface/linux/drm_mock.h index 5c9c355e3c..ddc05dbe13 100644 --- a/opencl/test/unit_test/os_interface/linux/drm_mock.h +++ b/opencl/test/unit_test/os_interface/linux/drm_mock.h @@ -35,12 +35,15 @@ class DrmMock : public Drm { using Drm::nonPersistentContextsSupported; using Drm::preemptionSupported; using Drm::query; + using Drm::requirePerContextVM; using Drm::sliceCountChangeSupported; using Drm::virtualMemoryIds; DrmMock(int fd, RootDeviceEnvironment &rootDeviceEnvironment) : Drm(std::make_unique(fd, ""), rootDeviceEnvironment) { sliceCountChangeSupported = true; - createVirtualMemoryAddressSpace(HwHelper::getSubDevicesCount(rootDeviceEnvironment.getHardwareInfo())); + if (!rootDeviceEnvironment.executionEnvironment.isPerContextMemorySpaceRequired()) { + createVirtualMemoryAddressSpace(HwHelper::getSubDevicesCount(rootDeviceEnvironment.getHardwareInfo())); + } } DrmMock(RootDeviceEnvironment &rootDeviceEnvironment) : DrmMock(mockFd, rootDeviceEnvironment) {} DrmMock() : DrmMock(*platform()->peekExecutionEnvironment()->rootDeviceEnvironments[0]) {} diff --git a/opencl/test/unit_test/os_interface/linux/drm_neo_create.cpp b/opencl/test/unit_test/os_interface/linux/drm_neo_create.cpp index 2bf27046ee..3f96af658b 100644 --- a/opencl/test/unit_test/os_interface/linux/drm_neo_create.cpp +++ b/opencl/test/unit_test/os_interface/linux/drm_neo_create.cpp @@ -35,7 +35,9 @@ Drm *Drm::create(std::unique_ptr hwDeviceId, RootDeviceEnvironment & return *pDrmToReturnFromCreateFunc; } auto drm = new DrmMockDefault(rootDeviceEnvironment); - drm->createVirtualMemoryAddressSpace(HwHelper::getSubDevicesCount(rootDeviceEnvironment.getHardwareInfo())); + if (!rootDeviceEnvironment.executionEnvironment.isPerContextMemorySpaceRequired()) { + drm->createVirtualMemoryAddressSpace(HwHelper::getSubDevicesCount(rootDeviceEnvironment.getHardwareInfo())); + } return drm; } } // namespace NEO diff --git a/opencl/test/unit_test/os_interface/linux/drm_tests.cpp b/opencl/test/unit_test/os_interface/linux/drm_tests.cpp index 4db4ac0b09..5198e74de1 100644 --- a/opencl/test/unit_test/os_interface/linux/drm_tests.cpp +++ b/opencl/test/unit_test/os_interface/linux/drm_tests.cpp @@ -359,3 +359,17 @@ TEST(DrmTest, givenDrmWhenCreatingOsContextThenCreateDrmContextWithVmId) { EXPECT_EQ(1u, contextIds.size()); EXPECT_EQ(SysCalls::vmId, contextIds[0]); } + +TEST(DrmTest, givenDrmWithPerContextVMRequiredWhenCreatingOsContextsThenImplicitVmIdPerContextIsUsed) { + auto &rootEnv = *platform()->peekExecutionEnvironment()->rootDeviceEnvironments[0]; + rootEnv.executionEnvironment.setPerContextMemorySpace(); + + DrmMock drmMock; + EXPECT_TRUE(drmMock.requirePerContextVM); + + OsContextLinux osContext1(drmMock, 0u, 1, aub_stream::ENGINE_RCS, PreemptionMode::Disabled, false, false, false); + EXPECT_EQ(0u, drmMock.receivedCreateContextId); + + OsContextLinux osContext2(drmMock, 5u, 1, aub_stream::ENGINE_RCS, PreemptionMode::Disabled, false, false, false); + EXPECT_EQ(0u, drmMock.receivedCreateContextId); +} diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index 764bb44350..809564dd2c 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -56,6 +56,10 @@ constexpr const char *getIoctlParamString(int param) { } // namespace IoctlHelper +Drm::Drm(std::unique_ptr hwDeviceIdIn, RootDeviceEnvironment &rootDeviceEnvironment) : hwDeviceId(std::move(hwDeviceIdIn)), rootDeviceEnvironment(rootDeviceEnvironment) { + requirePerContextVM = rootDeviceEnvironment.executionEnvironment.isPerContextMemorySpaceRequired(); +} + int Drm::ioctl(unsigned long request, void *arg) { int ret; SYSTEM_ENTER(); diff --git a/shared/source/os_interface/linux/drm_neo.h b/shared/source/os_interface/linux/drm_neo.h index f69b303d42..553fa9f96b 100644 --- a/shared/source/os_interface/linux/drm_neo.h +++ b/shared/source/os_interface/linux/drm_neo.h @@ -94,6 +94,9 @@ class Drm { bool areNonPersistentContextsSupported() const { return nonPersistentContextsSupported; } void checkNonPersistentContextsSupport(); void setNonPersistentContext(uint32_t drmContextId); + bool isPerContextVMRequired() { + return requirePerContextVM; + } MemoryInfo *getMemoryInfo() const { return memoryInfo.get(); @@ -115,12 +118,14 @@ class Drm { drm_i915_gem_context_param_sseu sseu{}; bool preemptionSupported = false; bool nonPersistentContextsSupported = false; + bool requirePerContextVM = false; std::unique_ptr hwDeviceId; int deviceId = 0; int revisionId = 0; GTTYPE eGtType = GTTYPE_UNDEFINED; RootDeviceEnvironment &rootDeviceEnvironment; - Drm(std::unique_ptr hwDeviceIdIn, RootDeviceEnvironment &rootDeviceEnvironment) : hwDeviceId(std::move(hwDeviceIdIn)), rootDeviceEnvironment(rootDeviceEnvironment) {} + + Drm(std::unique_ptr hwDeviceIdIn, RootDeviceEnvironment &rootDeviceEnvironment); std::unique_ptr engineInfo; std::unique_ptr memoryInfo; std::vector virtualMemoryIds;