From 08210f8be5e35873f32033ab5a7aff3e40b2f047 Mon Sep 17 00:00:00 2001 From: Piotr Maciejewski Date: Mon, 29 Mar 2021 12:01:37 +0000 Subject: [PATCH] Fix for Metric Api test that attempts OS (fstat) function. Signed-off-by: Piotr Maciejewski --- .../linux/os_metric_enumeration_imp_linux.cpp | 3 ++- .../linux/test_metric_query_pool_linux.cpp | 23 ++++++++++++++++++- .../test/unit_test/linux/main_linux_dll.cpp | 6 +++++ .../linux/sys_calls_linux_ult.cpp | 4 ++++ shared/source/os_interface/linux/sys_calls.h | 2 ++ .../os_interface/linux/sys_calls_linux.cpp | 6 ++++- 6 files changed, 41 insertions(+), 3 deletions(-) diff --git a/level_zero/tools/source/metrics/linux/os_metric_enumeration_imp_linux.cpp b/level_zero/tools/source/metrics/linux/os_metric_enumeration_imp_linux.cpp index 66790e0e34..f13234e673 100644 --- a/level_zero/tools/source/metrics/linux/os_metric_enumeration_imp_linux.cpp +++ b/level_zero/tools/source/metrics/linux/os_metric_enumeration_imp_linux.cpp @@ -7,6 +7,7 @@ #include "shared/source/os_interface/linux/drm_neo.h" #include "shared/source/os_interface/linux/os_interface.h" +#include "shared/source/os_interface/linux/sys_calls.h" #include "level_zero/tools/source/metrics/metric_enumeration_imp.h" @@ -25,7 +26,7 @@ bool MetricEnumeration::getAdapterId(uint32_t &adapterMajor, uint32_t &adapterMi auto drmFile = drm->getFileDescriptor(); struct stat drmStat = {}; - int32_t result = fstat(drmFile, &drmStat); + int32_t result = NEO::SysCalls::fstat(drmFile, &drmStat); adapterMajor = major(drmStat.st_rdev); adapterMinor = minor(drmStat.st_rdev); diff --git a/level_zero/tools/test/unit_tests/sources/metrics/linux/test_metric_query_pool_linux.cpp b/level_zero/tools/test/unit_tests/sources/metrics/linux/test_metric_query_pool_linux.cpp index 1f10220398..dff8bb1db4 100644 --- a/level_zero/tools/test/unit_tests/sources/metrics/linux/test_metric_query_pool_linux.cpp +++ b/level_zero/tools/test/unit_tests/sources/metrics/linux/test_metric_query_pool_linux.cpp @@ -7,6 +7,7 @@ #include "shared/source/os_interface/device_factory.h" #include "shared/source/os_interface/linux/os_interface.h" +#include "shared/source/os_interface/linux/sys_calls.h" #include "opencl/test/unit_test/os_interface/linux/drm_mock.h" #include "test.h" @@ -19,6 +20,12 @@ using ::testing::_; using ::testing::Return; +namespace NEO { +namespace SysCalls { +extern int fstatFuncRetVal; +} // namespace SysCalls +} // namespace NEO + namespace L0 { namespace ult { @@ -328,11 +335,25 @@ TEST_F(MetricEnumerationTestLinux, givenIcorrectOpenMetricDeviceOnAdapterWhenGet EXPECT_NE(mockMetricEnumeration->openMetricsDiscovery(), ZE_RESULT_SUCCESS); } -TEST_F(MetricEnumerationTestLinux, givenIcorrectDrmFileForFstaWhenGetMetricsAdapterThenReturnFail) { +TEST_F(MetricEnumerationTestLinux, givenCorrectDrmFileForFstatWhenGetMetricsAdapterThenReturnSuccess) { uint32_t drmMajor = 0; uint32_t drmMinor = 0; + VariableBackup fstatBackup(&NEO::SysCalls::fstatFuncRetVal); + NEO::SysCalls::fstatFuncRetVal = 0; + + EXPECT_EQ(mockMetricEnumeration->baseGetAdapterId(drmMajor, drmMinor), true); +} + +TEST_F(MetricEnumerationTestLinux, givenIncorrectDrmFileForFstatWhenGetMetricsAdapterThenReturnFail) { + + uint32_t drmMajor = 0; + uint32_t drmMinor = 0; + + VariableBackup fstatBackup(&NEO::SysCalls::fstatFuncRetVal); + NEO::SysCalls::fstatFuncRetVal = -1; + EXPECT_EQ(mockMetricEnumeration->baseGetAdapterId(drmMajor, drmMinor), false); } diff --git a/opencl/test/unit_test/linux/main_linux_dll.cpp b/opencl/test/unit_test/linux/main_linux_dll.cpp index a935aa5d73..024687691d 100644 --- a/opencl/test/unit_test/linux/main_linux_dll.cpp +++ b/opencl/test/unit_test/linux/main_linux_dll.cpp @@ -544,6 +544,12 @@ TEST(SysCalls, WhenSysCallsPollCalledThenCallIsRedirectedToOs) { EXPECT_EQ(0, result); } +TEST(SysCalls, WhenSysCallsFstatCalledThenCallIsRedirectedToOs) { + struct stat st = {}; + auto result = NEO::SysCalls::fstat(0, &st); + EXPECT_EQ(0, result); +} + int main(int argc, char **argv) { bool useDefaultListener = false; diff --git a/opencl/test/unit_test/os_interface/linux/sys_calls_linux_ult.cpp b/opencl/test/unit_test/os_interface/linux/sys_calls_linux_ult.cpp index 29105c086a..985ea12dfb 100644 --- a/opencl/test/unit_test/os_interface/linux/sys_calls_linux_ult.cpp +++ b/opencl/test/unit_test/os_interface/linux/sys_calls_linux_ult.cpp @@ -37,6 +37,7 @@ int ioctlVmCreateReturned = 0u; uint64_t ioctlVmCreateExtensionArg = 0ull; constexpr unsigned long int invalidIoctl = static_cast(-1); int setErrno = 0; +int fstatFuncRetVal = 0; int close(int fileDescriptor) { closeFuncCalled++; @@ -124,5 +125,8 @@ int poll(struct pollfd *pollFd, unsigned long int numberOfFds, int timeout) { return 0; } +int fstat(int fd, struct stat *buf) { + return fstatFuncRetVal; +} } // namespace SysCalls } // namespace NEO diff --git a/shared/source/os_interface/linux/sys_calls.h b/shared/source/os_interface/linux/sys_calls.h index c3cf1aa721..1ecf38292e 100644 --- a/shared/source/os_interface/linux/sys_calls.h +++ b/shared/source/os_interface/linux/sys_calls.h @@ -8,6 +8,7 @@ #pragma once #include #include +#include namespace NEO { namespace SysCalls { @@ -19,5 +20,6 @@ int getDevicePath(int deviceFd, char *buf, size_t &bufSize); int access(const char *pathname, int mode); int readlink(const char *path, char *buf, size_t bufsize); int poll(struct pollfd *pollFd, unsigned long int numberOfFds, int timeout); +int fstat(int fd, struct stat *buf); } // namespace SysCalls } // namespace NEO diff --git a/shared/source/os_interface/linux/sys_calls_linux.cpp b/shared/source/os_interface/linux/sys_calls_linux.cpp index 0d84a2eb8f..4b70cc92fe 100644 --- a/shared/source/os_interface/linux/sys_calls_linux.cpp +++ b/shared/source/os_interface/linux/sys_calls_linux.cpp @@ -43,7 +43,7 @@ int readlink(const char *path, char *buf, size_t bufsize) { int getDevicePath(int deviceFd, char *buf, size_t &bufSize) { struct stat st; - if (fstat(deviceFd, &st)) { + if (::fstat(deviceFd, &st)) { return -1; } @@ -56,5 +56,9 @@ int getDevicePath(int deviceFd, char *buf, size_t &bufSize) { int poll(struct pollfd *pollFd, unsigned long int numberOfFds, int timeout) { return ::poll(pollFd, numberOfFds, timeout); } + +int fstat(int fd, struct stat *buf) { + return ::fstat(fd, buf); +} } // namespace SysCalls } // namespace NEO