From 4a0064033acb5d8c68ad253236362ff54abc8ead Mon Sep 17 00:00:00 2001 From: Kacper Nowak Date: Tue, 28 Nov 2023 15:15:25 +0000 Subject: [PATCH] fix: Correct AIL initialization in runtime - Initialize AIL helper in runtime (linux/windows/AUB path). - Return false if AIL configuration initialization is called with empty AIL helper (is nullptr). - Skip mentioned condition if AIL is disabled via EnableAIL debug key. Related-To: NEO-9240 Signed-off-by: Kacper Nowak --- .../test/unit_test/linux/main_linux_dll.cpp | 158 ++++++++---------- .../root_device_environment.cpp | 2 +- shared/source/os_interface/device_factory.cpp | 4 + shared/source/os_interface/linux/drm_neo.cpp | 6 + .../os_interface/linux/os_interface_linux.cpp | 3 - .../source/os_interface/windows/wddm/wddm.cpp | 7 +- .../common/mocks/mock_ail_configuration.h | 3 +- .../mocks/mock_execution_environment.cpp | 6 + .../common/mocks/mock_execution_environment.h | 2 + shared/test/unit_test/ail/ail_tests.cpp | 15 -- .../execution_environment_tests.cpp | 38 +++++ .../dg1/execution_environment_tests_dg1.cpp | 8 +- .../os_interface/device_factory_tests.cpp | 9 + .../os_interface/windows/wddm_tests.cpp | 10 ++ 14 files changed, 154 insertions(+), 117 deletions(-) diff --git a/opencl/test/unit_test/linux/main_linux_dll.cpp b/opencl/test/unit_test/linux/main_linux_dll.cpp index e60fba8f2b..9585010ea5 100644 --- a/opencl/test/unit_test/linux/main_linux_dll.cpp +++ b/opencl/test/unit_test/linux/main_linux_dll.cpp @@ -7,7 +7,6 @@ #include "shared/source/device/device.h" #include "shared/source/direct_submission/direct_submission_controller.h" -#include "shared/source/execution_environment/execution_environment.h" #include "shared/source/helpers/aligned_memory.h" #include "shared/source/helpers/basic_math.h" #include "shared/source/helpers/gfx_core_helper.h" @@ -62,15 +61,13 @@ class DrmTestsFixture { if (deviceDescriptorTable[0].deviceId == 0) { GTEST_SKIP(); } - - executionEnvironment.prepareRootDeviceEnvironments(1); - rootDeviceEnvironment = executionEnvironment.rootDeviceEnvironments[0].get(); + mockRootDeviceEnvironment = static_cast(mockExecutionEnvironment.rootDeviceEnvironments[0].get()); } void tearDown() { } - ExecutionEnvironment executionEnvironment; - RootDeviceEnvironment *rootDeviceEnvironment = nullptr; + MockExecutionEnvironment mockExecutionEnvironment; + MockRootDeviceEnvironment *mockRootDeviceEnvironment = nullptr; }; typedef Test DrmTests; @@ -108,14 +105,14 @@ struct DrmSimpleTests : public ::testing::Test { GTEST_SKIP(); } } + MockExecutionEnvironment mockExecutionEnvironment; }; TEST_F(DrmSimpleTests, GivenTwoOpenableDevicesWhenDiscoverDevicesThenCreateTwoHwDeviceIds) { VariableBackup backupOpenFull(&openFull); openFull = openWithCounter; openCounter = 2; - ExecutionEnvironment executionEnvironment; - auto hwDeviceIds = OSInterface::discoverDevices(executionEnvironment); + auto hwDeviceIds = OSInterface::discoverDevices(mockExecutionEnvironment); EXPECT_EQ(2u, hwDeviceIds.size()); } @@ -124,8 +121,7 @@ TEST_F(DrmSimpleTests, GivenSelectedNotExistingDeviceUsingFilterBdfWhenGetDevice debugManager.flags.FilterBdfPath.set("invalid"); VariableBackup backupOpenFull(&openFull); openFull = nullptr; // open shouldn't be called - ExecutionEnvironment executionEnvironment; - auto hwDeviceIds = OSInterface::discoverDevices(executionEnvironment); + auto hwDeviceIds = OSInterface::discoverDevices(mockExecutionEnvironment); EXPECT_TRUE(hwDeviceIds.empty()); } @@ -135,8 +131,7 @@ TEST_F(DrmSimpleTests, GivenSelectedExistingDeviceUsingFilterBdfWhenGetDeviceFdT VariableBackup backupOpenFull(&openFull); openFull = openWithCounter; openCounter = 10; - ExecutionEnvironment executionEnvironment; - auto hwDeviceIds = OSInterface::discoverDevices(executionEnvironment); + auto hwDeviceIds = OSInterface::discoverDevices(mockExecutionEnvironment); EXPECT_EQ(1u, hwDeviceIds.size()); EXPECT_NE(nullptr, hwDeviceIds[0].get()); EXPECT_STREQ("/dev/dri/by-path/platform-4010000000.pcie-pci-0000:00:02.0-render", lastOpenedPath.c_str()); @@ -149,18 +144,16 @@ TEST_F(DrmSimpleTests, GivenSelectedExistingDeviceWhenOpenDirSuccedsThenHwDevice VariableBackup backupEntryIndex(&entryIndex, 0u); openFull = openWithCounter; - ExecutionEnvironment executionEnvironment; - entryIndex = 0; openCounter = 1; - auto hwDeviceIds = OSInterface::discoverDevices(executionEnvironment); + auto hwDeviceIds = OSInterface::discoverDevices(mockExecutionEnvironment); EXPECT_EQ(1u, hwDeviceIds.size()); EXPECT_NE(nullptr, hwDeviceIds[0].get()); EXPECT_STREQ("0000:00:03.1", hwDeviceIds[0]->as()->getPciPath()); entryIndex = 0; openCounter = 2; - hwDeviceIds = OSInterface::discoverDevices(executionEnvironment); + hwDeviceIds = OSInterface::discoverDevices(mockExecutionEnvironment); EXPECT_EQ(2u, hwDeviceIds.size()); EXPECT_NE(nullptr, hwDeviceIds[0].get()); EXPECT_STREQ("0000:00:03.1", hwDeviceIds[0]->as()->getPciPath()); @@ -175,8 +168,7 @@ TEST_F(DrmSimpleTests, GivenSelectedExistingDeviceWhenOpenDirFailsThenRetryOpeni openFull = openWithCounter; openCounter = 1; - ExecutionEnvironment executionEnvironment; - auto hwDeviceIds = OSInterface::discoverDevices(executionEnvironment); + auto hwDeviceIds = OSInterface::discoverDevices(mockExecutionEnvironment); EXPECT_STREQ("/dev/dri/renderD128", lastOpenedPath.c_str()); EXPECT_EQ(1u, hwDeviceIds.size()); EXPECT_NE(nullptr, hwDeviceIds[0].get()); @@ -185,7 +177,7 @@ TEST_F(DrmSimpleTests, GivenSelectedExistingDeviceWhenOpenDirFailsThenRetryOpeni readLinkCalledTimes = 0; openCounter = 2; - hwDeviceIds = OSInterface::discoverDevices(executionEnvironment); + hwDeviceIds = OSInterface::discoverDevices(mockExecutionEnvironment); EXPECT_STREQ("/dev/dri/renderD129", lastOpenedPath.c_str()); EXPECT_EQ(2u, hwDeviceIds.size()); EXPECT_NE(nullptr, hwDeviceIds[0].get()); @@ -198,9 +190,7 @@ TEST_F(DrmSimpleTests, GivenSelectedExistingDeviceWhenOpenDirFailsThenRetryOpeni TEST_F(DrmSimpleTests, givenPrintIoctlEntriesWhenCallIoctlThenIoctlIsPrinted) { ::testing::internal::CaptureStdout(); - auto executionEnvironment = std::make_unique(); - executionEnvironment->prepareRootDeviceEnvironments(1); - auto drm = DrmWrap::createDrm(*executionEnvironment->rootDeviceEnvironments[0]); + auto drm = DrmWrap::createDrm(*(mockExecutionEnvironment.rootDeviceEnvironments[0].get())); DebugManagerStateRestore restorer; debugManager.flags.PrintIoctlEntries.set(true); @@ -218,14 +208,13 @@ struct DrmFailedIoctlTests : public ::testing::Test { GTEST_SKIP(); } } + MockExecutionEnvironment mockExecutionEnvironment; }; TEST_F(DrmFailedIoctlTests, givenPrintIoctlEntriesWhenCallFailedIoctlThenExpectedIoctlIsPrinted) { ::testing::internal::CaptureStdout(); - auto executionEnvironment = std::make_unique(); - executionEnvironment->prepareRootDeviceEnvironments(1); - auto drm = DrmWrap::createDrm(*executionEnvironment->rootDeviceEnvironments[0]); + auto drm = DrmWrap::createDrm(*(mockExecutionEnvironment.rootDeviceEnvironments[0].get())); DebugManagerStateRestore restorer; debugManager.flags.PrintIoctlEntries.set(true); @@ -242,9 +231,7 @@ TEST_F(DrmSimpleTests, givenPrintIoctlTimesWhenCallIoctlThenStatisticsAreGathere constexpr long long initialMin = std::numeric_limits::max(); constexpr long long initialMax = std::numeric_limits::min(); - auto executionEnvironment = std::make_unique(); - executionEnvironment->prepareRootDeviceEnvironments(1); - auto drm = DrmWrap::createDrm(*executionEnvironment->rootDeviceEnvironments[0]); + auto drm = DrmWrap::createDrm(*(mockExecutionEnvironment.rootDeviceEnvironments[0].get())); DebugManagerStateRestore restorer; debugManager.flags.PrintIoctlTimes.set(true); @@ -369,8 +356,7 @@ TEST_F(DrmSimpleTests, GivenSelectedNonExistingDeviceWhenOpenDirFailsThenRetryOp openFull = openWithCounter; openCounter = 0; - ExecutionEnvironment executionEnvironment; - auto hwDeviceIds = OSInterface::discoverDevices(executionEnvironment); + auto hwDeviceIds = OSInterface::discoverDevices(mockExecutionEnvironment); EXPECT_EQ(0u, hwDeviceIds.size()); } @@ -380,12 +366,11 @@ TEST_F(DrmSimpleTests, GivenFailingOpenDirAndMultipleAvailableDevicesWhenCreateM VariableBackup backupOpenDir(&failOnOpenDir, true); VariableBackup backupReadlink(&readLinkCalledTimes, 0); openFull = openWithCounter; - ExecutionEnvironment executionEnvironment; const uint32_t requestedNumRootDevices = 2u; debugManager.flags.CreateMultipleRootDevices.set(requestedNumRootDevices); openCounter = 4; - auto hwDeviceIds = OSInterface::discoverDevices(executionEnvironment); + auto hwDeviceIds = OSInterface::discoverDevices(mockExecutionEnvironment); EXPECT_STREQ("/dev/dri/renderD129", lastOpenedPath.c_str()); EXPECT_EQ(requestedNumRootDevices, hwDeviceIds.size()); EXPECT_NE(nullptr, hwDeviceIds[0].get()); @@ -398,12 +383,11 @@ TEST_F(DrmSimpleTests, GivenMultipleAvailableDevicesWhenCreateMultipleRootDevice DebugManagerStateRestore stateRestore; VariableBackup backupOpenFull(&openFull); openFull = openWithCounter; - ExecutionEnvironment executionEnvironment; const uint32_t requestedNumRootDevices = 2u; debugManager.flags.CreateMultipleRootDevices.set(requestedNumRootDevices); openCounter = 4; - auto hwDeviceIds = OSInterface::discoverDevices(executionEnvironment); + auto hwDeviceIds = OSInterface::discoverDevices(mockExecutionEnvironment); EXPECT_STREQ("/dev/dri/by-path/platform-4010000000.pcie-pci-0000:00:02.0-render", lastOpenedPath.c_str()); EXPECT_EQ(requestedNumRootDevices, hwDeviceIds.size()); EXPECT_NE(nullptr, hwDeviceIds[0].get()); @@ -415,7 +399,7 @@ TEST_F(DrmSimpleTests, GivenMultipleAvailableDevicesWhenCreateMultipleRootDevice TEST_F(DrmTests, GivenSelectedIncorectDeviceByDeviceIdWhenGetDeviceFdThenFail) { DebugManagerStateRestore stateRestore; debugManager.flags.FilterDeviceId.set("invalid"); - auto drm1 = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm1 = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_EQ(drm1, nullptr); } @@ -425,7 +409,7 @@ TEST_F(DrmTests, GivenSelectedCorrectDeviceByDeviceIdWhenGetDeviceFdThenSucceed) deviceIdStr << std::hex << deviceId; debugManager.flags.FilterDeviceId.set(deviceIdStr.str()); - auto drm1 = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm1 = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_NE(drm1, nullptr); } @@ -447,7 +431,7 @@ TEST_F(DrmSimpleTests, givenUseVmBindFlagWhenOverrideBindSupportThenReturnProper } TEST_F(DrmTests, GivenErrorCodeWhenCreatingDrmThenDrmCreatedOnlyWithSpecificErrors) { - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_NE(drm, nullptr); GetParam getParam{}; @@ -498,9 +482,9 @@ TEST_F(DrmTests, GivenErrorCodeWhenCreatingDrmThenDrmCreatedOnlyWithSpecificErro } TEST_F(DrmTests, WhenCreatingTwiceThenDifferentDrmReturned) { - auto drm1 = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm1 = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_NE(drm1, nullptr); - auto drm2 = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm2 = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_NE(drm2, nullptr); EXPECT_NE(drm1, drm2); } @@ -509,14 +493,14 @@ TEST_F(DrmTests, WhenDriDeviceFoundThenDrmCreatedOnFallback) { VariableBackup backupHaveDri(&haveDri); haveDri = 1; - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_NE(drm, nullptr); } TEST_F(DrmTests, GivenNoDeviceWhenCreatingDrmThenNullIsReturned) { VariableBackup backupHaveDri(&haveDri); haveDri = -1; - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_EQ(drm, nullptr); } @@ -532,7 +516,7 @@ TEST_F(DrmTests, GivenUnknownDeviceWhenCreatingDrmThenNullIsReturned) { ::testing::internal::CaptureStderr(); ::testing::internal::CaptureStdout(); - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_EQ(drm, nullptr); std::string errStr = ::testing::internal::GetCapturedStderr(); EXPECT_TRUE(hasSubstr(errStr, std::string("FATAL: Unknown device: deviceId: ffff, revisionId: ffff"))); @@ -544,18 +528,18 @@ TEST_F(DrmTests, GivenKnownDeviceWhenCreatingDrmThenHwInfoIsProperlySet) { revisionId = 123; - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_NE(drm, nullptr); - EXPECT_EQ(revisionId, rootDeviceEnvironment->getHardwareInfo()->platform.usRevId); - EXPECT_EQ(deviceId, rootDeviceEnvironment->getHardwareInfo()->platform.usDeviceID); + EXPECT_EQ(revisionId, mockRootDeviceEnvironment->getHardwareInfo()->platform.usRevId); + EXPECT_EQ(deviceId, mockRootDeviceEnvironment->getHardwareInfo()->platform.usDeviceID); } TEST_F(DrmTests, GivenNoSoftPinWhenCreatingDrmThenNullIsReturned) { VariableBackup backupHaveSoftPin(&haveSoftPin); haveSoftPin = 0; - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_EQ(drm, nullptr); } @@ -563,7 +547,7 @@ TEST_F(DrmTests, WhenCantFindDeviceIdThenDrmIsNotCreated) { VariableBackup backupFailOnDeviceId(&failOnDeviceId); failOnDeviceId = -1; - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_EQ(drm, nullptr); } @@ -571,7 +555,7 @@ TEST_F(DrmTests, WhenCantQueryEuCountThenDrmIsNotCreated) { VariableBackup backupfailOnEuTotal(&failOnEuTotal); failOnEuTotal = -1; - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_EQ(drm, nullptr); } @@ -579,7 +563,7 @@ TEST_F(DrmTests, WhenCantQuerySubsliceCountThenDrmIsNotCreated) { VariableBackup backupfailOnSubsliceTotal(&failOnSubsliceTotal); failOnSubsliceTotal = -1; - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_EQ(drm, nullptr); } @@ -587,7 +571,7 @@ TEST_F(DrmTests, WhenCantQueryRevisionIdThenDrmIsNotCreated) { VariableBackup backupFailOnRevisionId(&failOnRevisionId); failOnRevisionId = -1; - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_EQ(drm, nullptr); } @@ -595,7 +579,7 @@ TEST_F(DrmTests, WhenCantQuerySoftPinSupportThenDrmIsNotCreated) { VariableBackup backupFailOnSoftPin(&failOnSoftPin); failOnSoftPin = -1; - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_EQ(drm, nullptr); } @@ -603,7 +587,7 @@ TEST_F(DrmTests, GivenFailOnParamBoostWhenCreatingDrmThenDrmIsCreated) { VariableBackup backupFailOnParamBoost(&failOnParamBoost); failOnParamBoost = -1; - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); // non-fatal error - issue warning only EXPECT_NE(drm, nullptr); } @@ -611,7 +595,7 @@ TEST_F(DrmTests, GivenFailOnParamBoostWhenCreatingDrmThenDrmIsCreated) { TEST_F(DrmTests, GivenFailOnContextCreateWhenCreatingDrmThenDrmIsCreated) { VariableBackup backupFailOnContextCreate(&failOnContextCreate); - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_NE(drm, nullptr); failOnContextCreate = -1; EXPECT_EQ(-1, drm->createDrmContext(1, false, false)); @@ -622,7 +606,7 @@ TEST_F(DrmTests, GivenFailOnContextCreateWhenCreatingDrmThenDrmIsCreated) { TEST_F(DrmTests, GivenFailOnSetPriorityWhenCreatingDrmThenDrmIsCreated) { VariableBackup backupFailOnSetPriority(&failOnSetPriority); - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_NE(drm, nullptr); failOnSetPriority = -1; auto drmContext = drm->createDrmContext(1, false, false); @@ -635,7 +619,7 @@ TEST_F(DrmTests, WhenCantQueryDrmVersionThenDrmIsNotCreated) { VariableBackup backupFailOnDrmVersion(&failOnDrmVersion); failOnDrmVersion = -1; - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_EQ(drm, nullptr); failOnDrmVersion = 0; } @@ -644,7 +628,7 @@ TEST_F(DrmTests, GivenInvalidDrmVersionNameWhenCreatingDrmThenNullIsReturned) { VariableBackup backupFailOnDrmVersion(&failOnDrmVersion); strcpy(providedDrmVersion, "NA"); - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_EQ(drm, nullptr); failOnDrmVersion = 0; strcpy(providedDrmVersion, "i915"); @@ -654,7 +638,7 @@ TEST_F(DrmTests, whenDrmIsCreatedThenSetMemoryRegionsDoesntFailAndDrmObjectIsRet DebugManagerStateRestore restore; debugManager.flags.EnableLocalMemory.set(1); - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_NE(drm, nullptr); } @@ -666,16 +650,16 @@ TEST(DrmMemoryManagerCreate, whenCallCreateMemoryManagerThenDrmMemoryManagerIsCr DebugManagerStateRestore restorer; debugManager.flags.OverridePatIndex.set(0); - MockExecutionEnvironment executionEnvironment(defaultHwInfo.get()); - auto drm = new DrmMockSuccess(fakeFd, *executionEnvironment.rootDeviceEnvironments[0]); + MockExecutionEnvironment mockExecutionEnvironment; + auto drm = new DrmMockSuccess(fakeFd, *mockExecutionEnvironment.rootDeviceEnvironments[0]); drm->setupIoctlHelper(defaultHwInfo->platform.eProductFamily); - executionEnvironment.rootDeviceEnvironments[0]->osInterface = std::make_unique(); - executionEnvironment.rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr(drm)); + mockExecutionEnvironment.rootDeviceEnvironments[0]->osInterface = std::make_unique(); + mockExecutionEnvironment.rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr(drm)); - auto drmMemoryManager = MemoryManager::createMemoryManager(executionEnvironment, DriverModelType::UNKNOWN); + auto drmMemoryManager = MemoryManager::createMemoryManager(mockExecutionEnvironment, DriverModelType::UNKNOWN); EXPECT_NE(nullptr, drmMemoryManager.get()); - executionEnvironment.memoryManager = std::move(drmMemoryManager); + mockExecutionEnvironment.memoryManager = std::move(drmMemoryManager); } TEST(DrmMemoryManagerCreate, givenEnableHostPtrValidationSetToZeroWhenCreateDrmMemoryManagerThenHostPtrValidationIsDisabled) { @@ -687,17 +671,17 @@ TEST(DrmMemoryManagerCreate, givenEnableHostPtrValidationSetToZeroWhenCreateDrmM VariableBackup backup(&ultHwConfig); ultHwConfig.forceOsAgnosticMemoryManager = false; - MockExecutionEnvironment executionEnvironment(defaultHwInfo.get()); - auto drm = new DrmMockSuccess(fakeFd, *executionEnvironment.rootDeviceEnvironments[0]); + MockExecutionEnvironment mockExecutionEnvironment; + auto drm = new DrmMockSuccess(fakeFd, *mockExecutionEnvironment.rootDeviceEnvironments[0]); drm->setupIoctlHelper(defaultHwInfo->platform.eProductFamily); - executionEnvironment.rootDeviceEnvironments[0]->osInterface = std::make_unique(); - executionEnvironment.rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr(drm)); + mockExecutionEnvironment.rootDeviceEnvironments[0]->osInterface = std::make_unique(); + mockExecutionEnvironment.rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr(drm)); - auto drmMemoryManager = MemoryManager::createMemoryManager(executionEnvironment, DriverModelType::UNKNOWN); + auto drmMemoryManager = MemoryManager::createMemoryManager(mockExecutionEnvironment, DriverModelType::UNKNOWN); EXPECT_NE(nullptr, drmMemoryManager.get()); EXPECT_FALSE(static_cast(drmMemoryManager.get())->isValidateHostMemoryEnabled()); - executionEnvironment.memoryManager = std::move(drmMemoryManager); + mockExecutionEnvironment.memoryManager = std::move(drmMemoryManager); } TEST(OsInterfaceTests, givenOsInterfaceWhenEnableLocalMemoryIsSpecifiedThenItIsSetToTrueOn64Bit) { @@ -708,14 +692,14 @@ TEST_F(DrmTests, whenDrmIsCreatedWithMultipleSubDevicesThenCreateMultipleVirtual DebugManagerStateRestore restore; debugManager.flags.CreateMultipleSubDevices.set(2); - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_NE(drm, nullptr); if (drm->isPerContextVMRequired()) { GTEST_SKIP(); } - auto numSubDevices = GfxCoreHelper::getSubDevicesCount(rootDeviceEnvironment->getHardwareInfo()); + auto numSubDevices = GfxCoreHelper::getSubDevicesCount(mockRootDeviceEnvironment->getHardwareInfo()); for (auto id = 0u; id < numSubDevices; id++) { EXPECT_EQ(id + 1, drm->getVirtualMemoryAddressSpace(id)); } @@ -726,14 +710,14 @@ TEST_F(DrmTests, givenDebuggingEnabledWhenDrmIsCreatedThenPerContextVMIsTrueGetV debugManager.flags.CreateMultipleSubDevices.set(2); debugManager.flags.UseVmBind.set(1); - rootDeviceEnvironment->executionEnvironment.setDebuggingMode(NEO::DebuggingMode::Online); + mockExecutionEnvironment.setDebuggingMode(NEO::DebuggingMode::Online); - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); ASSERT_NE(drm, nullptr); if (drm->isVmBindAvailable()) { EXPECT_TRUE(drm->isPerContextVMRequired()); - auto numSubDevices = GfxCoreHelper::getSubDevicesCount(rootDeviceEnvironment->getHardwareInfo()); + auto numSubDevices = GfxCoreHelper::getSubDevicesCount(mockRootDeviceEnvironment->getHardwareInfo()); for (auto id = 0u; id < numSubDevices; id++) { EXPECT_EQ(0u, drm->getVirtualMemoryAddressSpace(id)); } @@ -751,9 +735,9 @@ TEST_F(DrmTests, givenEnabledDebuggingAndVmBindNotAvailableWhenDrmIsCreatedThenP debugManager.flags.UseVmBind.set(0); debugManager.flags.PrintDebugMessages.set(true); - rootDeviceEnvironment->executionEnvironment.setDebuggingMode(NEO::DebuggingMode::Online); + mockRootDeviceEnvironment->executionEnvironment.setDebuggingMode(NEO::DebuggingMode::Online); - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_NE(drm, nullptr); if (drm->isPerContextVMRequired()) { @@ -762,7 +746,7 @@ TEST_F(DrmTests, givenEnabledDebuggingAndVmBindNotAvailableWhenDrmIsCreatedThenP GTEST_SKIP(); } - auto numSubDevices = GfxCoreHelper::getSubDevicesCount(rootDeviceEnvironment->getHardwareInfo()); + auto numSubDevices = GfxCoreHelper::getSubDevicesCount(mockRootDeviceEnvironment->getHardwareInfo()); for (auto id = 0u; id < numSubDevices; id++) { EXPECT_NE(0u, drm->getVirtualMemoryAddressSpace(id)); } @@ -785,7 +769,7 @@ TEST_F(DrmTests, givenDrmIsCreatedWhenCreateVirtualMemoryFailsThenReturnVirtualM ::testing::internal::CaptureStderr(); ::testing::internal::CaptureStdout(); - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_NE(drm, nullptr); EXPECT_EQ(0u, drm->getVirtualMemoryAddressSpace(0)); @@ -861,11 +845,11 @@ int main(int argc, char **argv) { } TEST_F(DrmTests, whenCreateDrmIsCalledThenProperHwInfoIsSetup) { - auto oldHwInfo = rootDeviceEnvironment->getMutableHardwareInfo(); + auto oldHwInfo = mockRootDeviceEnvironment->getMutableHardwareInfo(); *oldHwInfo = {}; - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); EXPECT_NE(drm, nullptr); - auto currentHwInfo = rootDeviceEnvironment->getHardwareInfo(); + auto currentHwInfo = mockRootDeviceEnvironment->getHardwareInfo(); EXPECT_NE(IGFX_UNKNOWN, currentHwInfo->platform.eProductFamily); EXPECT_NE(IGFX_UNKNOWN_CORE, currentHwInfo->platform.eRenderCoreFamily); EXPECT_LT(0u, currentHwInfo->gtSystemInfo.EUCount); @@ -913,7 +897,7 @@ TEST_F(DrmTests, givenValidPciPathThenPciBusInfoIsAvailable) { entryIndex = 1; openCounter = 2; - auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); ASSERT_NE(drm, nullptr); EXPECT_EQ(drm->getPciBusInfo().pciDomain, 0u); EXPECT_EQ(drm->getPciBusInfo().pciBus, 0u); @@ -923,7 +907,7 @@ TEST_F(DrmTests, givenValidPciPathThenPciBusInfoIsAvailable) { entryIndex = 2; openCounter = 1; - drm = DrmWrap::createDrm(*rootDeviceEnvironment); + drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); ASSERT_NE(drm, nullptr); EXPECT_EQ(drm->getPciBusInfo().pciDomain, 0u); EXPECT_EQ(drm->getPciBusInfo().pciBus, 0u); @@ -938,7 +922,7 @@ TEST_F(DrmTests, givenValidPciPathThenPciBusInfoIsAvailable) { for (uint32_t idx = 7; idx < 11; idx++) { entryIndex = idx; openCounter = 1; - drm = DrmWrap::createDrm(*rootDeviceEnvironment); + drm = DrmWrap::createDrm(*mockRootDeviceEnvironment); ASSERT_NE(drm, nullptr); EXPECT_EQ(drm->getPciBusInfo().pciDomain, referenceData[idx - 7][0]); @@ -956,16 +940,16 @@ TEST_F(DrmTests, givenInValidPciPathThenNothingIsReturned) { entryIndex = 11; openCounter = 1; - auto hwDeviceIds = OSInterface::discoverDevices(executionEnvironment); + auto hwDeviceIds = OSInterface::discoverDevices(mockExecutionEnvironment); EXPECT_TRUE(hwDeviceIds.empty()); entryIndex = 12; openCounter = 1; - hwDeviceIds = OSInterface::discoverDevices(executionEnvironment); + hwDeviceIds = OSInterface::discoverDevices(mockExecutionEnvironment); EXPECT_TRUE(hwDeviceIds.empty()); entryIndex = 13; openCounter = 1; - hwDeviceIds = OSInterface::discoverDevices(executionEnvironment); + hwDeviceIds = OSInterface::discoverDevices(mockExecutionEnvironment); EXPECT_TRUE(hwDeviceIds.empty()); } diff --git a/shared/source/execution_environment/root_device_environment.cpp b/shared/source/execution_environment/root_device_environment.cpp index 03d3130e2d..f64cbcd4b7 100644 --- a/shared/source/execution_environment/root_device_environment.cpp +++ b/shared/source/execution_environment/root_device_environment.cpp @@ -102,7 +102,7 @@ void RootDeviceEnvironment::prepareForCleanup() const { bool RootDeviceEnvironment::initAilConfiguration() { if (ailConfiguration == nullptr) { - return true; + return (false == debugManager.flags.EnableAIL.get()); } auto result = ailConfiguration->initProcessExecutableName(); diff --git a/shared/source/os_interface/device_factory.cpp b/shared/source/os_interface/device_factory.cpp index dbf8c2b764..cedcc26860 100644 --- a/shared/source/os_interface/device_factory.cpp +++ b/shared/source/os_interface/device_factory.cpp @@ -63,6 +63,10 @@ bool DeviceFactory::prepareDeviceEnvironmentsForProductFamilyOverride(ExecutionE rootDeviceEnvironment.initGfxCoreHelper(); rootDeviceEnvironment.initApiGfxCoreHelper(); rootDeviceEnvironment.initCompilerProductHelper(); + rootDeviceEnvironment.initAilConfigurationHelper(); + if (false == rootDeviceEnvironment.initAilConfiguration()) { + return false; + } auto hardwareInfo = rootDeviceEnvironment.getMutableHardwareInfo(); diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index 85bffdfaaf..9b4158a01c 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -436,6 +436,12 @@ int Drm::setupHardwareInfo(const DeviceDescriptor *device, bool setupFeatureTabl rootDeviceEnvironment.initGfxCoreHelper(); rootDeviceEnvironment.initApiGfxCoreHelper(); rootDeviceEnvironment.initCompilerProductHelper(); + rootDeviceEnvironment.initAilConfigurationHelper(); + auto result = rootDeviceEnvironment.initAilConfiguration(); + if (false == result) { + PRINT_DEBUG_STRING(debugManager.flags.PrintDebugMessages.get(), stderr, "%s", "FATAL: AIL creation failed!\n"); + return -1; + } hwInfo->platform.usDeviceID = deviceId; hwInfo->platform.usRevId = revisionId; diff --git a/shared/source/os_interface/linux/os_interface_linux.cpp b/shared/source/os_interface/linux/os_interface_linux.cpp index 6f4093177f..9a610289dc 100644 --- a/shared/source/os_interface/linux/os_interface_linux.cpp +++ b/shared/source/os_interface/linux/os_interface_linux.cpp @@ -55,9 +55,6 @@ bool initDrmOsInterface(std::unique_ptr &&hwDeviceId, uint32_t rootD const bool isCsrHwWithAub = debugManager.flags.SetCommandStreamReceiver.get() == CommandStreamReceiverType::CSR_HW_WITH_AUB; rootDeviceEnv->memoryOperationsInterface = DrmMemoryOperationsHandler::create(*drm, rootDeviceIndex, isCsrHwWithAub); - [[maybe_unused]] bool result = rootDeviceEnv->initAilConfiguration(); - DEBUG_BREAK_IF(!result); - return true; } diff --git a/shared/source/os_interface/windows/wddm/wddm.cpp b/shared/source/os_interface/windows/wddm/wddm.cpp index 0e09c220d4..4ecae99653 100644 --- a/shared/source/os_interface/windows/wddm/wddm.cpp +++ b/shared/source/os_interface/windows/wddm/wddm.cpp @@ -114,6 +114,10 @@ bool Wddm::init() { productHelper.adjustPlatformForProductFamily(hardwareInfo); rootDeviceEnvironment.initApiGfxCoreHelper(); rootDeviceEnvironment.initGfxCoreHelper(); + rootDeviceEnvironment.initAilConfigurationHelper(); + if (false == rootDeviceEnvironment.initAilConfiguration()) { + return false; + } populateIpVersion(*hardwareInfo); rootDeviceEnvironment.initReleaseHelper(); @@ -129,9 +133,6 @@ bool Wddm::init() { rootDeviceEnvironment.initGmm(); this->rootDeviceEnvironment.getGmmClientContext()->setHandleAllocator(this->hwDeviceId->getUmKmDataTranslator()->createGmmHandleAllocator()); - [[maybe_unused]] bool result = rootDeviceEnvironment.initAilConfiguration(); - DEBUG_BREAK_IF(!result); - if (WddmVersion::WDDM_2_3 == getWddmVersion()) { wddmInterface = std::make_unique(*this); } else { diff --git a/shared/test/common/mocks/mock_ail_configuration.h b/shared/test/common/mocks/mock_ail_configuration.h index 257ef94949..d4c27ca7ab 100644 --- a/shared/test/common/mocks/mock_ail_configuration.h +++ b/shared/test/common/mocks/mock_ail_configuration.h @@ -12,8 +12,9 @@ namespace NEO { class MockAILConfiguration : public AILConfiguration { public: + bool initProcessExecutableNameResult = true; bool initProcessExecutableName() override { - return true; + return initProcessExecutableNameResult; } void modifyKernelIfRequired(std::string &kernel) override {} diff --git a/shared/test/common/mocks/mock_execution_environment.cpp b/shared/test/common/mocks/mock_execution_environment.cpp index 23d090ecc1..3fdbb1e8c5 100644 --- a/shared/test/common/mocks/mock_execution_environment.cpp +++ b/shared/test/common/mocks/mock_execution_environment.cpp @@ -37,6 +37,12 @@ bool MockRootDeviceEnvironment::initOsInterface(std::unique_ptr &&hw } return RootDeviceEnvironment::initOsInterface(std::move(hwDeviceId), rootDeviceIndex); } +bool MockRootDeviceEnvironment::initAilConfiguration() { + if (ailInitializationResult.has_value()) { + return *ailInitializationResult; + } else + return RootDeviceEnvironment::initAilConfiguration(); +} MockRootDeviceEnvironment::~MockRootDeviceEnvironment() { if (initOsInterfaceExpectedCallCount) { diff --git a/shared/test/common/mocks/mock_execution_environment.h b/shared/test/common/mocks/mock_execution_environment.h index 2a302a749f..141b034bb6 100644 --- a/shared/test/common/mocks/mock_execution_environment.h +++ b/shared/test/common/mocks/mock_execution_environment.h @@ -24,6 +24,7 @@ struct MockRootDeviceEnvironment : public RootDeviceEnvironment { void initAubCenter(bool localMemoryEnabled, const std::string &aubFileName, CommandStreamReceiverType csrType) override; bool initOsInterface(std::unique_ptr &&hwDeviceId, uint32_t rootDeviceIndex) override; + bool initAilConfiguration() override; std::vector initOsInterfaceResults; uint32_t initOsInterfaceCalled = 0u; @@ -32,6 +33,7 @@ struct MockRootDeviceEnvironment : public RootDeviceEnvironment { bool localMemoryEnabledReceived = false; std::string aubFileNameReceived = ""; bool useMockAubCenter = true; + std::optional ailInitializationResult{true}; }; struct MockExecutionEnvironment : ExecutionEnvironment { diff --git a/shared/test/unit_test/ail/ail_tests.cpp b/shared/test/unit_test/ail/ail_tests.cpp index 97abfb260c..2c149d27c5 100644 --- a/shared/test/unit_test/ail/ail_tests.cpp +++ b/shared/test/unit_test/ail/ail_tests.cpp @@ -138,21 +138,6 @@ HWTEST2_F(AILTests, givenPreGen12AndAndProcessNameIsNotResolveWhenApplyWithDavin EXPECT_TRUE(rtTable.hostPtrTrackingEnabled); } -HWTEST_F(AILTests, GivenPlatformHasNoAilAvailableWhenAilIsEnabledThenAilInitializationReturnsTrue) { - DebugManagerStateRestore restore; - NEO::debugManager.flags.EnableAIL.set(true); - - HardwareInfo hwInfo{}; - hwInfo.platform.eProductFamily = productFamily; - hwInfo.platform.eRenderCoreFamily = renderCoreFamily; - - NEO::MockExecutionEnvironment executionEnvironment{&hwInfo, true, 1}; - auto rootDeviceEnvironment = executionEnvironment.rootDeviceEnvironments[0].get(); - rootDeviceEnvironment->ailConfiguration.reset(nullptr); - - EXPECT_TRUE(rootDeviceEnvironment->initAilConfiguration()); -} - HWTEST2_F(AILTests, GivenAilWhenCheckingContextSyncFlagRequiredThenExpectFalse, IsAtLeastGen9) { AILWhitebox ail; ail.processName = "other"; diff --git a/shared/test/unit_test/execution_environment/execution_environment_tests.cpp b/shared/test/unit_test/execution_environment/execution_environment_tests.cpp index 7c55c62fbd..96a964132e 100644 --- a/shared/test/unit_test/execution_environment/execution_environment_tests.cpp +++ b/shared/test/unit_test/execution_environment/execution_environment_tests.cpp @@ -24,6 +24,7 @@ #include "shared/source/os_interface/os_time.h" #include "shared/source/release_helper/release_helper.h" #include "shared/test/common/helpers/debug_manager_state_restore.h" +#include "shared/test/common/mocks/mock_ail_configuration.h" #include "shared/test/common/mocks/mock_device.h" #include "shared/test/common/mocks/mock_driver_model.h" #include "shared/test/common/mocks/mock_execution_environment.h" @@ -487,6 +488,43 @@ TEST(ExecutionEnvironment, givenExecutionEnvironmentWhenSettingFP64EmulationEnab EXPECT_TRUE(executionEnvironment.isFP64EmulationEnabled()); } +TEST(ExecutionEnvironmentWithAILTests, whenAILConfigurationIsNullptrAndEnableAILFlagIsTrueWhenInitializingAILThenReturnFalse) { + DebugManagerStateRestore restore; + debugManager.flags.EnableAIL.set(true); + + MockExecutionEnvironment executionEnvironment{}; + auto rootDeviceEnvironment = static_cast(executionEnvironment.rootDeviceEnvironments[0].get()); + rootDeviceEnvironment->ailInitializationResult = {}; + rootDeviceEnvironment->ailConfiguration.reset(nullptr); + + EXPECT_FALSE(rootDeviceEnvironment->initAilConfiguration()); +} + +TEST(ExecutionEnvironmentWithAILTests, whenPlatformHasNoAILHelperAvailableAndEnableAILFlagIsFalseWhenInitializingAILThenReturnTrue) { + DebugManagerStateRestore restore; + debugManager.flags.EnableAIL.set(false); + + MockExecutionEnvironment executionEnvironment{}; + auto rootDeviceEnvironment = static_cast(executionEnvironment.rootDeviceEnvironments[0].get()); + rootDeviceEnvironment->ailInitializationResult = {}; + rootDeviceEnvironment->ailConfiguration.reset(nullptr); + + EXPECT_TRUE(rootDeviceEnvironment->initAilConfiguration()); +} + +TEST(ExecutionEnvironmentWithAILTests, whenAILConfigurationFailsOnInitProcessExecutableNameThenAILInitializationReturnFalse) { + MockExecutionEnvironment executionEnvironment{}; + auto rootDeviceEnvironment = static_cast(executionEnvironment.rootDeviceEnvironments[0].get()); + rootDeviceEnvironment->ailInitializationResult = {}; + + rootDeviceEnvironment->ailConfiguration.reset(new MockAILConfiguration()); + auto mockAILConfiguration = static_cast(rootDeviceEnvironment->ailConfiguration.get()); + mockAILConfiguration->initProcessExecutableNameResult = false; + ASSERT_NE(nullptr, rootDeviceEnvironment->ailConfiguration); + + EXPECT_FALSE(rootDeviceEnvironment->initAilConfiguration()); +} + TEST(ExecutionEnvironmentDeviceHierarchy, givenExecutionEnvironmentWithDefaultDeviceHierarchyThenExecutionEnvironmentIsInitializedCorrectly) { VariableBackup mockGetenvCalledBackup(&IoFunctions::mockGetenvCalled, 0); MockExecutionEnvironment executionEnvironment; diff --git a/shared/test/unit_test/gen12lp/dg1/execution_environment_tests_dg1.cpp b/shared/test/unit_test/gen12lp/dg1/execution_environment_tests_dg1.cpp index 34ecc074c4..fd58d9ea6c 100644 --- a/shared/test/unit_test/gen12lp/dg1/execution_environment_tests_dg1.cpp +++ b/shared/test/unit_test/gen12lp/dg1/execution_environment_tests_dg1.cpp @@ -17,14 +17,8 @@ using RootDeviceEnvironmentTests = ::testing::Test; HWTEST2_F(RootDeviceEnvironmentTests, givenRootDeviceEnvironmentWhenAILInitProcessExecutableNameReturnsFailedThenInitAilConfigurationReturnsFail, IsDG1) { MockExecutionEnvironment executionEnvironment{}; auto rootDeviceEnvironment = static_cast(executionEnvironment.rootDeviceEnvironments[0].get()); + rootDeviceEnvironment->ailInitializationResult = false; - class AILDG1 : public AILConfigurationHw { - public: - bool initProcessExecutableName() override { - return false; - } - }; - rootDeviceEnvironment->ailConfiguration.reset(new AILDG1()); EXPECT_EQ(false, rootDeviceEnvironment->initAilConfiguration()); } } // namespace NEO diff --git a/shared/test/unit_test/os_interface/device_factory_tests.cpp b/shared/test/unit_test/os_interface/device_factory_tests.cpp index d7d1f18c08..4ef4f33352 100644 --- a/shared/test/unit_test/os_interface/device_factory_tests.cpp +++ b/shared/test/unit_test/os_interface/device_factory_tests.cpp @@ -174,3 +174,12 @@ TEST_F(DeviceFactoryTests, givenMultipleDevicesWhenInitializeResourcesFailsForAl EXPECT_EQ(0u, executionEnvironment.rootDeviceEnvironments.size()); } + +TEST_F(DeviceFactoryTests, givenFailedAilInitializationResultWhenPrepareDeviceEnvironmentsIsCalledThenReturnFalse) { + MockExecutionEnvironment executionEnvironment(defaultHwInfo.get()); + auto mockRootDeviceEnvironment = static_cast(executionEnvironment.rootDeviceEnvironments[0].get()); + mockRootDeviceEnvironment->ailInitializationResult = false; + + bool res = DeviceFactory::prepareDeviceEnvironmentsForProductFamilyOverride(executionEnvironment); + EXPECT_FALSE(res); +} diff --git a/shared/test/unit_test/os_interface/windows/wddm_tests.cpp b/shared/test/unit_test/os_interface/windows/wddm_tests.cpp index c9a29ef3b2..174bb33ff0 100644 --- a/shared/test/unit_test/os_interface/windows/wddm_tests.cpp +++ b/shared/test/unit_test/os_interface/windows/wddm_tests.cpp @@ -120,6 +120,16 @@ TEST_F(WddmTests, WhenCallingReInitializeContextWithContextCreateDisabledFlagEna EXPECT_EQ(0u, newContext->getWddmContextHandle()); } +TEST_F(WddmTests, givenFailedAilInitializationResultWhenInitializingWddmThenReturnFalse) { + MockExecutionEnvironment executionEnvironment; + MockRootDeviceEnvironment mockRootDeviceEnvironment(executionEnvironment); + mockRootDeviceEnvironment.ailInitializationResult = false; + + auto wddm = Wddm::createWddm(nullptr, mockRootDeviceEnvironment); + auto res = wddm->init(); + EXPECT_FALSE(res); +} + TEST(WddmNewRsourceTest, whenSetNewResourcesBoundToPageTableThenSetInContextFromProperRootDeviceEnvironment) { MockExecutionEnvironment executionEnvironment; executionEnvironment.prepareRootDeviceEnvironments(2);