test: Add drm tests for memory and engine query

Signed-off-by: Brandon Yates <brandon.yates@intel.com>
This commit is contained in:
Brandon Yates
2024-07-16 20:41:22 +00:00
committed by Compute-Runtime-Automation
parent 3c51cea04a
commit e59fc42cbe
5 changed files with 143 additions and 40 deletions

View File

@@ -31,7 +31,6 @@ add_executable(igdrcl_${target_name}
${NEO_SHARED_DIRECTORY}/dll/linux/os_interface.cpp
${NEO_SOURCE_DIR}/opencl/source/dll/command_queue_dll.cpp
${NEO_SOURCE_DIR}/opencl/source/os_interface/linux/platform_teardown_linux.cpp
${NEO_SOURCE_DIR}/opencl/test/unit_test/linux${BRANCH_DIR_SUFFIX}drm_other_requests.cpp
)
if(NEO__LIBVA_FOUND)
target_sources(igdrcl_${target_name} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/va_tests.cpp)

View File

@@ -1,10 +0,0 @@
/*
* Copyright (C) 2019-2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include <stdarg.h>
int drmOtherRequests(unsigned long int request, ...) { return 0; }

View File

@@ -767,28 +767,6 @@ TEST_F(DrmTests, givenDrmIsCreatedWhenCreateVirtualMemoryFailsThenReturnVirtualM
::testing::internal::GetCapturedStdout();
}
TEST_F(DrmTests, givenDrmIsCreatedWithPerContextVmRequiredWhenCreateVirtualMemoryThenCapturedVirtualMemoryIsSettingScratchPageOptionCorrectly) {
DebugManagerStateRestore dbgRestorer;
debugManager.flags.PrintDebugMessages.set(true);
debugManager.flags.DisableScratchPages.set(true);
debugManager.flags.GpuFaultCheckThreshold.set(10);
VariableBackup<decltype(captureVirtualMemoryCreate)> backupCaptureVirtualMemoryCreate(&captureVirtualMemoryCreate);
VariableBackup<decltype(capturedVmCreate)> backupCapturedVmCreate(&capturedVmCreate);
captureVirtualMemoryCreate = 1;
capturedVmCreate = {};
auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment);
EXPECT_NE(drm, nullptr);
auto disableScratch = drm.get()->checkToDisableScratchPage();
auto ioctlHelper = drm.get()->getIoctlHelper();
for (auto ctl : capturedVmCreate) {
EXPECT_NE(0u, (ctl.flags & ioctlHelper->getFlagsForVmCreate(disableScratch, false, false)));
}
}
TEST(SysCalls, WhenSysCallsPollCalledThenCallIsRedirectedToOs) {
struct pollfd pollFd;
pollFd.fd = 0;
@@ -960,3 +938,42 @@ TEST_F(DrmTests, givenInValidPciPathThenNothingIsReturned) {
hwDeviceIds = OSInterface::discoverDevices(mockExecutionEnvironment);
EXPECT_TRUE(hwDeviceIds.empty());
}
TEST_F(DrmTests, whenDrmIsCreatedAndQueryEngineInfoFailsThenWarningIsReported) {
DebugManagerStateRestore dbgRestorer;
debugManager.flags.PrintDebugMessages.set(true);
VariableBackup<decltype(DrmQueryConfig::failOnQueryEngineInfo)> backupFailOnFdSetParamEngineMap(&DrmQueryConfig::failOnQueryEngineInfo);
DrmQueryConfig::failOnQueryEngineInfo = true;
::testing::internal::CaptureStderr();
::testing::internal::CaptureStdout();
MockExecutionEnvironment mockExecutionEnvironment;
auto drm = DrmWrap::createDrm(*mockExecutionEnvironment.rootDeviceEnvironments[0]);
EXPECT_NE(drm, nullptr);
std::string errStr = ::testing::internal::GetCapturedStderr();
EXPECT_TRUE(hasSubstr(errStr, std::string("WARNING: Failed to query engine info\n")));
::testing::internal::GetCapturedStdout();
}
TEST_F(DrmTests, whenDrmIsCreatedAndQueryMemoryInfoFailsThenWarningIsReported) {
DebugManagerStateRestore dbgRestorer;
debugManager.flags.PrintDebugMessages.set(true);
debugManager.flags.EnableLocalMemory.set(true);
VariableBackup<decltype(DrmQueryConfig::failOnQueryMemoryInfo)> backupFailOnFdSetParamMemRegionMap(&DrmQueryConfig::failOnQueryMemoryInfo);
DrmQueryConfig::failOnQueryMemoryInfo = true;
::testing::internal::CaptureStderr();
::testing::internal::CaptureStdout();
MockExecutionEnvironment mockExecutionEnvironment;
auto drm = DrmWrap::createDrm(*mockExecutionEnvironment.rootDeviceEnvironments[0]);
EXPECT_NE(drm, nullptr);
std::string errStr = ::testing::internal::GetCapturedStderr();
EXPECT_TRUE(hasSubstr(errStr, std::string("WARNING: Failed to query memory info\n")));
::testing::internal::GetCapturedStdout();
}

View File

@@ -7,10 +7,11 @@
#include "mock_os_layer.h"
#include "shared/source/helpers/basic_math.h"
#include "shared/source/helpers/string.h"
#include "shared/source/os_interface/linux/drm_neo.h"
#include "shared/source/os_interface/linux/drm_wrappers.h"
#include "shared/source/os_interface/linux/i915.h"
#include "shared/source/os_interface/linux/i915_prelim.h"
#include <cassert>
#include <dirent.h>
@@ -272,7 +273,8 @@ int drmQueryItem(NEO::Query *query) {
return failOnEuTotal || failOnSubsliceTotal;
}
}
return drmOtherRequests(DRM_IOCTL_I915_QUERY, query);
return drmQuery(query);
}
int ioctl(int fd, unsigned long int request, ...) throw() {
@@ -323,9 +325,6 @@ int ioctl(int fd, unsigned long int request, ...) throw() {
case DRM_IOCTL_I915_QUERY:
res = drmQueryItem(va_arg(vl, NEO::Query *));
break;
default:
res = drmOtherRequests(request, vl);
break;
}
}
va_end(vl);
@@ -335,3 +334,92 @@ int ioctl(int fd, unsigned long int request, ...) throw() {
va_end(vl);
return -1;
}
namespace DrmQueryConfig {
int failOnQueryEngineInfo = 0;
int failOnQueryMemoryInfo = 0;
unsigned int retrieveQueryMemoryInfoRegionCount = 3;
} // namespace DrmQueryConfig
uint32_t getTileFromEngineOrMemoryInstance(uint16_t instanceValue) {
uint8_t tileMask = (instanceValue >> 8);
return Math::log2(static_cast<uint64_t>(tileMask));
}
uint16_t getEngineOrMemoryInstanceValue(uint16_t tile) {
return ((1 << tile) << 8);
}
int drmQuery(NEO::Query *param) {
auto expectedQueryEngineLength = static_cast<int32_t>(sizeof(drm_i915_query_engine_info) + (sizeof(drm_i915_engine_info) * DrmQueryConfig::retrieveQueryMemoryInfoRegionCount));
assert(param);
int ret = -1;
int32_t requiredLength = 0u;
for (uint32_t i = 0; i < param->numItems; i++) {
auto itemArray = reinterpret_cast<NEO::QueryItem *>(param->itemsPtr);
auto item = &itemArray[i];
switch (item->queryId) {
case DRM_I915_QUERY_ENGINE_INFO:
if (0 == item->length) {
item->length = expectedQueryEngineLength;
} else {
assert(expectedQueryEngineLength == item->length);
auto queryEngineInfo = reinterpret_cast<drm_i915_query_engine_info *>(item->dataPtr);
auto engineInfo = queryEngineInfo->engines;
for (uint32_t i = 0; i < DrmQueryConfig::retrieveQueryMemoryInfoRegionCount; i++) {
engineInfo++->engine = {I915_ENGINE_CLASS_RENDER, getEngineOrMemoryInstanceValue(i)};
}
queryEngineInfo->num_engines = DrmQueryConfig::retrieveQueryMemoryInfoRegionCount;
}
ret = DrmQueryConfig::failOnQueryEngineInfo ? -1 : 0;
break;
case DRM_I915_QUERY_MEMORY_REGIONS:
requiredLength = static_cast<int32_t>(sizeof(drm_i915_query_memory_regions) +
DrmQueryConfig::retrieveQueryMemoryInfoRegionCount * sizeof(drm_i915_memory_region_info));
if (0 == item->length) {
item->length = requiredLength;
} else {
assert(requiredLength == item->length);
auto region = reinterpret_cast<drm_i915_query_memory_regions *>(item->dataPtr);
region->num_regions = DrmQueryConfig::retrieveQueryMemoryInfoRegionCount;
for (uint32_t i = 0; i < DrmQueryConfig::retrieveQueryMemoryInfoRegionCount; i++) {
drm_i915_memory_region_info regionInfo = {};
regionInfo.region.memory_class = (i == 0) ? I915_MEMORY_CLASS_SYSTEM : I915_MEMORY_CLASS_DEVICE;
if (i >= 1) {
regionInfo.region.memory_instance = getEngineOrMemoryInstanceValue(i - 1);
}
region->regions[i] = regionInfo;
}
}
ret = DrmQueryConfig::failOnQueryMemoryInfo ? -1 : 0;
break;
case PRELIM_DRM_I915_QUERY_DISTANCE_INFO:
auto queryDistanceInfo = reinterpret_cast<prelim_drm_i915_query_distance_info *>(item->dataPtr);
switch (queryDistanceInfo->region.memory_class) {
case I915_MEMORY_CLASS_SYSTEM:
queryDistanceInfo->distance = -1;
break;
case I915_MEMORY_CLASS_DEVICE: {
auto engineTile = getTileFromEngineOrMemoryInstance(queryDistanceInfo->engine.engine_instance);
auto memoryTile = getTileFromEngineOrMemoryInstance(queryDistanceInfo->region.memory_instance);
queryDistanceInfo->distance = (memoryTile == engineTile) ? 0 : 100;
break;
}
default:
item->length = -EINVAL;
break;
}
ret = 0;
break;
}
}
return ret;
}

View File

@@ -23,8 +23,6 @@
extern int (*openFunc)(const char *pathname, int flags, ...);
extern int (*openFull)(const char *pathname, int flags, ...);
extern int drmOtherRequests(unsigned long int request, ...);
extern int fakeFd;
extern int haveDri; // index of dri to serve, -1 - none
extern int deviceId; // known DeviceID
@@ -52,3 +50,14 @@ extern int readLinkCalledTimes;
extern int fstatCalledTimes;
extern bool forceExtraIoctlDuration;
extern std::vector<NEO::GemVmControl> capturedVmCreate;
extern int drmQuery(NEO::Query *param);
namespace NEO {
struct Query;
}
namespace DrmQueryConfig {
extern int failOnQueryEngineInfo;
extern int failOnQueryMemoryInfo;
extern unsigned int retrieveQueryMemoryInfoRegionCount;
} // namespace DrmQueryConfig