diff --git a/level_zero/core/test/unit_tests/sources/driver/linux/test_driver_handle_imp_linux.cpp b/level_zero/core/test/unit_tests/sources/driver/linux/test_driver_handle_imp_linux.cpp index 3d5dd1b3b9..4c13358b49 100644 --- a/level_zero/core/test/unit_tests/sources/driver/linux/test_driver_handle_imp_linux.cpp +++ b/level_zero/core/test/unit_tests/sources/driver/linux/test_driver_handle_imp_linux.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2021 Intel Corporation + * Copyright (C) 2020-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -7,6 +7,7 @@ #include "shared/source/execution_environment/root_device_environment.h" #include "shared/source/os_interface/device_factory.h" +#include "shared/source/os_interface/linux/drm_memory_operations_handler_bind.h" #include "shared/source/os_interface/linux/drm_neo.h" #include "shared/source/os_interface/os_interface.h" #include "shared/test/common/mocks/mock_compilers.h" @@ -37,6 +38,9 @@ class DriverLinuxFixture : public ::testing::Test { for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { executionEnvironment->rootDeviceEnvironments[i]->setHwInfo(&hwInfo); } + for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { + executionEnvironment->rootDeviceEnvironments[i]->memoryOperationsInterface = std::make_unique(*executionEnvironment->rootDeviceEnvironments[i], i); + } deviceFactory = std::make_unique(numRootDevices, numSubDevices, *executionEnvironment); for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { devices.push_back(std::unique_ptr(deviceFactory->rootDevices[i])); @@ -47,6 +51,11 @@ class DriverLinuxFixture : public ::testing::Test { osInterface->setDriverModel(std::make_unique(bdf[i], const_cast(devices[i]->getRootDeviceEnvironment()))); } executionEnvironment->sortNeoDevices(); + + for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { + NEO::DrmMemoryOperationsHandlerBind *drm = static_cast(executionEnvironment->rootDeviceEnvironments[i]->memoryOperationsInterface.get()); + EXPECT_EQ(drm->getRootDeviceIndex(), i); + } } void TearDown() override {} @@ -131,6 +140,9 @@ class DriverPciOrderWitSimilarBusLinuxFixture : public ::testing::Test { for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { executionEnvironment->rootDeviceEnvironments[i]->setHwInfo(&hwInfo); } + for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { + executionEnvironment->rootDeviceEnvironments[i]->memoryOperationsInterface = std::make_unique(*executionEnvironment->rootDeviceEnvironments[i], i); + } deviceFactory = std::make_unique(numRootDevices, numSubDevices, *executionEnvironment); for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { devices.push_back(std::unique_ptr(deviceFactory->rootDevices[i])); @@ -141,6 +153,11 @@ class DriverPciOrderWitSimilarBusLinuxFixture : public ::testing::Test { osInterface->setDriverModel(std::make_unique(bdf[i], const_cast(devices[i]->getRootDeviceEnvironment()))); } executionEnvironment->sortNeoDevices(); + + for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { + NEO::DrmMemoryOperationsHandlerBind *drm = static_cast(executionEnvironment->rootDeviceEnvironments[i]->memoryOperationsInterface.get()); + EXPECT_EQ(drm->getRootDeviceIndex(), i); + } } void TearDown() override {} @@ -182,6 +199,9 @@ class DriverPciOrderWitDifferentDeviceLinuxFixture : public ::testing::Test { for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { executionEnvironment->rootDeviceEnvironments[i]->setHwInfo(&hwInfo); } + for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { + executionEnvironment->rootDeviceEnvironments[i]->memoryOperationsInterface = std::make_unique(*executionEnvironment->rootDeviceEnvironments[i], i); + } deviceFactory = std::make_unique(numRootDevices, numSubDevices, *executionEnvironment); for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { devices.push_back(std::unique_ptr(deviceFactory->rootDevices[i])); @@ -192,6 +212,11 @@ class DriverPciOrderWitDifferentDeviceLinuxFixture : public ::testing::Test { osInterface->setDriverModel(std::make_unique(bdf[i], const_cast(devices[i]->getRootDeviceEnvironment()))); } executionEnvironment->sortNeoDevices(); + + for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { + NEO::DrmMemoryOperationsHandlerBind *drm = static_cast(executionEnvironment->rootDeviceEnvironments[i]->memoryOperationsInterface.get()); + EXPECT_EQ(drm->getRootDeviceIndex(), i); + } } void TearDown() override {} @@ -233,6 +258,9 @@ class DriverPciOrderWitSimilarBusAndDeviceLinuxFixture : public ::testing::Test for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { executionEnvironment->rootDeviceEnvironments[i]->setHwInfo(&hwInfo); } + for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { + executionEnvironment->rootDeviceEnvironments[i]->memoryOperationsInterface = std::make_unique(*executionEnvironment->rootDeviceEnvironments[i], i); + } deviceFactory = std::make_unique(numRootDevices, numSubDevices, *executionEnvironment); for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { devices.push_back(std::unique_ptr(deviceFactory->rootDevices[i])); @@ -243,6 +271,11 @@ class DriverPciOrderWitSimilarBusAndDeviceLinuxFixture : public ::testing::Test osInterface->setDriverModel(std::make_unique(bdf[i], const_cast(devices[i]->getRootDeviceEnvironment()))); } executionEnvironment->sortNeoDevices(); + + for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { + NEO::DrmMemoryOperationsHandlerBind *drm = static_cast(executionEnvironment->rootDeviceEnvironments[i]->memoryOperationsInterface.get()); + EXPECT_EQ(drm->getRootDeviceIndex(), i); + } } void TearDown() override {} @@ -284,6 +317,9 @@ class DriverPciOrderWitSimilarBDFLinuxFixture : public ::testing::Test { for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { executionEnvironment->rootDeviceEnvironments[i]->setHwInfo(&hwInfo); } + for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { + executionEnvironment->rootDeviceEnvironments[i]->memoryOperationsInterface = std::make_unique(*executionEnvironment->rootDeviceEnvironments[i], i); + } deviceFactory = std::make_unique(numRootDevices, numSubDevices, *executionEnvironment); for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { devices.push_back(std::unique_ptr(deviceFactory->rootDevices[i])); @@ -294,6 +330,11 @@ class DriverPciOrderWitSimilarBDFLinuxFixture : public ::testing::Test { osInterface->setDriverModel(std::make_unique(bdf[i], const_cast(devices[i]->getRootDeviceEnvironment()))); } executionEnvironment->sortNeoDevices(); + + for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { + NEO::DrmMemoryOperationsHandlerBind *drm = static_cast(executionEnvironment->rootDeviceEnvironments[i]->memoryOperationsInterface.get()); + EXPECT_EQ(drm->getRootDeviceIndex(), i); + } } void TearDown() override {} @@ -322,5 +363,64 @@ TEST_F(DriverPciOrderWitSimilarBDFLinuxFixture, GivenEnvironmentVariableForDevic delete driverHandle; } +class DriverPciOrderSortDoesNothing : public ::testing::Test { + public: + void SetUp() override { + DebugManagerStateRestore restorer; + DebugManager.flags.ZE_ENABLE_PCI_ID_DEVICE_ORDER.set(1); + + NEO::MockCompilerEnableGuard mock(true); + auto executionEnvironment = new NEO::ExecutionEnvironment(); + executionEnvironment->prepareRootDeviceEnvironments(numRootDevices); + NEO::HardwareInfo hwInfo = *NEO::defaultHwInfo.get(); + for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { + executionEnvironment->rootDeviceEnvironments[i]->setHwInfo(&hwInfo); + } + for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { + executionEnvironment->rootDeviceEnvironments[i]->memoryOperationsInterface = std::make_unique(*executionEnvironment->rootDeviceEnvironments[i], i); + } + deviceFactory = std::make_unique(numRootDevices, numSubDevices, *executionEnvironment); + for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { + devices.push_back(std::unique_ptr(deviceFactory->rootDevices[i])); + } + for (auto i = 0u; i < devices.size(); i++) { + devices[i]->getExecutionEnvironment()->rootDeviceEnvironments[i]->osInterface = std::make_unique(); + auto osInterface = devices[i]->getExecutionEnvironment()->rootDeviceEnvironments[i]->osInterface.get(); + osInterface->setDriverModel(std::make_unique(bdf[i], const_cast(devices[i]->getRootDeviceEnvironment()))); + } + executionEnvironment->sortNeoDevices(); + + for (auto i = 0u; i < executionEnvironment->rootDeviceEnvironments.size(); i++) { + NEO::DrmMemoryOperationsHandlerBind *drm = static_cast(executionEnvironment->rootDeviceEnvironments[i]->memoryOperationsInterface.get()); + EXPECT_EQ(drm->getRootDeviceIndex(), i); + } + } + void TearDown() override {} + + static constexpr uint32_t numRootDevices = 2u; + static constexpr uint32_t numSubDevices = 2u; + std::vector> devices; + std::string bdf[numRootDevices] = {"0000:03:04.0", "0001:03:04.0"}; + std::string sortedBdf[numRootDevices] = {"0000:03:04.0", "0001:03:04.0"}; + std::unique_ptr deviceFactory; +}; + +TEST_F(DriverPciOrderSortDoesNothing, GivenEnvironmentVariableForDeviceOrderAccordingToPciSetThenVerifyCaseSortDoesNothing) { + NEO::MockCompilerEnableGuard mock(true); + DriverHandleImp *driverHandle = new DriverHandleImp; + + EXPECT_EQ(ZE_RESULT_SUCCESS, driverHandle->initialize(std::move(devices))); + + for (uint32_t i = 0; i < numRootDevices; i++) { + auto L0Device = driverHandle->devices[i]; + if (L0Device != nullptr) { + auto pDrm = L0Device->getNEODevice()->getExecutionEnvironment()->rootDeviceEnvironments[L0Device->getRootDeviceIndex()]->osInterface->getDriverModel()->as(); + EXPECT_NE(pDrm, nullptr); + EXPECT_TRUE(!pDrm->getPciPath().compare(sortedBdf[i])); + } + } + delete driverHandle; +} + } // namespace ult } // namespace L0 diff --git a/shared/source/execution_environment/linux/execution_environment_linux.cpp b/shared/source/execution_environment/linux/execution_environment_linux.cpp index dc7e97c786..9b319e9fa9 100644 --- a/shared/source/execution_environment/linux/execution_environment_linux.cpp +++ b/shared/source/execution_environment/linux/execution_environment_linux.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 Intel Corporation + * Copyright (C) 2021-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -8,6 +8,7 @@ #include "shared/source/debug_settings/debug_settings_manager.h" #include "shared/source/execution_environment/execution_environment.h" #include "shared/source/execution_environment/root_device_environment.h" +#include "shared/source/os_interface/linux/drm_memory_operations_handler_bind.h" #include "shared/source/os_interface/linux/drm_neo.h" #include "shared/source/os_interface/os_interface.h" @@ -43,7 +44,21 @@ bool comparePciIdBusNumber(std::unique_ptr &rootDeviceEnv void ExecutionEnvironment::sortNeoDevices() { const auto pciOrderVar = DebugManager.flags.ZE_ENABLE_PCI_ID_DEVICE_ORDER.get(); if (pciOrderVar) { + + std::vector presort_index; + for (uint32_t i = 0; i < rootDeviceEnvironments.size(); i++) { + NEO::DrmMemoryOperationsHandlerBind *drm = static_cast(rootDeviceEnvironments[i]->memoryOperationsInterface.get()); + presort_index.push_back(drm->getRootDeviceIndex()); + } + std::sort(rootDeviceEnvironments.begin(), rootDeviceEnvironments.end(), comparePciIdBusNumber); + + for (uint32_t i = 0; i < rootDeviceEnvironments.size(); i++) { + NEO::DrmMemoryOperationsHandlerBind *drm = static_cast(rootDeviceEnvironments[i]->memoryOperationsInterface.get()); + if (drm->getRootDeviceIndex() != presort_index[i]) { + drm->setRootDeviceIndex(presort_index[i]); + } + } } } diff --git a/shared/source/os_interface/linux/drm_memory_operations_handler_bind.h b/shared/source/os_interface/linux/drm_memory_operations_handler_bind.h index 35969c42ce..eb3b2d4893 100644 --- a/shared/source/os_interface/linux/drm_memory_operations_handler_bind.h +++ b/shared/source/os_interface/linux/drm_memory_operations_handler_bind.h @@ -26,6 +26,12 @@ class DrmMemoryOperationsHandlerBind : public DrmMemoryOperationsHandler { std::unique_lock lockHandlerIfUsed() override; MemoryOperationsStatus evictUnusedAllocations(bool waitForCompletion, bool isLockNeeded) override; + uint32_t getRootDeviceIndex() { + return this->rootDeviceIndex; + } + void setRootDeviceIndex(uint32_t index) { + this->rootDeviceIndex = index; + } protected: MOCKABLE_VIRTUAL int evictImpl(OsContext *osContext, GraphicsAllocation &gfxAllocation, DeviceBitfield deviceBitfield);