From 86f8150dc70f4910d434f2856f24fd77f5235b81 Mon Sep 17 00:00:00 2001 From: Compute-Runtime-Validation Date: Fri, 3 Sep 2021 17:32:33 +0200 Subject: [PATCH] Revert "Stop using CONTEXT_SET_PARAM" This reverts commit e9f56e7d96ec044268043dc1fd483e1943f2a439. Signed-off-by: Compute-Runtime-Validation --- .../os_interface/linux/CMakeLists.txt | 1 - .../os_interface/linux/drm_context_tests.cpp | 129 ------------------ .../unit_test/os_interface/linux/drm_mock.cpp | 1 - .../unit_test/os_interface/linux/drm_mock.h | 1 - .../os_interface/linux/drm_tests.cpp | 121 ++++++++++++++++ shared/source/os_interface/linux/drm_neo.cpp | 20 +++ .../source/os_interface/linux/drm_query.cpp | 20 --- .../os_interface/linux/drm_query_dg1.cpp | 20 --- 8 files changed, 141 insertions(+), 172 deletions(-) delete mode 100644 opencl/test/unit_test/os_interface/linux/drm_context_tests.cpp diff --git a/opencl/test/unit_test/os_interface/linux/CMakeLists.txt b/opencl/test/unit_test/os_interface/linux/CMakeLists.txt index be7ec96546..1a7b70e474 100644 --- a/opencl/test/unit_test/os_interface/linux/CMakeLists.txt +++ b/opencl/test/unit_test/os_interface/linux/CMakeLists.txt @@ -31,7 +31,6 @@ set(IGDRCL_SRCS_tests_os_interface_linux ${CMAKE_CURRENT_SOURCE_DIR}/drm_residency_handler_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/drm_system_info_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/drm_tests.cpp - ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/drm_context_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/drm_uuid_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/file_logger_linux_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/hw_info_config_linux_tests.cpp diff --git a/opencl/test/unit_test/os_interface/linux/drm_context_tests.cpp b/opencl/test/unit_test/os_interface/linux/drm_context_tests.cpp deleted file mode 100644 index 8180a34933..0000000000 --- a/opencl/test/unit_test/os_interface/linux/drm_context_tests.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2018-2021 Intel Corporation - * - * SPDX-License-Identifier: MIT - * - */ - -#include "shared/source/os_interface/linux/os_context_linux.h" -#include "shared/test/common/helpers/default_hw_info.h" -#include "shared/test/common/helpers/engine_descriptor_helper.h" - -#include "opencl/test/unit_test/os_interface/linux/drm_mock.h" - -#include "gtest/gtest.h" - -using namespace NEO; - -TEST(DrmTest, givenDrmWhenOsContextIsCreatedThenCreateAndDestroyNewDrmOsContext) { - auto executionEnvironment = std::make_unique(); - executionEnvironment->prepareRootDeviceEnvironments(1); - DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]); - executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get()); - - { - OsContextLinux osContext1(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor()); - osContext1.ensureContextInitialized(); - - EXPECT_EQ(1u, osContext1.getDrmContextIds().size()); - EXPECT_EQ(drmMock.receivedCreateContextId, osContext1.getDrmContextIds()[0]); - EXPECT_EQ(0u, drmMock.receivedDestroyContextId); - - { - OsContextLinux osContext2(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor()); - osContext2.ensureContextInitialized(); - EXPECT_EQ(1u, osContext2.getDrmContextIds().size()); - EXPECT_EQ(drmMock.receivedCreateContextId, osContext2.getDrmContextIds()[0]); - EXPECT_EQ(0u, drmMock.receivedDestroyContextId); - } - } - - EXPECT_EQ(2u, drmMock.receivedContextParamRequestCount); -} - -TEST(DrmTest, whenCreatingDrmContextWithVirtualMemoryAddressSpaceThenProperVmIdIsSet) { - auto executionEnvironment = std::make_unique(); - executionEnvironment->prepareRootDeviceEnvironments(1); - executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get()); - DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]); - - ASSERT_EQ(1u, drmMock.virtualMemoryIds.size()); - - OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor()); - osContext.ensureContextInitialized(); - - EXPECT_EQ(drmMock.receivedContextParamRequest.value, drmMock.getVirtualMemoryAddressSpace(0u)); -} - -TEST(DrmTest, givenDrmAndNegativeCheckNonPersistentContextsSupportWhenOsContextIsCreatedThenReceivedContextParamRequestCountReturnsCorrectValue) { - auto executionEnvironment = std::make_unique(); - executionEnvironment->prepareRootDeviceEnvironments(1); - executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get()); - DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]); - auto expectedCount = 0u; - - { - drmMock.storedRetValForPersistant = -1; - drmMock.checkNonPersistentContextsSupport(); - expectedCount += 2; - OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor()); - osContext.ensureContextInitialized(); - EXPECT_EQ(expectedCount, drmMock.receivedContextParamRequestCount); - } - { - drmMock.storedRetValForPersistant = 0; - drmMock.checkNonPersistentContextsSupport(); - ++expectedCount; - OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor()); - osContext.ensureContextInitialized(); - expectedCount += 2; - EXPECT_EQ(expectedCount, drmMock.receivedContextParamRequestCount); - } -} - -TEST(DrmTest, givenDrmPreemptionEnabledAndLowPriorityEngineWhenCreatingOsContextThenCallSetContextPriorityIoctl) { - auto executionEnvironment = std::make_unique(); - executionEnvironment->prepareRootDeviceEnvironments(1); - executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get()); - DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]); - drmMock.preemptionSupported = false; - - OsContextLinux osContext1(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor()); - osContext1.ensureContextInitialized(); - OsContextLinux osContext2(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_RCS, EngineUsage::LowPriority})); - osContext2.ensureContextInitialized(); - - EXPECT_EQ(2u, drmMock.receivedContextParamRequestCount); - - drmMock.preemptionSupported = true; - - OsContextLinux osContext3(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor()); - osContext3.ensureContextInitialized(); - EXPECT_EQ(3u, drmMock.receivedContextParamRequestCount); - - OsContextLinux osContext4(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_RCS, EngineUsage::LowPriority})); - osContext4.ensureContextInitialized(); - EXPECT_EQ(5u, drmMock.receivedContextParamRequestCount); - EXPECT_EQ(drmMock.receivedCreateContextId, drmMock.receivedContextParamRequest.ctx_id); - EXPECT_EQ(static_cast(I915_CONTEXT_PARAM_PRIORITY), drmMock.receivedContextParamRequest.param); - EXPECT_EQ(static_cast(-1023), drmMock.receivedContextParamRequest.value); - EXPECT_EQ(0u, drmMock.receivedContextParamRequest.size); -} - -TEST(DrmTest, givenNoPerContextVmsDrmWhenCreatingOsContextsThenVmIdIsNotQueriedAndStored) { - auto executionEnvironment = std::make_unique(); - executionEnvironment->prepareRootDeviceEnvironments(1); - executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get()); - DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]); - EXPECT_FALSE(drmMock.requirePerContextVM); - - drmMock.storedRetValForVmId = 1; - - OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor()); - osContext.ensureContextInitialized(); - EXPECT_EQ(0u, drmMock.receivedCreateContextId); - EXPECT_EQ(1u, drmMock.receivedContextParamRequestCount); - - auto &drmVmIds = osContext.getDrmVmIds(); - EXPECT_EQ(0u, drmVmIds.size()); -} \ No newline at end of file diff --git a/opencl/test/unit_test/os_interface/linux/drm_mock.cpp b/opencl/test/unit_test/os_interface/linux/drm_mock.cpp index 4c8c04b187..74091aa954 100644 --- a/opencl/test/unit_test/os_interface/linux/drm_mock.cpp +++ b/opencl/test/unit_test/os_interface/linux/drm_mock.cpp @@ -74,7 +74,6 @@ int DrmMock::ioctl(unsigned long request, void *arg) { auto create = static_cast(arg); this->receivedCreateContextId = create->ctx_id; this->receivedContextCreateFlags = create->flags; - this->receivedContextCreateExtensions = create->extensions; return this->storedRetVal; } 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 84cf762b7b..0afed95a0d 100644 --- a/opencl/test/unit_test/os_interface/linux/drm_mock.h +++ b/opencl/test/unit_test/os_interface/linux/drm_mock.h @@ -150,7 +150,6 @@ class DrmMock : public Drm { bool allowDebugAttachCallBase = false; uint32_t passedContextDebugId = std::numeric_limits::max(); - uint64_t receivedContextCreateExtensions = 0; uint32_t receivedContextCreateFlags = 0; uint32_t receivedCreateContextId = 0; uint32_t receivedDestroyContextId = 0; 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 9d131833c9..402379768a 100644 --- a/opencl/test/unit_test/os_interface/linux/drm_tests.cpp +++ b/opencl/test/unit_test/os_interface/linux/drm_tests.cpp @@ -5,16 +5,24 @@ * */ +#include "shared/source/helpers/file_io.h" +#include "shared/source/helpers/hw_info.h" +#include "shared/source/os_interface/device_factory.h" #include "shared/source/os_interface/linux/os_context_linux.h" +#include "shared/source/os_interface/os_interface.h" #include "shared/test/common/helpers/debug_manager_state_restore.h" #include "shared/test/common/helpers/default_hw_info.h" #include "shared/test/common/helpers/engine_descriptor_helper.h" +#include "opencl/test/unit_test/fixtures/memory_management_fixture.h" #include "opencl/test/unit_test/mocks/mock_platform.h" #include "opencl/test/unit_test/os_interface/linux/drm_mock.h" #include "gtest/gtest.h" +#include +#include + using namespace NEO; TEST(DrmTest, WhenGettingDeviceIdThenCorrectIdReturned) { @@ -178,6 +186,46 @@ TEST(DrmTest, GivenDrmWhenAskedForContextThatFailsThenFalseIsReturned) { delete pDrm; } +TEST(DrmTest, givenDrmWhenOsContextIsCreatedThenCreateAndDestroyNewDrmOsContext) { + auto executionEnvironment = std::make_unique(); + executionEnvironment->prepareRootDeviceEnvironments(1); + DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]); + executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get()); + + { + OsContextLinux osContext1(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor()); + osContext1.ensureContextInitialized(); + + EXPECT_EQ(1u, osContext1.getDrmContextIds().size()); + EXPECT_EQ(drmMock.receivedCreateContextId, osContext1.getDrmContextIds()[0]); + EXPECT_EQ(0u, drmMock.receivedDestroyContextId); + + { + OsContextLinux osContext2(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor()); + osContext2.ensureContextInitialized(); + EXPECT_EQ(1u, osContext2.getDrmContextIds().size()); + EXPECT_EQ(drmMock.receivedCreateContextId, osContext2.getDrmContextIds()[0]); + EXPECT_EQ(0u, drmMock.receivedDestroyContextId); + } + } + + EXPECT_EQ(2u, drmMock.receivedContextParamRequestCount); +} + +TEST(DrmTest, whenCreatingDrmContextWithVirtualMemoryAddressSpaceThenProperVmIdIsSet) { + auto executionEnvironment = std::make_unique(); + executionEnvironment->prepareRootDeviceEnvironments(1); + executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get()); + DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]); + + ASSERT_EQ(1u, drmMock.virtualMemoryIds.size()); + + OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor()); + osContext.ensureContextInitialized(); + + EXPECT_EQ(drmMock.receivedContextParamRequest.value, drmMock.getVirtualMemoryAddressSpace(0u)); +} + TEST(DrmTest, whenCreatingDrmContextWithNoVirtualMemoryAddressSpaceThenProperContextIdIsSet) { auto executionEnvironment = std::make_unique(); executionEnvironment->prepareRootDeviceEnvironments(1); @@ -194,6 +242,61 @@ TEST(DrmTest, whenCreatingDrmContextWithNoVirtualMemoryAddressSpaceThenProperCon EXPECT_EQ(0u, drmMock.receivedContextParamRequestCount); } +TEST(DrmTest, givenDrmAndNegativeCheckNonPersistentContextsSupportWhenOsContextIsCreatedThenReceivedContextParamRequestCountReturnsCorrectValue) { + auto executionEnvironment = std::make_unique(); + executionEnvironment->prepareRootDeviceEnvironments(1); + executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get()); + DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]); + auto expectedCount = 0u; + + { + drmMock.storedRetValForPersistant = -1; + drmMock.checkNonPersistentContextsSupport(); + expectedCount += 2; + OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor()); + osContext.ensureContextInitialized(); + EXPECT_EQ(expectedCount, drmMock.receivedContextParamRequestCount); + } + { + drmMock.storedRetValForPersistant = 0; + drmMock.checkNonPersistentContextsSupport(); + ++expectedCount; + OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor()); + osContext.ensureContextInitialized(); + expectedCount += 2; + EXPECT_EQ(expectedCount, drmMock.receivedContextParamRequestCount); + } +} + +TEST(DrmTest, givenDrmPreemptionEnabledAndLowPriorityEngineWhenCreatingOsContextThenCallSetContextPriorityIoctl) { + auto executionEnvironment = std::make_unique(); + executionEnvironment->prepareRootDeviceEnvironments(1); + executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get()); + DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]); + drmMock.preemptionSupported = false; + + OsContextLinux osContext1(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor()); + osContext1.ensureContextInitialized(); + OsContextLinux osContext2(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_RCS, EngineUsage::LowPriority})); + osContext2.ensureContextInitialized(); + + EXPECT_EQ(2u, drmMock.receivedContextParamRequestCount); + + drmMock.preemptionSupported = true; + + OsContextLinux osContext3(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor()); + osContext3.ensureContextInitialized(); + EXPECT_EQ(3u, drmMock.receivedContextParamRequestCount); + + OsContextLinux osContext4(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_RCS, EngineUsage::LowPriority})); + osContext4.ensureContextInitialized(); + EXPECT_EQ(5u, drmMock.receivedContextParamRequestCount); + EXPECT_EQ(drmMock.receivedCreateContextId, drmMock.receivedContextParamRequest.ctx_id); + EXPECT_EQ(static_cast(I915_CONTEXT_PARAM_PRIORITY), drmMock.receivedContextParamRequest.param); + EXPECT_EQ(static_cast(-1023), drmMock.receivedContextParamRequest.value); + EXPECT_EQ(0u, drmMock.receivedContextParamRequest.size); +} + TEST(DrmTest, WhenGettingExecSoftPinThenCorrectValueIsReturned) { auto executionEnvironment = std::make_unique(); executionEnvironment->prepareRootDeviceEnvironments(1); @@ -474,6 +577,24 @@ TEST(DrmTest, givenPerContextVMRequiredWhenCreatingOsContextsForRootDeviceThenIm EXPECT_EQ(0u, drmVmIds[31]); } +TEST(DrmTest, givenNoPerContextVmsDrmWhenCreatingOsContextsThenVmIdIsNotQueriedAndStored) { + auto executionEnvironment = std::make_unique(); + executionEnvironment->prepareRootDeviceEnvironments(1); + executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get()); + DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]); + EXPECT_FALSE(drmMock.requirePerContextVM); + + drmMock.storedRetValForVmId = 1; + + OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor()); + osContext.ensureContextInitialized(); + EXPECT_EQ(0u, drmMock.receivedCreateContextId); + EXPECT_EQ(1u, drmMock.receivedContextParamRequestCount); + + auto &drmVmIds = osContext.getDrmVmIds(); + EXPECT_EQ(0u, drmVmIds.size()); +} + TEST(DrmTest, givenProgramDebuggingAndContextDebugAvailableWhenCreatingContextThenSetContextDebugFlagIsCalled) { auto executionEnvironment = std::make_unique(); executionEnvironment->setDebuggingEnabled(); diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index 1d833b36df..146c3c5b9e 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -377,6 +377,26 @@ void Drm::setNonPersistentContext(uint32_t drmContextId) { ioctl(DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM, &contextParam); } +uint32_t Drm::createDrmContext(uint32_t drmVmId, bool isSpecialContextRequested) { + drm_i915_gem_context_create_ext gcc = {}; + + this->appendDrmContextFlags(gcc, isSpecialContextRequested); + + auto retVal = ioctl(DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &gcc); + UNRECOVERABLE_IF(retVal != 0); + + if (drmVmId > 0) { + drm_i915_gem_context_param param{}; + param.ctx_id = gcc.ctx_id; + param.value = drmVmId; + param.param = I915_CONTEXT_PARAM_VM; + retVal = ioctl(DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM, ¶m); + UNRECOVERABLE_IF(retVal != 0); + } + + return gcc.ctx_id; +} + void Drm::destroyDrmContext(uint32_t drmContextId) { drm_i915_gem_context_destroy destroy = {}; destroy.ctx_id = drmContextId; diff --git a/shared/source/os_interface/linux/drm_query.cpp b/shared/source/os_interface/linux/drm_query.cpp index 16190caf74..0389892c90 100644 --- a/shared/source/os_interface/linux/drm_query.cpp +++ b/shared/source/os_interface/linux/drm_query.cpp @@ -117,24 +117,4 @@ int Drm::createDrmVirtualMemory(uint32_t &drmVmId) { return ret; } -uint32_t Drm::createDrmContext(uint32_t drmVmId, bool isSpecialContextRequested) { - drm_i915_gem_context_create_ext gcc = {}; - - this->appendDrmContextFlags(gcc, isSpecialContextRequested); - - auto retVal = ioctl(DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &gcc); - UNRECOVERABLE_IF(retVal != 0); - - if (drmVmId > 0) { - drm_i915_gem_context_param param{}; - param.ctx_id = gcc.ctx_id; - param.value = drmVmId; - param.param = I915_CONTEXT_PARAM_VM; - retVal = ioctl(DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM, ¶m); - UNRECOVERABLE_IF(retVal != 0); - } - - return gcc.ctx_id; -} - } // namespace NEO diff --git a/shared/source/os_interface/linux/drm_query_dg1.cpp b/shared/source/os_interface/linux/drm_query_dg1.cpp index fcc1ed0498..df281fb5ea 100644 --- a/shared/source/os_interface/linux/drm_query_dg1.cpp +++ b/shared/source/os_interface/linux/drm_query_dg1.cpp @@ -126,24 +126,4 @@ int Drm::createDrmVirtualMemory(uint32_t &drmVmId) { return ret; } -uint32_t Drm::createDrmContext(uint32_t drmVmId, bool isSpecialContextRequested) { - drm_i915_gem_context_create_ext gcc = {}; - - this->appendDrmContextFlags(gcc, isSpecialContextRequested); - - auto retVal = ioctl(DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &gcc); - UNRECOVERABLE_IF(retVal != 0); - - if (drmVmId > 0) { - drm_i915_gem_context_param param{}; - param.ctx_id = gcc.ctx_id; - param.value = drmVmId; - param.param = I915_CONTEXT_PARAM_VM; - retVal = ioctl(DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM, ¶m); - UNRECOVERABLE_IF(retVal != 0); - } - - return gcc.ctx_id; -} - } // namespace NEO