diff --git a/level_zero/tools/test/unit_tests/sources/metrics/linux/test_metric_ip_sampling_linux_pvc_prelim.cpp b/level_zero/tools/test/unit_tests/sources/metrics/linux/test_metric_ip_sampling_linux_pvc_prelim.cpp index 0879c34621..0b8c6cb795 100644 --- a/level_zero/tools/test/unit_tests/sources/metrics/linux/test_metric_ip_sampling_linux_pvc_prelim.cpp +++ b/level_zero/tools/test/unit_tests/sources/metrics/linux/test_metric_ip_sampling_linux_pvc_prelim.cpp @@ -44,7 +44,7 @@ class DrmPrelimMock : public DrmMock { &inputHwInfo->workaroundTable, &inputHwInfo->gtSystemInfo, inputHwInfo->capabilityTable); customHwInfo->gtSystemInfo.MaxDualSubSlicesSupported = 64; rootDeviceEnvironment.setHwInfo(customHwInfo.get()); - setupIoctlHelper(rootDeviceEnvironment.getHardwareInfo()->platform.eProductFamily); + this->ioctlHelper = std::make_unique(); if (invokeQueryEngineInfo) { queryEngineInfo(); // NOLINT(clang-analyzer-optin.cplusplus.VirtualCall) } @@ -100,10 +100,6 @@ class DrmPrelimMock : public DrmMock { return true; } - void getPrelimVersion(std::string &prelimVersion) override { - prelimVersion = "2.0"; - } - void setIoctlHelperPrelim20Mock() { backUpIoctlHelper = std::move(ioctlHelper); ioctlHelper = static_cast>(std::make_unique()); diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index fc4dbe6aac..17edc3c347 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -983,10 +983,12 @@ bool Drm::completionFenceSupport() { } void Drm::setupIoctlHelper(const PRODUCT_FAMILY productFamily) { - std::string prelimVersion = ""; - getPrelimVersion(prelimVersion); - auto drmVersion = Drm::getDrmVersion(getFileDescriptor()); - this->ioctlHelper.reset(IoctlHelper::get(productFamily, prelimVersion, drmVersion)); + if (!this->ioctlHelper) { + std::string prelimVersion = ""; + getPrelimVersion(prelimVersion); + auto drmVersion = Drm::getDrmVersion(getFileDescriptor()); + this->ioctlHelper.reset(IoctlHelper::get(productFamily, prelimVersion, drmVersion)); + } } bool Drm::queryTopology(const HardwareInfo &hwInfo, QueryTopologyData &topologyData) { diff --git a/shared/test/common/libult/linux/drm_query_mock.h b/shared/test/common/libult/linux/drm_query_mock.h index c2c5ddc432..600536c88e 100644 --- a/shared/test/common/libult/linux/drm_query_mock.h +++ b/shared/test/common/libult/linux/drm_query_mock.h @@ -27,17 +27,13 @@ class DrmQueryMock : public DrmMock { context.hwInfo = rootDeviceEnvironment.getHardwareInfo(); callBaseIsVmBindAvailable = true; - setupIoctlHelper(IGFX_UNKNOWN); + this->ioctlHelper = std::make_unique(); EXPECT_TRUE(queryMemoryInfo()); EXPECT_EQ(2u + virtualMemoryIds.size(), ioctlCallsCount); ioctlCallsCount = 0; } - void getPrelimVersion(std::string &prelimVersion) override { - prelimVersion = "2.0"; - } - DrmMockPrelimContext context{ nullptr, rootDeviceEnvironment, diff --git a/shared/test/common/os_interface/linux/device_command_stream_fixture_prelim.h b/shared/test/common/os_interface/linux/device_command_stream_fixture_prelim.h index f1733c36c2..6426082c2d 100644 --- a/shared/test/common/os_interface/linux/device_command_stream_fixture_prelim.h +++ b/shared/test/common/os_interface/linux/device_command_stream_fixture_prelim.h @@ -17,11 +17,7 @@ class DrmMockCustomPrelim : public DrmMockCustom { using Drm::memoryInfo; DrmMockCustomPrelim(RootDeviceEnvironment &rootDeviceEnvironment) : DrmMockCustom(rootDeviceEnvironment) { - setupIoctlHelper(IGFX_UNKNOWN); - } - - void getPrelimVersion(std::string &prelimVersion) override { - prelimVersion = "2.0"; + this->ioctlHelper = std::make_unique(); } int ioctlExtra(DrmIoctl request, void *arg) override { diff --git a/shared/test/unit_test/os_interface/linux/drm_mock_impl.h b/shared/test/unit_test/os_interface/linux/drm_mock_impl.h index dcdc2f882b..b76eeb3dd8 100644 --- a/shared/test/unit_test/os_interface/linux/drm_mock_impl.h +++ b/shared/test/unit_test/os_interface/linux/drm_mock_impl.h @@ -20,6 +20,7 @@ class DrmTipMock : public DrmMock { DrmTipMock(RootDeviceEnvironment &rootDeviceEnvironment) : DrmTipMock(rootDeviceEnvironment, defaultHwInfo.get()) {} DrmTipMock(RootDeviceEnvironment &rootDeviceEnvironment, const HardwareInfo *inputHwInfo) : DrmMock(rootDeviceEnvironment) { rootDeviceEnvironment.setHwInfo(inputHwInfo); + ioctlHelper.reset(); setupIoctlHelper(inputHwInfo->platform.eProductFamily); } diff --git a/shared/test/unit_test/os_interface/linux/drm_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_tests.cpp index fe10c18639..caacf69138 100644 --- a/shared/test/unit_test/os_interface/linux/drm_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_tests.cpp @@ -1148,7 +1148,7 @@ TEST(DrmTest, GivenBatchPendingGreaterThanZeroResetStatsWhenIsGpuHangIsCalledThe EXPECT_TRUE(isGpuHangDetected); } -TEST(DrmTest, givenSetupIoctlHelperThenIoctlHelperNotNull) { +TEST(DrmTest, givenSetupIoctlHelperWhenCalledTwiceThenIoctlHelperIsSetOnlyOnce) { auto executionEnvironment = std::make_unique(); executionEnvironment->prepareRootDeviceEnvironments(1); DrmMock drm{*executionEnvironment->rootDeviceEnvironments[0]}; @@ -1159,6 +1159,9 @@ TEST(DrmTest, givenSetupIoctlHelperThenIoctlHelperNotNull) { drm.setupIoctlHelper(productFamily); EXPECT_NE(nullptr, drm.ioctlHelper.get()); + auto ioctlHelper = drm.ioctlHelper.get(); + drm.setupIoctlHelper(productFamily); + EXPECT_EQ(ioctlHelper, drm.ioctlHelper.get()); } TEST(DrmWrapperTest, WhenGettingDrmIoctlGetparamValueThenIoctlHelperIsNotNeeded) { diff --git a/shared/test/unit_test/os_interface/linux/drm_with_prelim_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_with_prelim_tests.cpp index 38826f5ead..d207ea51cf 100644 --- a/shared/test/unit_test/os_interface/linux/drm_with_prelim_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_with_prelim_tests.cpp @@ -46,7 +46,7 @@ class IoctlHelperPrelimFixture : public ::testing::Test { executionEnvironment = std::make_unique(); executionEnvironment->prepareRootDeviceEnvironments(1); drm = std::make_unique(*executionEnvironment->rootDeviceEnvironments[0]); - drm->setupIoctlHelper(executionEnvironment->rootDeviceEnvironments[0]->getHardwareInfo()->platform.eProductFamily); + drm->ioctlHelper = std::make_unique(); } std::unique_ptr executionEnvironment; diff --git a/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp b/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp index 82ed6cfbfb..b2c2abcc0f 100644 --- a/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp +++ b/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp @@ -106,6 +106,11 @@ TEST_F(IoctlPrelimHelperTests, givenPrelimsWhenTranslateToMemoryRegionsThenRetur } } +TEST_F(IoctlPrelimHelperTests, whenCloneIsCalledThenValidPtrIsReturned) { + std::unique_ptr cloned(ioctlHelper.clone()); + EXPECT_NE(nullptr, cloned); +} + TEST_F(IoctlPrelimHelperTests, givenEmptyRegionInstanceClassWhenCreatingVmControlRegionExtThenNullptrIsReturned) { std::optional regionInstanceClass{};