From f6dae5ecf2ad7b3d5881d4f9c663104d827bdfaf Mon Sep 17 00:00:00 2001 From: Krzysztof Gibala Date: Mon, 25 Apr 2022 10:56:11 +0000 Subject: [PATCH] Test: Refactor ioctl mock call to be more deterministic Add flag forceExtraIoctlDuration for controlling duration in ioctl ULT call. Related-To: NEO-6537 Signed-off-by: Krzysztof Gibala --- opencl/test/unit_test/linux/main_linux_dll.cpp | 17 ++++------------- opencl/test/unit_test/linux/mock_os_layer.cpp | 14 +++++++++++++- opencl/test/unit_test/linux/mock_os_layer.h | 3 ++- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/opencl/test/unit_test/linux/main_linux_dll.cpp b/opencl/test/unit_test/linux/main_linux_dll.cpp index eaf200270c..9948098ddc 100644 --- a/opencl/test/unit_test/linux/main_linux_dll.cpp +++ b/opencl/test/unit_test/linux/main_linux_dll.cpp @@ -256,21 +256,10 @@ TEST_F(DrmFailedIoctlTests, givenPrintIoctlEntriesWhenCallFailedIoctlThenExpecte TEST_F(DrmSimpleTests, givenPrintIoctlTimesWhenCallIoctlThenStatisticsAreGathered) { struct DrmMock : public Drm { using Drm::ioctlStatistics; - - int ioctl(unsigned long request, void *arg) override { - auto start = std::chrono::steady_clock::now(); - std::chrono::steady_clock::time_point end; - - do { - end = std::chrono::steady_clock::now(); - } while (std::chrono::duration_cast(end - start).count() == 0); - - return Drm::ioctl(request, arg); - } }; constexpr long long initialMin = std::numeric_limits::max(); - constexpr long long initialMax = 0; + constexpr long long initialMax = std::numeric_limits::min(); auto executionEnvironment = std::make_unique(); executionEnvironment->prepareRootDeviceEnvironments(1); @@ -278,6 +267,7 @@ TEST_F(DrmSimpleTests, givenPrintIoctlTimesWhenCallIoctlThenStatisticsAreGathere DebugManagerStateRestore restorer; DebugManager.flags.PrintIoctlTimes.set(true); + VariableBackup backupForceExtraIoctlDuration(&forceExtraIoctlDuration, true); EXPECT_TRUE(drm->ioctlStatistics.empty()); @@ -299,7 +289,8 @@ TEST_F(DrmSimpleTests, givenPrintIoctlTimesWhenCallIoctlThenStatisticsAreGathere EXPECT_EQ(2u, euTotalData->second.count); EXPECT_NE(0, euTotalData->second.totalTime); EXPECT_NE(initialMin, euTotalData->second.minTime); - EXPECT_NE(initialMax, euTotalData->second.minTime); + EXPECT_LE(euTotalData->second.minTime, euTotalData->second.maxTime); + EXPECT_LE(initialMax, euTotalData->second.minTime); EXPECT_NE(initialMin, euTotalData->second.maxTime); EXPECT_NE(initialMax, euTotalData->second.maxTime); auto firstTime = euTotalData->second.totalTime; diff --git a/opencl/test/unit_test/linux/mock_os_layer.cpp b/opencl/test/unit_test/linux/mock_os_layer.cpp index 2e2be5f13d..4a3d357ea5 100644 --- a/opencl/test/unit_test/linux/mock_os_layer.cpp +++ b/opencl/test/unit_test/linux/mock_os_layer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2021 Intel Corporation + * Copyright (C) 2018-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -42,6 +42,7 @@ int failOnDrmVersion = 0; int accessCalledTimes = 0; int readLinkCalledTimes = 0; int fstatCalledTimes = 0; +bool forceExtraIoctlDuration = 0; char providedDrmVersion[5] = {'i', '9', '1', '5', '\0'}; uint64_t gpuTimestamp = 0; int ioctlSeq[8] = {0, 0, 0, 0, 0, 0, 0, 0}; @@ -270,6 +271,17 @@ int drmQueryItem(drm_i915_query *query) { } int ioctl(int fd, unsigned long int request, ...) throw() { + using namespace std::chrono_literals; + + if (forceExtraIoctlDuration) { + auto start = std::chrono::steady_clock::now(); + std::chrono::steady_clock::time_point end; + + do { + end = std::chrono::steady_clock::now(); + } while ((end - start) == 0ns); + } + int res; va_list vl; va_start(vl, request); diff --git a/opencl/test/unit_test/linux/mock_os_layer.h b/opencl/test/unit_test/linux/mock_os_layer.h index b18da47910..5bd8711399 100644 --- a/opencl/test/unit_test/linux/mock_os_layer.h +++ b/opencl/test/unit_test/linux/mock_os_layer.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2021 Intel Corporation + * Copyright (C) 2018-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -49,3 +49,4 @@ extern uint32_t entryIndex; extern int accessCalledTimes; extern int readLinkCalledTimes; extern int fstatCalledTimes; +extern bool forceExtraIoctlDuration;