diff --git a/level_zero/core/source/driver/driver_handle_imp.cpp b/level_zero/core/source/driver/driver_handle_imp.cpp index 0998391c44..2af39f4884 100644 --- a/level_zero/core/source/driver/driver_handle_imp.cpp +++ b/level_zero/core/source/driver/driver_handle_imp.cpp @@ -145,6 +145,10 @@ ze_result_t DriverHandleImp::getExtensionProperties(uint32_t *pCount, } DriverHandleImp::~DriverHandleImp() { + if (memoryManager != nullptr) { + memoryManager->peekExecutionEnvironment().prepareForCleanup(); + } + for (auto &device : this->devices) { delete device; } diff --git a/level_zero/core/test/unit_tests/fixtures/cmdlist_fixture.h b/level_zero/core/test/unit_tests/fixtures/cmdlist_fixture.h index fddee154a2..c450102f26 100644 --- a/level_zero/core/test/unit_tests/fixtures/cmdlist_fixture.h +++ b/level_zero/core/test/unit_tests/fixtures/cmdlist_fixture.h @@ -40,6 +40,9 @@ class CommandListFixture : public DeviceFixture { } void TearDown() { + event.reset(nullptr); + eventPool.reset(nullptr); + commandList.reset(nullptr); DeviceFixture::TearDown(); } diff --git a/level_zero/core/test/unit_tests/fixtures/device_fixture.cpp b/level_zero/core/test/unit_tests/fixtures/device_fixture.cpp index 130ec95fff..aee238c6f4 100644 --- a/level_zero/core/test/unit_tests/fixtures/device_fixture.cpp +++ b/level_zero/core/test/unit_tests/fixtures/device_fixture.cpp @@ -23,6 +23,7 @@ void DeviceFixture::SetUp() { setupWithExecutionEnvironment(*executionEnvironment); } void DeviceFixture::setupWithExecutionEnvironment(NEO::ExecutionEnvironment &executionEnvironment) { + execEnv = &executionEnvironment; neoDevice = NEO::MockDevice::createWithExecutionEnvironment(NEO::defaultHwInfo.get(), &executionEnvironment, 0u); mockBuiltIns = new MockBuiltins(); neoDevice->executionEnvironment->rootDeviceEnvironments[0]->builtins.reset(mockBuiltIns); @@ -37,10 +38,13 @@ void DeviceFixture::setupWithExecutionEnvironment(NEO::ExecutionEnvironment &exe ze_result_t res = driverHandle->createContext(&desc, 0u, nullptr, &hContext); EXPECT_EQ(ZE_RESULT_SUCCESS, res); context = static_cast(Context::fromHandle(hContext)); + executionEnvironment.incRefInternal(); } void DeviceFixture::TearDown() { context->destroy(); + driverHandle.reset(nullptr); + execEnv->decRefInternal(); } void PageFaultDeviceFixture::SetUp() { diff --git a/level_zero/core/test/unit_tests/fixtures/device_fixture.h b/level_zero/core/test/unit_tests/fixtures/device_fixture.h index 41962be959..393358ea03 100644 --- a/level_zero/core/test/unit_tests/fixtures/device_fixture.h +++ b/level_zero/core/test/unit_tests/fixtures/device_fixture.h @@ -100,6 +100,7 @@ struct DeviceFixture { L0::Device *device = nullptr; L0::ContextImp *context = nullptr; MockBuiltins *mockBuiltIns = nullptr; + NEO::ExecutionEnvironment *execEnv = nullptr; }; struct DriverHandleGetMemHandlePtrMock : public L0::DriverHandleImp { diff --git a/level_zero/core/test/unit_tests/fixtures/module_fixture.h b/level_zero/core/test/unit_tests/fixtures/module_fixture.h index ddd56fc093..cbbad80e56 100644 --- a/level_zero/core/test/unit_tests/fixtures/module_fixture.h +++ b/level_zero/core/test/unit_tests/fixtures/module_fixture.h @@ -189,6 +189,7 @@ struct ModuleImmutableDataFixture : public DeviceFixture { } void TearDown() { + module.reset(nullptr); DeviceFixture::TearDown(); } @@ -238,6 +239,8 @@ struct ModuleFixture : public DeviceFixture { } void TearDown() { + kernel.reset(nullptr); + module.reset(nullptr); DeviceFixture::TearDown(); } @@ -287,6 +290,10 @@ struct MultiDeviceModuleFixture : public MultiDeviceFixture { } void TearDown() { + kernel.reset(nullptr); + for (auto &module : modules) { + module.reset(nullptr); + } MultiDeviceFixture::TearDown(); } @@ -375,6 +382,7 @@ struct ModuleWithZebinFixture : public DeviceFixture { } void TearDown() { + module.reset(nullptr); DeviceFixture::TearDown(); } std::unique_ptr module; diff --git a/level_zero/core/test/unit_tests/gen12lp/test_events_gen12lp.cpp b/level_zero/core/test/unit_tests/gen12lp/test_events_gen12lp.cpp index 348a19573a..5cc4346f25 100644 --- a/level_zero/core/test/unit_tests/gen12lp/test_events_gen12lp.cpp +++ b/level_zero/core/test/unit_tests/gen12lp/test_events_gen12lp.cpp @@ -36,6 +36,8 @@ struct TimestampEvent : public Test { } void TearDown() override { + event.reset(nullptr); + eventPool.reset(nullptr); DeviceFixture::TearDown(); } diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_launch_kernel_2.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_launch_kernel_2.cpp index 960271b8c6..fcf4ebaca6 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_launch_kernel_2.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_launch_kernel_2.cpp @@ -936,6 +936,11 @@ struct CmdlistAppendLaunchKernelWithImplicitArgsTests : CmdlistAppendLaunchKerne expectedImplicitArgs.groupCountZ = 3; } + void TearDown() override { + commandList.reset(nullptr); + CmdlistAppendLaunchKernelTests::TearDown(); + } + template void dispatchKernelWithImplicitArgs() { expectedImplicitArgs.globalSizeX = expectedImplicitArgs.localSizeX * expectedImplicitArgs.groupCountX; diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_memory_extension.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_memory_extension.cpp index 86b8640cad..a117c48017 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_memory_extension.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_memory_extension.cpp @@ -53,6 +53,9 @@ class CommandListMemoryExtensionFixture : public DeviceFixture { void TearDown() { context->freeMem(ptr); + event.reset(nullptr); + eventPool.reset(nullptr); + commandList.reset(nullptr); DeviceFixture::TearDown(); } diff --git a/level_zero/core/test/unit_tests/sources/context/test_context.cpp b/level_zero/core/test/unit_tests/sources/context/test_context.cpp index a794777288..a5f21de3e1 100644 --- a/level_zero/core/test/unit_tests/sources/context/test_context.cpp +++ b/level_zero/core/test/unit_tests/sources/context/test_context.cpp @@ -242,7 +242,6 @@ TEST_F(ContextGetStatusTest, givenCallToContextGetStatusThenCorrectErrorCodeIsRe res = context->getStatus(); EXPECT_EQ(ZE_RESULT_ERROR_DEVICE_LOST, res); - context->destroy(); } diff --git a/level_zero/core/test/unit_tests/sources/debugger/test_source_level_debugger.cpp b/level_zero/core/test/unit_tests/sources/debugger/test_source_level_debugger.cpp index 8f5eeb0222..4cc4d3b397 100644 --- a/level_zero/core/test/unit_tests/sources/debugger/test_source_level_debugger.cpp +++ b/level_zero/core/test/unit_tests/sources/debugger/test_source_level_debugger.cpp @@ -286,6 +286,7 @@ TEST(Debugger, GivenLegacyDebuggerAndProgramDebuggingEnabledWhenInitializingDriv ::testing::internal::CaptureStderr(); auto executionEnvironment = new NEO::ExecutionEnvironment(); + executionEnvironment->incRefInternal(); executionEnvironment->prepareRootDeviceEnvironments(1); executionEnvironment->rootDeviceEnvironments[0]->debugger.reset(new MockSourceLevelDebugger()); @@ -306,6 +307,9 @@ TEST(Debugger, GivenLegacyDebuggerAndProgramDebuggingEnabledWhenInitializingDriv std::string output = testing::internal::GetCapturedStderr(); EXPECT_EQ(std::string("Source Level Debugger cannot be used with Environment Variable enabling program debugging.\n"), output); + + driverHandle.reset(nullptr); + executionEnvironment->decRefInternal(); } } // namespace ult diff --git a/level_zero/core/test/unit_tests/sources/device/test_device.cpp b/level_zero/core/test/unit_tests/sources/device/test_device.cpp index 422d848e01..05bf1ffbce 100644 --- a/level_zero/core/test/unit_tests/sources/device/test_device.cpp +++ b/level_zero/core/test/unit_tests/sources/device/test_device.cpp @@ -595,6 +595,8 @@ struct DeviceTest : public ::testing::Test { NEO::MockCompilerEnableGuard mock(true); DebugManager.flags.CreateMultipleRootDevices.set(numRootDevices); neoDevice = NEO::MockDevice::createWithNewExecutionEnvironment(NEO::defaultHwInfo.get(), rootDeviceIndex); + execEnv = neoDevice->getExecutionEnvironment(); + execEnv->incRefInternal(); NEO::DeviceVector devices; devices.push_back(std::unique_ptr(neoDevice)); driverHandle = std::make_unique>(); @@ -602,8 +604,14 @@ struct DeviceTest : public ::testing::Test { device = driverHandle->devices[0]; } + void TearDown() override { + driverHandle.reset(nullptr); + execEnv->decRefInternal(); + } + DebugManagerStateRestore restorer; std::unique_ptr> driverHandle; + NEO::ExecutionEnvironment *execEnv; NEO::Device *neoDevice = nullptr; L0::Device *device = nullptr; const uint32_t rootDeviceIndex = 1u; diff --git a/level_zero/core/test/unit_tests/sources/driver/test_driver.cpp b/level_zero/core/test/unit_tests/sources/driver/test_driver.cpp index 5ef3cd6aa7..e77b2e2f0c 100644 --- a/level_zero/core/test/unit_tests/sources/driver/test_driver.cpp +++ b/level_zero/core/test/unit_tests/sources/driver/test_driver.cpp @@ -167,8 +167,6 @@ class MemoryManagerNTHandleMock : public NEO::OsAgnosticMemoryManager { }; HWTEST_F(ImportNTHandle, givenNTHandleWhenCreatingDeviceMemoryThenSuccessIsReturned) { - using RENDER_SURFACE_STATE = typename FamilyType::RENDER_SURFACE_STATE; - ze_device_mem_alloc_desc_t devProperties = {}; devProperties.stype = ZE_STRUCTURE_TYPE_DEVICE_MEMORY_PROPERTIES; @@ -179,32 +177,18 @@ HWTEST_F(ImportNTHandle, givenNTHandleWhenCreatingDeviceMemoryThenSuccessIsRetur importNTHandle.stype = ZE_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMPORT_WIN32; devProperties.pNext = &importNTHandle; - NEO::MockDevice *neoDevice = nullptr; - auto executionEnvironment = NEO::MockDevice::prepareExecutionEnvironment(NEO::defaultHwInfo.get(), 0); - executionEnvironment->memoryManager.reset(new MemoryManagerNTHandleMock(*executionEnvironment)); - - neoDevice = NEO::MockDevice::createWithExecutionEnvironment(NEO::defaultHwInfo.get(), executionEnvironment, 0); - - driverHandle->setMemoryManager(executionEnvironment->memoryManager.get()); - - ze_result_t result = ZE_RESULT_SUCCESS; - auto device = L0::Device::create(driverHandle.get(), neoDevice, false, &result); - - context->addDeviceAndSubDevices(device); + delete driverHandle->svmAllocsManager; + execEnv->memoryManager.reset(new MemoryManagerNTHandleMock(*execEnv)); + driverHandle->setMemoryManager(execEnv->memoryManager.get()); + driverHandle->svmAllocsManager = new NEO::SVMAllocsManager(execEnv->memoryManager.get(), false); void *ptr; - - result = context->allocDeviceMem(device, &devProperties, 100, 1, &ptr); - + auto result = context->allocDeviceMem(device, &devProperties, 100, 1, &ptr); EXPECT_EQ(result, ZE_RESULT_SUCCESS); - auto alloc = driverHandle->getSvmAllocsManager()->getSVMAlloc(ptr); - ASSERT_EQ(alloc->gpuAllocations.getGraphicsAllocation(device->getRootDeviceIndex())->peekSharedHandle(), NEO::toOsHandle(importNTHandle.handle)); result = context->freeMem(ptr); EXPECT_EQ(result, ZE_RESULT_SUCCESS); - - delete device; } HWTEST_F(ImportNTHandle, whenCallingCreateGraphicsAllocationFromMultipleSharedHandlesFromOsAgnosticMemoryManagerThenNullptrIsReturned) { @@ -220,16 +204,10 @@ HWTEST_F(ImportNTHandle, whenCallingCreateGraphicsAllocationFromMultipleSharedHa importNTHandle.stype = ZE_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMPORT_WIN32; devProperties.pNext = &importNTHandle; - NEO::MockDevice *neoDevice = nullptr; - auto executionEnvironment = NEO::MockDevice::prepareExecutionEnvironment(NEO::defaultHwInfo.get(), 0); - executionEnvironment->memoryManager.reset(new MemoryManagerNTHandleMock(*executionEnvironment)); - - neoDevice = NEO::MockDevice::createWithExecutionEnvironment(NEO::defaultHwInfo.get(), executionEnvironment, 0); - - driverHandle->setMemoryManager(executionEnvironment->memoryManager.get()); - - ze_result_t result = ZE_RESULT_SUCCESS; - auto device = L0::Device::create(driverHandle.get(), neoDevice, false, &result); + delete driverHandle->svmAllocsManager; + execEnv->memoryManager.reset(new MemoryManagerNTHandleMock(*execEnv)); + driverHandle->setMemoryManager(execEnv->memoryManager.get()); + driverHandle->svmAllocsManager = new NEO::SVMAllocsManager(execEnv->memoryManager.get(), false); std::vector handles{6, 7}; AllocationProperties properties = {device->getRootDeviceIndex(), @@ -240,10 +218,8 @@ HWTEST_F(ImportNTHandle, whenCallingCreateGraphicsAllocationFromMultipleSharedHa device->getNEODevice()->getDeviceBitfield()}; bool requireSpecificBitness{}; bool isHostIpcAllocation{}; - auto ptr = executionEnvironment->memoryManager->createGraphicsAllocationFromMultipleSharedHandles(handles, properties, requireSpecificBitness, isHostIpcAllocation); + auto ptr = execEnv->memoryManager->createGraphicsAllocationFromMultipleSharedHandles(handles, properties, requireSpecificBitness, isHostIpcAllocation); EXPECT_EQ(nullptr, ptr); - - delete device; } HWTEST_F(ImportNTHandle, givenNotExistingNTHandleWhenCreatingDeviceMemoryThenErrorIsReturned) { diff --git a/level_zero/core/test/unit_tests/sources/event/test_event.cpp b/level_zero/core/test/unit_tests/sources/event/test_event.cpp index 6783a501a9..392d2401e1 100644 --- a/level_zero/core/test/unit_tests/sources/event/test_event.cpp +++ b/level_zero/core/test/unit_tests/sources/event/test_event.cpp @@ -712,6 +712,8 @@ class EventSynchronizeTest : public Test { } void TearDown() override { + event.reset(nullptr); + eventPool.reset(nullptr); DeviceFixture::TearDown(); } @@ -1054,6 +1056,8 @@ class TimestampEventCreate : public Test { } void TearDown() override { + event.reset(nullptr); + eventPool.reset(nullptr); DeviceFixture::TearDown(); } @@ -1187,6 +1191,8 @@ class TimestampDeviceEventCreate : public Test { } void TearDown() override { + event.reset(nullptr); + eventPool.reset(nullptr); DeviceFixture::TearDown(); } @@ -1756,6 +1762,9 @@ struct EventSizeFixture : public DeviceFixture { } void TearDown() { + eventObj0.reset(nullptr); + eventObj1.reset(nullptr); + eventPool.reset(nullptr); DeviceFixture::TearDown(); } diff --git a/level_zero/core/test/unit_tests/sources/image/test_image.cpp b/level_zero/core/test/unit_tests/sources/image/test_image.cpp index ffbd7003b4..9d8e682ec0 100644 --- a/level_zero/core/test/unit_tests/sources/image/test_image.cpp +++ b/level_zero/core/test/unit_tests/sources/image/test_image.cpp @@ -386,14 +386,10 @@ HWTEST2_F(ImageCreate, givenNTHandleWhenCreatingImageThenSuccessIsReturned, IsAt importNTHandle.stype = ZE_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMPORT_WIN32; desc.pNext = &importNTHandle; - NEO::MockDevice *neoDevice = nullptr; - auto executionEnvironment = NEO::MockDevice::prepareExecutionEnvironment(NEO::defaultHwInfo.get(), 0); - executionEnvironment->memoryManager.reset(new MemoryManagerNTHandleMock(*executionEnvironment)); - neoDevice = NEO::MockDevice::createWithExecutionEnvironment(NEO::defaultHwInfo.get(), executionEnvironment, 0); - driverHandle->setMemoryManager(executionEnvironment->memoryManager.get()); - - ze_result_t result = ZE_RESULT_SUCCESS; - auto device = L0::Device::create(driverHandle.get(), neoDevice, false, &result); + delete driverHandle->svmAllocsManager; + execEnv->memoryManager.reset(new MemoryManagerNTHandleMock(*execEnv)); + driverHandle->setMemoryManager(execEnv->memoryManager.get()); + driverHandle->svmAllocsManager = new NEO::SVMAllocsManager(execEnv->memoryManager.get(), false); auto imageHW = std::make_unique>>(); auto ret = imageHW->initialize(device, &desc); @@ -401,7 +397,6 @@ HWTEST2_F(ImageCreate, givenNTHandleWhenCreatingImageThenSuccessIsReturned, IsAt ASSERT_EQ(imageHW->getAllocation()->peekSharedHandle(), NEO::toOsHandle(importNTHandle.handle)); imageHW.reset(nullptr); - delete device; } class FailMemoryManagerMock : public NEO::OsAgnosticMemoryManager { @@ -441,24 +436,17 @@ HWTEST2_F(ImageCreate, givenImageDescWhenFailImageAllocationThenProperErrorIsRet backupSipInitType = true; } - NEO::MockDevice *neoDevice = nullptr; - auto executionEnvironment = NEO::MockDevice::prepareExecutionEnvironment(NEO::defaultHwInfo.get(), 0); - auto failMemMngr = new FailMemoryManagerMock(*executionEnvironment); - executionEnvironment->memoryManager.reset(failMemMngr); - neoDevice = NEO::MockDevice::createWithExecutionEnvironment(NEO::defaultHwInfo.get(), executionEnvironment, 0); - driverHandle->setMemoryManager(executionEnvironment->memoryManager.get()); - - ze_result_t result = ZE_RESULT_SUCCESS; - auto device = L0::Device::create(driverHandle.get(), neoDevice, false, &result); + delete driverHandle->svmAllocsManager; + execEnv->memoryManager.reset(new FailMemoryManagerMock(*execEnv)); + driverHandle->setMemoryManager(execEnv->memoryManager.get()); + driverHandle->svmAllocsManager = new NEO::SVMAllocsManager(execEnv->memoryManager.get(), false); L0::Image *imageHandle = nullptr; - failMemMngr->fail = true; + static_cast(execEnv->memoryManager.get())->fail = true; auto ret = L0::Image::create(neoDevice->getHardwareInfo().platform.eProductFamily, device, &desc, &imageHandle); ASSERT_EQ(ZE_RESULT_ERROR_OUT_OF_DEVICE_MEMORY, ret); EXPECT_EQ(imageHandle, nullptr); - - delete device; } HWTEST2_F(ImageCreate, givenMediaBlockOptionWhenCopySurfaceStateThenSurfaceStateIsSet, IsAtLeastSkl) { diff --git a/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp b/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp index 3d7db9a2c6..d282dab8f7 100644 --- a/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp +++ b/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp @@ -787,8 +787,6 @@ TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueAndNoRTDispatchGlobalsIsAll } mockDescriptor.payloadMappings.implicitArgs.rtDispatchGlobals.pointerSize = 4; - NEO::MemoryManager *currMemoryManager = new NEO::FailMemoryManager(0, *neoDevice->executionEnvironment); - std::unique_ptr mockKernelImmutableData = std::make_unique(32u); mockKernelImmutableData->kernelDescriptor = &mockDescriptor; @@ -812,7 +810,11 @@ TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueAndNoRTDispatchGlobalsIsAll immDataVector->push_back(std::move(mockKernelImmutableData)); neoDevice->getExecutionEnvironment()->rootDeviceEnvironments[neoDevice->getRootDeviceIndex()]->bindlessHeapsHelper.reset(nullptr); - neoDevice->injectMemoryManager(currMemoryManager); + + delete driverHandle->svmAllocsManager; + execEnv->memoryManager.reset(new FailMemoryManager(0, *execEnv)); + driverHandle->setMemoryManager(execEnv->memoryManager.get()); + driverHandle->svmAllocsManager = new NEO::SVMAllocsManager(execEnv->memoryManager.get(), false); EXPECT_EQ(ZE_RESULT_ERROR_OUT_OF_HOST_MEMORY, kernel->initialize(&kernelDesc)); } diff --git a/level_zero/core/test/unit_tests/sources/module/test_module.cpp b/level_zero/core/test/unit_tests/sources/module/test_module.cpp index 802186664e..55a249b941 100644 --- a/level_zero/core/test/unit_tests/sources/module/test_module.cpp +++ b/level_zero/core/test/unit_tests/sources/module/test_module.cpp @@ -1147,6 +1147,12 @@ struct ModuleDynamicLinkTests : public Test { module1 = std::make_unique>(device, nullptr, ModuleType::User); module2 = std::make_unique>(device, nullptr, ModuleType::User); } + void TearDown() override { + module0.reset(nullptr); + module1.reset(nullptr); + module2.reset(nullptr); + Test::TearDown(); + } std::unique_ptr> module0; std::unique_ptr> module1; std::unique_ptr> module2; diff --git a/level_zero/tools/test/unit_tests/sources/sysman/diagnostics/linux/test_zes_sysman_diagnostics.cpp b/level_zero/tools/test/unit_tests/sources/sysman/diagnostics/linux/test_zes_sysman_diagnostics.cpp index a952e7b043..24dcb95952 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/diagnostics/linux/test_zes_sysman_diagnostics.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/diagnostics/linux/test_zes_sysman_diagnostics.cpp @@ -55,8 +55,9 @@ class ZesDiagnosticsFixture : public SysmanDeviceFixture { if (!sysmanUltsEnable) { GTEST_SKIP(); } - SysmanDeviceFixture::TearDown(); + pMockFwInterface.reset(nullptr); pLinuxSysmanImp->pFwUtilInterface = pFwUtilInterfaceOld; + SysmanDeviceFixture::TearDown(); } void clearAndReinitHandles(std::vector &deviceHandles) { diff --git a/level_zero/tools/test/unit_tests/sources/sysman/engine/linux/test_zes_engine.cpp b/level_zero/tools/test/unit_tests/sources/sysman/engine/linux/test_zes_engine.cpp index 9e83518030..584712c2bb 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/engine/linux/test_zes_engine.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/engine/linux/test_zes_engine.cpp @@ -76,12 +76,13 @@ class ZesEngineFixture : public SysmanDeviceFixture { if (!sysmanUltsEnable) { GTEST_SKIP(); } - SysmanDeviceFixture::TearDown(); device->getDriverHandle()->setMemoryManager(pMemoryManagerOriginal); pLinuxSysmanImp->pDrm = pOriginalDrm; pLinuxSysmanImp->pPmuInterface = pOriginalPmuInterface; pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOriginal; pLinuxSysmanImp->pFsAccess = pFsAccessOriginal; + + SysmanDeviceFixture::TearDown(); } std::vector getEngineHandles(uint32_t count) { diff --git a/level_zero/tools/test/unit_tests/sources/sysman/firmware/linux/test_zes_sysman_firmware.cpp b/level_zero/tools/test/unit_tests/sources/sysman/firmware/linux/test_zes_sysman_firmware.cpp index 0de8585564..4242194ef5 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/firmware/linux/test_zes_sysman_firmware.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/firmware/linux/test_zes_sysman_firmware.cpp @@ -52,9 +52,9 @@ class ZesFirmwareFixture : public SysmanDeviceFixture { if (!sysmanUltsEnable) { GTEST_SKIP(); } - SysmanDeviceFixture::TearDown(); pLinuxSysmanImp->pFwUtilInterface = pFwUtilInterfaceOld; pLinuxSysmanImp->pFsAccess = pFsAccessOriginal; + SysmanDeviceFixture::TearDown(); } std::vector getFirmwareHandles(uint32_t count) { diff --git a/level_zero/tools/test/unit_tests/sources/sysman/frequency/linux/test_zes_frequency.cpp b/level_zero/tools/test/unit_tests/sources/sysman/frequency/linux/test_zes_frequency.cpp index d31968c4ef..8c457025c5 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/frequency/linux/test_zes_frequency.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/frequency/linux/test_zes_frequency.cpp @@ -85,8 +85,8 @@ class SysmanDeviceFrequencyFixture : public SysmanDeviceFixture { if (!sysmanUltsEnable) { GTEST_SKIP(); } - SysmanDeviceFixture::TearDown(); pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOld; + SysmanDeviceFixture::TearDown(); } double clockValue(const double calculatedClock) { diff --git a/level_zero/tools/test/unit_tests/sources/sysman/global_operations/linux/test_zes_global_operations.cpp b/level_zero/tools/test/unit_tests/sources/sysman/global_operations/linux/test_zes_global_operations.cpp index 6fee269118..d70e7015eb 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/global_operations/linux/test_zes_global_operations.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/global_operations/linux/test_zes_global_operations.cpp @@ -148,10 +148,11 @@ class SysmanGlobalOperationsFixture : public SysmanDeviceFixture { pSysmanDeviceImp->pDiagnosticsHandleContext = pDiagnosticsHandleContextOld; pSysmanDeviceImp->pFirmwareHandleContext = pFirmwareHandleContextOld; pSysmanDeviceImp->pRasHandleContext = pRasHandleContextOld; - SysmanDeviceFixture::TearDown(); pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOld; pLinuxSysmanImp->pProcfsAccess = pProcfsAccessOld; pLinuxSysmanImp->pFsAccess = pFsAccessOld; + + SysmanDeviceFixture::TearDown(); } }; class SysmanGlobalOperationsIntegratedFixture : public SysmanGlobalOperationsFixture { @@ -237,7 +238,7 @@ TEST_F(SysmanGlobalOperationsFixture, GivenValidDeviceHandleWhenCallingzesDevice TEST_F(SysmanGlobalOperationsFixture, GivenValidDeviceHandleWhenCallingzesDeviceGetPropertiesForCheckingDevicePropertiesWhenVendorIsUnKnownThenVerifyzesDeviceGetPropertiesCallSucceeds) { ON_CALL(*pSysfsAccess.get(), read(_, Matcher(_))) .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock::getFalseValString)); - neoDevice->deviceInfo.vendorId = 1806; //Unknown Vendor id + neoDevice->deviceInfo.vendorId = 1806; // Unknown Vendor id pGlobalOperationsImp->init(); zes_device_properties_t properties; ze_result_t result = zesDeviceGetProperties(device, &properties); diff --git a/level_zero/tools/test/unit_tests/sources/sysman/linux/mock_sysman_fixture.h b/level_zero/tools/test/unit_tests/sources/sysman/linux/mock_sysman_fixture.h index 49d8c47e4b..96cfec481a 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/linux/mock_sysman_fixture.h +++ b/level_zero/tools/test/unit_tests/sources/sysman/linux/mock_sysman_fixture.h @@ -85,6 +85,7 @@ class SysmanDeviceFixture : public DeviceFixture, public ::testing::Test { if (!sysmanUltsEnable) { GTEST_SKIP(); } + DeviceFixture::TearDown(); unsetenv("ZES_ENABLE_SYSMAN"); } diff --git a/level_zero/tools/test/unit_tests/sources/sysman/linux/pmu/test_pmu.cpp b/level_zero/tools/test/unit_tests/sources/sysman/linux/pmu/test_pmu.cpp index da8d70ef82..c16b535775 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/linux/pmu/test_pmu.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/linux/pmu/test_pmu.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 Intel Corporation + * Copyright (C) 2021-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -45,9 +45,9 @@ struct SysmanPmuFixture : public SysmanDeviceFixture { if (!sysmanUltsEnable) { GTEST_SKIP(); } - SysmanDeviceFixture::TearDown(); pLinuxSysmanImp->pPmuInterface = pOriginalPmuInterface; pLinuxSysmanImp->pFsAccess = pFsAccessOriginal; + SysmanDeviceFixture::TearDown(); } }; diff --git a/level_zero/tools/test/unit_tests/sources/sysman/memory/linux/test_sysman_memory.cpp b/level_zero/tools/test/unit_tests/sources/sysman/memory/linux/test_sysman_memory.cpp index f6c83bfa79..34e334c371 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/memory/linux/test_sysman_memory.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/memory/linux/test_sysman_memory.cpp @@ -54,11 +54,11 @@ class SysmanDeviceMemoryFixture : public SysmanDeviceFixture { GTEST_SKIP(); } device->getDriverHandle()->setMemoryManager(pMemoryManagerOld); - SysmanDeviceFixture::TearDown(); if (pMemoryManager != nullptr) { delete pMemoryManager; pMemoryManager = nullptr; } + SysmanDeviceFixture::TearDown(); } void setLocalSupportedAndReinit(bool supported) { diff --git a/level_zero/tools/test/unit_tests/sources/sysman/memory/linux/test_sysman_memory_dg1.cpp b/level_zero/tools/test/unit_tests/sources/sysman/memory/linux/test_sysman_memory_dg1.cpp index e15dbe7b74..de80228fe6 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/memory/linux/test_sysman_memory_dg1.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/memory/linux/test_sysman_memory_dg1.cpp @@ -66,7 +66,6 @@ class SysmanDeviceMemoryFixture : public SysmanDeviceFixture { GTEST_SKIP(); } device->getDriverHandle()->setMemoryManager(pMemoryManagerOld); - SysmanDeviceFixture::TearDown(); pLinuxSysmanImp->pDrm = pOriginalDrm; if (pDrm != nullptr) { delete pDrm; @@ -76,6 +75,7 @@ class SysmanDeviceMemoryFixture : public SysmanDeviceFixture { delete pMemoryManager; pMemoryManager = nullptr; } + SysmanDeviceFixture::TearDown(); } void setLocalSupportedAndReinit(bool supported) { diff --git a/level_zero/tools/test/unit_tests/sources/sysman/pci/linux/test_zes_pci.cpp b/level_zero/tools/test/unit_tests/sources/sysman/pci/linux/test_zes_pci.cpp index 50e06d65a1..06ee3c24a1 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/pci/linux/test_zes_pci.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/pci/linux/test_zes_pci.cpp @@ -198,7 +198,6 @@ class ZesPciFixture : public SysmanDeviceFixture { GTEST_SKIP(); } device->getDriverHandle()->setMemoryManager(pMemoryManagerOld); - SysmanDeviceFixture::TearDown(); if (nullptr != pPciImp->pOsPci) { delete pPciImp->pOsPci; } @@ -211,6 +210,7 @@ class ZesPciFixture : public SysmanDeviceFixture { delete memoryManager; memoryManager = nullptr; } + SysmanDeviceFixture::TearDown(); } }; diff --git a/level_zero/tools/test/unit_tests/sources/sysman/power/linux/mock_sysfs_power.h b/level_zero/tools/test/unit_tests/sources/sysman/power/linux/mock_sysfs_power.h index 95c47ab386..20bb93ba86 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/power/linux/mock_sysfs_power.h +++ b/level_zero/tools/test/unit_tests/sources/sysman/power/linux/mock_sysfs_power.h @@ -396,9 +396,9 @@ class SysmanDevicePowerFixture : public SysmanDeviceFixture { if (!sysmanUltsEnable) { GTEST_SKIP(); } - SysmanDeviceFixture::TearDown(); pLinuxSysmanImp->pFsAccess = pFsAccessOriginal; pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOld; + SysmanDeviceFixture::TearDown(); } std::vector getPowerHandles(uint32_t count) { @@ -474,10 +474,10 @@ class SysmanDevicePowerMultiDeviceFixture : public SysmanMultiDeviceFixture { for (const auto &pmtMapElement : pLinuxSysmanImp->mapOfSubDeviceIdToPmtObject) { delete pmtMapElement.second; } - SysmanMultiDeviceFixture::TearDown(); pLinuxSysmanImp->pFsAccess = pFsAccessOriginal; pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOld; pLinuxSysmanImp->mapOfSubDeviceIdToPmtObject = mapOriginal; + SysmanMultiDeviceFixture::TearDown(); } std::vector getPowerHandles(uint32_t count) { diff --git a/level_zero/tools/test/unit_tests/sources/sysman/power/windows/test_zes_sysman_power.cpp b/level_zero/tools/test/unit_tests/sources/sysman/power/windows/test_zes_sysman_power.cpp index d73cea0484..d456e6b4b5 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/power/windows/test_zes_sysman_power.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/power/windows/test_zes_sysman_power.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2021 Intel Corporation + * Copyright (C) 2020-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -58,8 +58,8 @@ class SysmanDevicePowerFixture : public SysmanDeviceFixture { if (!sysmanUltsEnable) { GTEST_SKIP(); } - SysmanDeviceFixture::TearDown(); pWddmSysmanImp->pKmdSysManager = pOriginalKmdSysManager; + SysmanDeviceFixture::TearDown(); } std::vector get_power_handles(uint32_t count) { diff --git a/level_zero/tools/test/unit_tests/sources/sysman/ras/linux/test_zes_ras.cpp b/level_zero/tools/test/unit_tests/sources/sysman/ras/linux/test_zes_ras.cpp index 855103a6f3..7b34aa457d 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/ras/linux/test_zes_ras.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/ras/linux/test_zes_ras.cpp @@ -49,8 +49,8 @@ struct SysmanRasFixture : public SysmanDeviceFixture { if (!sysmanUltsEnable) { GTEST_SKIP(); } - SysmanDeviceFixture::TearDown(); pLinuxSysmanImp->pFsAccess = pFsAccessOriginal; + SysmanDeviceFixture::TearDown(); } std::vector getRasHandles(uint32_t count) { diff --git a/level_zero/tools/test/unit_tests/sources/sysman/scheduler/linux/test_zes_scheduler.cpp b/level_zero/tools/test/unit_tests/sources/sysman/scheduler/linux/test_zes_scheduler.cpp index e1870fdc53..e7b8f753c6 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/scheduler/linux/test_zes_scheduler.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/scheduler/linux/test_zes_scheduler.cpp @@ -92,8 +92,8 @@ class SysmanDeviceSchedulerFixture : public SysmanDeviceFixture { GTEST_SKIP(); } pSysfsAccess->cleanUpMap(); - SysmanDeviceFixture::TearDown(); pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOld; + SysmanDeviceFixture::TearDown(); } std::vector getSchedHandles(uint32_t count) { diff --git a/level_zero/tools/test/unit_tests/sources/sysman/temperature/linux/test_zes_temperature.cpp b/level_zero/tools/test/unit_tests/sources/sysman/temperature/linux/test_zes_temperature.cpp index 04a99d73fd..047ccd993a 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/temperature/linux/test_zes_temperature.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/temperature/linux/test_zes_temperature.cpp @@ -124,8 +124,8 @@ class SysmanMultiDeviceTemperatureFixture : public SysmanMultiDeviceFixture { if (!sysmanUltsEnable) { GTEST_SKIP(); } - SysmanMultiDeviceFixture::TearDown(); pLinuxSysmanImp->pFsAccess = pFsAccessOriginal; + SysmanMultiDeviceFixture::TearDown(); } std::vector getTempHandles(uint32_t count) { @@ -244,8 +244,8 @@ class SysmanDeviceTemperatureFixture : public SysmanDeviceFixture { if (!sysmanUltsEnable) { GTEST_SKIP(); } - SysmanDeviceFixture::TearDown(); pLinuxSysmanImp->pFsAccess = pFsAccessOriginal; + SysmanDeviceFixture::TearDown(); } std::vector getTempHandles(uint32_t count) { diff --git a/opencl/test/unit_test/execution_environment/execution_environment_tests.cpp b/opencl/test/unit_test/execution_environment/execution_environment_tests.cpp index 07c2f32718..6a65be024a 100644 --- a/opencl/test/unit_test/execution_environment/execution_environment_tests.cpp +++ b/opencl/test/unit_test/execution_environment/execution_environment_tests.cpp @@ -271,6 +271,55 @@ TEST(ExecutionEnvironment, givenMultipleRootDevicesWhenTheyAreCreatedThenReuseMe EXPECT_EQ(memoryManager, device2->getMemoryManager()); } +uint64_t isDriverAvaliableCounter = 0u; + +class DriverModelMock : public DriverModel { + public: + DriverModelMock(DriverModelType driverModelType) : DriverModel(driverModelType) { + } + + bool isDriverAvaliable() override { + isDriverAvaliableCounter++; + return true; + } + void setGmmInputArgs(void *args) override { + } + + uint32_t getDeviceHandle() const override { + return 0; + } + + PhysicalDevicePciBusInfo getPciBusInfo() const override { + return {}; + } + PhyicalDevicePciSpeedInfo getPciSpeedInfo() const override { + return {}; + } + + bool skipResourceCleanup() const { + return skipResourceCleanupVar; + } + + bool isGpuHangDetected(OsContext &osContext) override { + return false; + } +}; + +TEST(ExecutionEnvironment, givenRootDeviceWhenPrepareForCleanupThenIsDriverAvaliableIsCalled) { + VariableBackup varBackup = &isDriverAvaliableCounter; + ExecutionEnvironment *executionEnvironment = platform()->peekExecutionEnvironment(); + + std::unique_ptr osInterface = std::make_unique(); + osInterface->setDriverModel(std::make_unique(DriverModelType::UNKNOWN)); + + executionEnvironment->prepareRootDeviceEnvironments(1); + executionEnvironment->rootDeviceEnvironments[0]->osInterface = std::move(osInterface); + + executionEnvironment->prepareForCleanup(); + + EXPECT_EQ(1u, isDriverAvaliableCounter); +} + TEST(ExecutionEnvironment, givenUnproperSetCsrFlagValueWhenInitializingMemoryManagerThenCreateDefaultMemoryManager) { DebugManagerStateRestore restorer; DebugManager.flags.SetCommandStreamReceiver.set(10); 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 6f6e43e0a8..7ee3c99a16 100644 --- a/opencl/test/unit_test/os_interface/linux/drm_tests.cpp +++ b/opencl/test/unit_test/os_interface/linux/drm_tests.cpp @@ -997,6 +997,7 @@ TEST(DrmTest, whenCheckedIfResourcesCleanupCanBeSkippedThenReturnsFalse) { auto executionEnvironment = std::make_unique(); executionEnvironment->prepareRootDeviceEnvironments(1); DrmMock *pDrm = new DrmMock(*executionEnvironment->rootDeviceEnvironments[0]); + EXPECT_TRUE(pDrm->isDriverAvaliable()); EXPECT_FALSE(pDrm->skipResourceCleanup()); delete pDrm; } diff --git a/opencl/test/unit_test/os_interface/windows/os_context_win_tests.cpp b/opencl/test/unit_test/os_interface/windows/os_context_win_tests.cpp index ad7ceab8af..f1c89c8eb7 100644 --- a/opencl/test/unit_test/os_interface/windows/os_context_win_tests.cpp +++ b/opencl/test/unit_test/os_interface/windows/os_context_win_tests.cpp @@ -83,6 +83,7 @@ struct OsContextWinTestNoCleanup : public WddmTestWithMockGdiDllNoCleanup { TEST_F(OsContextWinTestNoCleanup, givenReinitializeContextWhenContextIsInitThenContextIsNotDestroyed) { osContext = std::make_unique(*osInterface->getDriverModel()->as(), 0u, EngineDescriptorHelper::getDefaultDescriptor(engineTypeUsage, preemptionMode)); + EXPECT_FALSE(this->wddm->isDriverAvaliable()); EXPECT_TRUE(this->wddm->skipResourceCleanup()); EXPECT_NO_THROW(osContext->reInitializeContext()); EXPECT_NO_THROW(osContext->ensureContextInitialized()); diff --git a/shared/source/command_stream/command_stream_receiver.cpp b/shared/source/command_stream/command_stream_receiver.cpp index acc5ee94a7..7d1d5c06fa 100644 --- a/shared/source/command_stream/command_stream_receiver.cpp +++ b/shared/source/command_stream/command_stream_receiver.cpp @@ -173,7 +173,7 @@ void CommandStreamReceiver::makeResidentHostPtrAllocation(GraphicsAllocation *gf WaitStatus CommandStreamReceiver::waitForTaskCount(uint32_t requiredTaskCount) { auto address = getTagAddress(); - if (address) { + if (!skipResourceCleanup() && address) { this->downloadTagAllocation(requiredTaskCount); return baseWaitFunction(address, WaitParams{false, false, 0}, requiredTaskCount); } @@ -268,10 +268,6 @@ bool CommandStreamReceiver::isGpuHangDetected() const { } void CommandStreamReceiver::cleanupResources() { - if (this->skipResourceCleanup()) { - return; - } - waitForTaskCountAndCleanAllocationList(this->latestFlushedTaskCount, TEMPORARY_ALLOCATION); waitForTaskCountAndCleanAllocationList(this->latestFlushedTaskCount, REUSABLE_ALLOCATION); diff --git a/shared/source/device/device.cpp b/shared/source/device/device.cpp index a9e02572c4..d0aa997e0e 100644 --- a/shared/source/device/device.cpp +++ b/shared/source/device/device.cpp @@ -36,12 +36,6 @@ Device::Device(ExecutionEnvironment *executionEnvironment, const uint32_t rootDe } Device::~Device() { - if (false == commandStreamReceivers.empty()) { - if (commandStreamReceivers[0]->skipResourceCleanup()) { - return; - } - } - finalizeRayTracing(); DEBUG_BREAK_IF(nullptr == executionEnvironment->memoryManager.get()); diff --git a/shared/source/execution_environment/execution_environment.cpp b/shared/source/execution_environment/execution_environment.cpp index 832563e3d1..e5371a969a 100644 --- a/shared/source/execution_environment/execution_environment.cpp +++ b/shared/source/execution_environment/execution_environment.cpp @@ -122,6 +122,14 @@ void ExecutionEnvironment::prepareRootDeviceEnvironments(uint32_t numRootDevices } } +void ExecutionEnvironment::prepareForCleanup() const { + for (auto &rootDeviceEnvironment : rootDeviceEnvironments) { + if (rootDeviceEnvironment) { + rootDeviceEnvironment->prepareForCleanup(); + } + } +} + void ExecutionEnvironment::prepareRootDeviceEnvironment(const uint32_t rootDeviceIndexForReInit) { rootDeviceEnvironments[rootDeviceIndexForReInit] = std::make_unique(*this); } diff --git a/shared/source/execution_environment/execution_environment.h b/shared/source/execution_environment/execution_environment.h index ef909caf51..0284e34177 100644 --- a/shared/source/execution_environment/execution_environment.h +++ b/shared/source/execution_environment/execution_environment.h @@ -30,6 +30,7 @@ class ExecutionEnvironment : public ReferenceTrackedObject void sortNeoDevices(); void sortNeoDevicesDRM(); void sortNeoDevicesWDDM(); + void prepareForCleanup() const; void setDebuggingEnabled() { debuggingEnabled = true; } diff --git a/shared/source/execution_environment/root_device_environment.cpp b/shared/source/execution_environment/root_device_environment.cpp index 229e3b33d4..c0af069c51 100644 --- a/shared/source/execution_environment/root_device_environment.cpp +++ b/shared/source/execution_environment/root_device_environment.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2021 Intel Corporation + * Copyright (C) 2019-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -69,6 +69,12 @@ GmmClientContext *RootDeviceEnvironment::getGmmClientContext() const { return gmmHelper->getClientContext(); } +void RootDeviceEnvironment::prepareForCleanup() const { + if (osInterface && osInterface->getDriverModel()) { + osInterface->getDriverModel()->isDriverAvaliable(); + } +} + bool RootDeviceEnvironment::initAilConfiguration() { auto ailConfiguration = AILConfiguration::get(hwInfo->platform.eProductFamily); diff --git a/shared/source/execution_environment/root_device_environment.h b/shared/source/execution_environment/root_device_environment.h index aac6292528..ef6d45eb3c 100644 --- a/shared/source/execution_environment/root_device_environment.h +++ b/shared/source/execution_environment/root_device_environment.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2021 Intel Corporation + * Copyright (C) 2019-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -54,6 +54,7 @@ struct RootDeviceEnvironment { void initOsTime(); void initGmm(); void initDebugger(); + MOCKABLE_VIRTUAL void prepareForCleanup() const; MOCKABLE_VIRTUAL bool initAilConfiguration(); GmmHelper *getGmmHelper() const; GmmClientContext *getGmmClientContext() const; diff --git a/shared/source/os_interface/os_interface.h b/shared/source/os_interface/os_interface.h index 652a6a9341..92f4c6580d 100644 --- a/shared/source/os_interface/os_interface.h +++ b/shared/source/os_interface/os_interface.h @@ -83,14 +83,19 @@ class DriverModel : public NonCopyableClass { return std::numeric_limits::max(); } - virtual bool skipResourceCleanup() const { - return false; + virtual bool isDriverAvaliable() { + return true; + } + + bool skipResourceCleanup() const { + return skipResourceCleanupVar; } virtual bool isGpuHangDetected(OsContext &osContext) = 0; protected: DriverModelType driverModelType; + bool skipResourceCleanupVar = false; }; class OSInterface : public NonCopyableClass { diff --git a/shared/source/os_interface/windows/wddm/skip_resource_cleanup_drm_or_wddm.cpp b/shared/source/os_interface/windows/wddm/skip_resource_cleanup_drm_or_wddm.cpp index 4483acbc6a..36ee7c6a04 100644 --- a/shared/source/os_interface/windows/wddm/skip_resource_cleanup_drm_or_wddm.cpp +++ b/shared/source/os_interface/windows/wddm/skip_resource_cleanup_drm_or_wddm.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 Intel Corporation + * Copyright (C) 2021-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -10,14 +10,42 @@ namespace NEO { -bool Wddm::skipResourceCleanup() const { +NTSTATUS destroyAllocationNoOp(const D3DKMT_DESTROYALLOCATION2 *allocStruct) { + return STATUS_SUCCESS; +} + +NTSTATUS waitForSynchronizationObjectFromCpuNoOp(const D3DKMT_WAITFORSYNCHRONIZATIONOBJECTFROMCPU *waitStruct) { + return STATUS_SUCCESS; +} + +NTSTATUS destroyPagingQueueNoOp(D3DDDI_DESTROYPAGINGQUEUE *destroyPagingQueue) { + return STATUS_SUCCESS; +} + +NTSTATUS destroyDeviceNoOp(const D3DKMT_DESTROYDEVICE *destroyDevice) { + return STATUS_SUCCESS; +} + +NTSTATUS closeAdapterNoOp(const D3DKMT_CLOSEADAPTER *closeAdapter) { + return STATUS_SUCCESS; +} + +bool Wddm::isDriverAvaliable() { D3DKMT_GETDEVICESTATE deviceState = {}; deviceState.hDevice = device; deviceState.StateType = D3DKMT_DEVICESTATE_PRESENT; NTSTATUS status = STATUS_SUCCESS; status = getGdi()->getDeviceState(&deviceState); - return status != STATUS_SUCCESS; + if (status != STATUS_SUCCESS) { + skipResourceCleanupVar = true; + getGdi()->destroyAllocation2 = &destroyAllocationNoOp; + getGdi()->waitForSynchronizationObjectFromCpu = &waitForSynchronizationObjectFromCpuNoOp; + getGdi()->destroyPagingQueue = &destroyPagingQueueNoOp; + getGdi()->destroyDevice = &destroyDeviceNoOp; + getGdi()->closeAdapter = &closeAdapterNoOp; + } + return status == STATUS_SUCCESS; } } // namespace NEO diff --git a/shared/source/os_interface/windows/wddm/skip_resource_cleanup_wddm.cpp b/shared/source/os_interface/windows/wddm/skip_resource_cleanup_wddm.cpp index 701e35df18..3765feddac 100644 --- a/shared/source/os_interface/windows/wddm/skip_resource_cleanup_wddm.cpp +++ b/shared/source/os_interface/windows/wddm/skip_resource_cleanup_wddm.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 Intel Corporation + * Copyright (C) 2021-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -9,8 +9,8 @@ namespace NEO { -bool Wddm::skipResourceCleanup() const { - return false; +bool Wddm::isDriverAvaliable() { + return true; } } // namespace NEO diff --git a/shared/source/os_interface/windows/wddm/wddm.cpp b/shared/source/os_interface/windows/wddm/wddm.cpp index 2be4657db5..31829a3166 100644 --- a/shared/source/os_interface/windows/wddm/wddm.cpp +++ b/shared/source/os_interface/windows/wddm/wddm.cpp @@ -937,14 +937,13 @@ bool Wddm::waitOnGPU(D3DKMT_HANDLE context) { bool Wddm::waitFromCpu(uint64_t lastFenceValue, const MonitoredFence &monitoredFence) { NTSTATUS status = STATUS_SUCCESS; - if (lastFenceValue > *monitoredFence.cpuAddress) { + if (!skipResourceCleanup() && lastFenceValue > *monitoredFence.cpuAddress) { D3DKMT_WAITFORSYNCHRONIZATIONOBJECTFROMCPU waitFromCpu = {}; waitFromCpu.ObjectCount = 1; waitFromCpu.ObjectHandleArray = &monitoredFence.fenceHandle; waitFromCpu.FenceValueArray = &lastFenceValue; waitFromCpu.hDevice = device; waitFromCpu.hAsyncEvent = NULL_HANDLE; - status = getGdi()->waitForSynchronizationObjectFromCpu(&waitFromCpu); DEBUG_BREAK_IF(status != STATUS_SUCCESS); } diff --git a/shared/source/os_interface/windows/wddm/wddm.h b/shared/source/os_interface/windows/wddm/wddm.h index e7bc32d9d6..a032bc1a96 100644 --- a/shared/source/os_interface/windows/wddm/wddm.h +++ b/shared/source/os_interface/windows/wddm/wddm.h @@ -196,7 +196,7 @@ class Wddm : public DriverModel { PhysicalDevicePciBusInfo getPciBusInfo() const override; size_t getMaxMemAllocSize() const override; - bool skipResourceCleanup() const override; + bool isDriverAvaliable() override; static std::vector> discoverDevices(ExecutionEnvironment &executionEnvironment); diff --git a/shared/test/common/os_interface/windows/wddm_fixture.h b/shared/test/common/os_interface/windows/wddm_fixture.h index 0b88acf3c5..d124956720 100644 --- a/shared/test/common/os_interface/windows/wddm_fixture.h +++ b/shared/test/common/os_interface/windows/wddm_fixture.h @@ -99,6 +99,11 @@ struct WddmFixtureWithMockGdiDll : public GdiDllFixture, public MockExecutionEnv }; struct NoCleanupWddmMock : WddmMock { + using WddmMock::WddmMock; + bool isDriverAvaliable() override { + return false; + } + bool skipResourceCleanup() { return true; } @@ -109,7 +114,7 @@ struct WddmFixtureWithMockGdiDllWddmNoCleanup : public GdiDllFixture, public Moc MockExecutionEnvironmentGmmFixture::SetUp(); GdiDllFixture::SetUp(); rootDeviceEnvironment = executionEnvironment->rootDeviceEnvironments[0].get(); - wddm = static_cast(Wddm::createWddm(nullptr, *rootDeviceEnvironment)); + wddm = new NoCleanupWddmMock(*rootDeviceEnvironment); wddmMockInterface = new WddmMockInterface20(*wddm); wddm->wddmInterface.reset(wddmMockInterface); rootDeviceEnvironment->osInterface = std::make_unique(); diff --git a/shared/test/unit_test/compiler_interface/linker_tests.cpp b/shared/test/unit_test/compiler_interface/linker_tests.cpp index fbefd810cf..008be4f51a 100644 --- a/shared/test/unit_test/compiler_interface/linker_tests.cpp +++ b/shared/test/unit_test/compiler_interface/linker_tests.cpp @@ -1361,7 +1361,7 @@ TEST(LinkerTests, givenInvalidRelocationOffsetThenPatchingOfInstructionsFails) { NEO::Linker::ExternalFunctionsT externalFunctions; std::vector instructionSegment; - instructionSegment.resize(relocA.r_offset + sizeof(uintptr_t), 0); + instructionSegment.resize(relocA.r_offset + sizeof(uint64_t), 0); NEO::Linker::PatchableSegment seg0; seg0.hostPointer = instructionSegment.data(); seg0.segmentSize = relocA.r_offset; @@ -1379,7 +1379,7 @@ TEST(LinkerTests, givenInvalidRelocationOffsetThenPatchingOfInstructionsFails) { ASSERT_EQ(1U, unresolvedExternals.size()); EXPECT_TRUE(unresolvedExternals[0].internalError); - patchableInstructionSegments[0].segmentSize = relocA.r_offset + sizeof(uintptr_t); + patchableInstructionSegments[0].segmentSize = relocA.r_offset + sizeof(uint64_t); linkResult = linker.link( globalVarSegment, globalConstSegment, exportedFuncSegment, {}, patchableGlobalVarSeg, patchableConstVarSeg, patchableInstructionSegments, diff --git a/shared/test/unit_test/os_interface/wddm_linux/configure_device_address_space_drm_or_wddm_test.cpp b/shared/test/unit_test/os_interface/wddm_linux/configure_device_address_space_drm_or_wddm_test.cpp index dcfc27c247..4cea467d1f 100644 --- a/shared/test/unit_test/os_interface/wddm_linux/configure_device_address_space_drm_or_wddm_test.cpp +++ b/shared/test/unit_test/os_interface/wddm_linux/configure_device_address_space_drm_or_wddm_test.cpp @@ -643,14 +643,19 @@ TEST_F(WddmLinuxTest, givenRequestFor32bitAllocationWithoutPreexistingHostPtrWhe TEST_F(WddmLinuxTest, whenCheckedIfResourcesCleanupCanBeSkippedAndDeviceIsAliveThenReturnsFalse) { osEnvironment->gdi->getDeviceState = getDeviceStateMock; gdiMockConfig.getDeviceStateClb.returnValue = STATUS_SUCCESS; - EXPECT_FALSE(this->wddm->skipResourceCleanup()); + EXPECT_TRUE(this->wddm->isDriverAvaliable()); EXPECT_EQ(1, gdiMockConfig.getDeviceStateClb.callCount); } TEST_F(WddmLinuxTest, whenCheckedIfResourcesCleanupCanBeSkippedAndDeviceIsLostThenReturnsTrue) { osEnvironment->gdi->getDeviceState = getDeviceStateMock; gdiMockConfig.getDeviceStateClb.returnValue = -1; - EXPECT_TRUE(this->wddm->skipResourceCleanup()); + EXPECT_FALSE(this->wddm->isDriverAvaliable()); + EXPECT_EQ(0, this->wddm->getGdi()->destroyAllocation2(nullptr)); + EXPECT_EQ(0, this->wddm->getGdi()->waitForSynchronizationObjectFromCpu(nullptr)); + EXPECT_EQ(0, this->wddm->getGdi()->destroyPagingQueue(nullptr)); + EXPECT_EQ(0, this->wddm->getGdi()->destroyDevice(nullptr)); + EXPECT_EQ(0, this->wddm->getGdi()->closeAdapter(nullptr)); EXPECT_EQ(1, gdiMockConfig.getDeviceStateClb.callCount); } 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 ff59889bc7..33bc67d07c 100644 --- a/shared/test/unit_test/os_interface/windows/wddm_tests.cpp +++ b/shared/test/unit_test/os_interface/windows/wddm_tests.cpp @@ -72,6 +72,7 @@ TEST_F(WddmTests, givenWddmWhenPassesIncorrectHandleToVerifyNTHandleThenReturnFa TEST_F(WddmTests, whenCheckedIfResourcesCleanupCanBeSkippedThenReturnsFalse) { init(); EXPECT_FALSE(wddm->skipResourceCleanup()); + EXPECT_TRUE(wddm->isDriverAvaliable()); } TEST_F(WddmTests, whenCreatingContextWithPowerHintSuccessIsReturned) { @@ -100,4 +101,98 @@ TEST(WddmPciSpeedInfoTest, WhenGetPciSpeedInfoIsCalledThenUnknownIsReturned) { EXPECT_EQ(-1, speedInfo.maxBandwidth); } +uint64_t waitForSynchronizationObjectFromCpuCounter = 0u; + +NTSTATUS __stdcall waitForSynchronizationObjectFromCpuNoOp(const D3DKMT_WAITFORSYNCHRONIZATIONOBJECTFROMCPU *waitStruct) { + waitForSynchronizationObjectFromCpuCounter++; + return STATUS_SUCCESS; +} + +class WddmSkipResourceCleanupMock : public WddmMock { + public: + using NEO::DriverModel::skipResourceCleanupVar; +}; + +struct WddmSkipResourceCleanupFixtureWithMockGdiDll : public GdiDllFixture, public MockExecutionEnvironmentGmmFixture { + void SetUp() override { + MockExecutionEnvironmentGmmFixture::SetUp(); + GdiDllFixture::SetUp(); + rootDeviceEnvironment = executionEnvironment->rootDeviceEnvironments[0].get(); + wddm = static_cast(Wddm::createWddm(nullptr, *rootDeviceEnvironment)); + wddmMockInterface = new WddmMockInterface20(*wddm); + wddm->wddmInterface.reset(wddmMockInterface); + rootDeviceEnvironment->osInterface = std::make_unique(); + rootDeviceEnvironment->osInterface->setDriverModel(std::unique_ptr(wddm)); + rootDeviceEnvironment->memoryOperationsInterface = std::make_unique(wddm); + osInterface = rootDeviceEnvironment->osInterface.get(); + } + + void init() { + auto preemptionMode = PreemptionHelper::getDefaultPreemptionMode(*defaultHwInfo); + wddmMockInterface = static_cast(wddm->wddmInterface.release()); + wddm->init(); + wddm->wddmInterface.reset(wddmMockInterface); + + auto hwInfo = rootDeviceEnvironment->getHardwareInfo(); + auto engine = HwHelper::get(defaultHwInfo->platform.eRenderCoreFamily).getGpgpuEngineInstances(*hwInfo)[0]; + osContext = std::make_unique(*osInterface->getDriverModel()->as(), 0u, EngineDescriptorHelper::getDefaultDescriptor(engine, preemptionMode)); + osContext->ensureContextInitialized(); + } + + void TearDown() override { + osContext.reset(nullptr); + GdiDllFixture::TearDown(); + MockExecutionEnvironmentGmmFixture::TearDown(); + } + + WddmSkipResourceCleanupMock *wddm = nullptr; + OSInterface *osInterface; + std::unique_ptr osContext; + WddmMockInterface20 *wddmMockInterface = nullptr; + RootDeviceEnvironment *rootDeviceEnvironment = nullptr; +}; + +using WddmSkipResourceCleanupFixtureTests = Test; + +TEST_F(WddmSkipResourceCleanupFixtureTests, givenWaitForSynchronizationObjectFromCpuWhenSkipResourceCleanupIsTrueThenSuccessIsReturnedAndGdiFunctionIsNotCalled) { + VariableBackup varBackup(&waitForSynchronizationObjectFromCpuCounter); + init(); + wddm->skipResourceCleanupVar = true; + EXPECT_TRUE(wddm->skipResourceCleanup()); + wddm->getGdi()->waitForSynchronizationObjectFromCpu = &waitForSynchronizationObjectFromCpuNoOp; + MonitoredFence monitoredFence = {}; + EXPECT_TRUE(wddm->waitFromCpu(0, monitoredFence)); + EXPECT_EQ(0u, waitForSynchronizationObjectFromCpuCounter); +} + +TEST_F(WddmSkipResourceCleanupFixtureTests, givenWaitForSynchronizationObjectFromCpuWhenSkipResourceCleanupIsFalseThenSuccessIsReturnedAndGdiFunctionIsCalled) { + VariableBackup varBackup(&waitForSynchronizationObjectFromCpuCounter); + init(); + wddm->skipResourceCleanupVar = false; + EXPECT_FALSE(wddm->skipResourceCleanup()); + wddm->getGdi()->waitForSynchronizationObjectFromCpu = &waitForSynchronizationObjectFromCpuNoOp; + uint64_t fenceValue = 0u; + D3DKMT_HANDLE fenceHandle = 1u; + MonitoredFence monitoredFence = {}; + monitoredFence.lastSubmittedFence = 1u; + monitoredFence.cpuAddress = &fenceValue; + monitoredFence.fenceHandle = fenceHandle; + EXPECT_TRUE(wddm->waitFromCpu(1u, monitoredFence)); + EXPECT_EQ(1u, waitForSynchronizationObjectFromCpuCounter); +} + +TEST_F(WddmSkipResourceCleanupFixtureTests, givenWaitForSynchronizationObjectFromCpuWhenSkipResourceCleanupIsFalseAndFenceWasNotUpdatedThenSuccessIsReturnedAndGdiFunctionIsNotCalled) { + VariableBackup varBackup(&waitForSynchronizationObjectFromCpuCounter); + init(); + wddm->skipResourceCleanupVar = false; + EXPECT_FALSE(wddm->skipResourceCleanup()); + wddm->getGdi()->waitForSynchronizationObjectFromCpu = &waitForSynchronizationObjectFromCpuNoOp; + uint64_t fenceValue = 1u; + MonitoredFence monitoredFence = {}; + monitoredFence.lastSubmittedFence = 0u; + monitoredFence.cpuAddress = &fenceValue; + EXPECT_TRUE(wddm->waitFromCpu(1u, monitoredFence)); + EXPECT_EQ(0u, waitForSynchronizationObjectFromCpuCounter); +} + } // namespace NEO