mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-20 08:53:55 +08:00
Extend waitForBind function
use waitUserFence to wait for fence value move some tests to shared - ioctl helper tests - drm memory info tests - drm cache info Related-To: NEO-6591 Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
6a111e41ff
commit
3467bc0994
@@ -22,7 +22,6 @@ set(IGDRCL_SRCS_tests_os_interface_linux
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_mapper_tests.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}drm_engine_info_tests.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_memory_manager_tests.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}drm_memory_info_tests.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}drm_memory_manager_localmem_tests.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_os_memory_tests.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_residency_handler_tests.cpp
|
||||
@@ -49,27 +48,6 @@ if(NEO__LIBVA_FOUND)
|
||||
)
|
||||
endif()
|
||||
|
||||
if(NEO_ENABLE_i915_PRELIM_DETECTION)
|
||||
list(APPEND IGDRCL_SRCS_tests_os_interface_linux
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_tests_prelim.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/prelim_helper_func.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_cache_info_tests.cpp
|
||||
)
|
||||
|
||||
if(TESTS_DG1 AND "${BRANCH_TYPE}" STREQUAL "")
|
||||
list(APPEND IGDRCL_SRCS_tests_os_interface_linux
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_tests_dg1.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_mock_prod_dg1.h
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if("${BRANCH_TYPE}" STREQUAL "")
|
||||
list(APPEND IGDRCL_SRCS_tests_os_interface_linux
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_tests_upstream.cpp
|
||||
)
|
||||
endif()
|
||||
|
||||
if(TESTS_XEHP_AND_LATER)
|
||||
list(APPEND IGDRCL_SRCS_tests_os_interface_linux
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_command_stream_xehp_and_later_tests.cpp
|
||||
|
||||
@@ -17,11 +17,11 @@
|
||||
#include "shared/test/common/mocks/mock_execution_environment.h"
|
||||
#include "shared/test/common/mocks/mock_gmm.h"
|
||||
#include "shared/test/common/test_macros/test.h"
|
||||
#include "shared/test/unit_test/os_interface/linux/drm_mock_impl.h"
|
||||
|
||||
#include "opencl/test/unit_test/mocks/mock_context.h"
|
||||
#include "opencl/test/unit_test/mocks/mock_platform.h"
|
||||
#include "opencl/test/unit_test/os_interface/linux/drm_memory_manager_tests_impl.h"
|
||||
#include "opencl/test/unit_test/os_interface/linux/drm_mock_impl.h"
|
||||
#include "opencl/test/unit_test/os_interface/linux/drm_mock_memory_info.h"
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
@@ -1297,4 +1297,12 @@ unsigned int Drm::bindDrmContext(uint32_t drmContextId, uint32_t deviceIndex, au
|
||||
return I915_EXEC_DEFAULT;
|
||||
}
|
||||
|
||||
void Drm::waitForBind(uint32_t vmHandleId) {
|
||||
if (pagingFence[vmHandleId] >= fenceVal[vmHandleId]) {
|
||||
return;
|
||||
}
|
||||
auto lock = this->lockBindFenceMutex();
|
||||
waitUserFence(0u, castToUint64(&this->pagingFence[vmHandleId]), this->fenceVal[vmHandleId], ValueWidth::U64, -1, ioctlHelper->getWaitUserFenceSoftFlag());
|
||||
}
|
||||
|
||||
} // namespace NEO
|
||||
|
||||
@@ -47,9 +47,6 @@ int Drm::unbindBufferObject(OsContext *osContext, uint32_t vmHandleId, BufferObj
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Drm::waitForBind(uint32_t vmHandleId) {
|
||||
}
|
||||
|
||||
bool Drm::isVmBindAvailable() {
|
||||
return this->bindAvailable;
|
||||
}
|
||||
|
||||
@@ -82,6 +82,7 @@ class IoctlHelper {
|
||||
virtual std::vector<EngineCapabilities> translateToEngineCaps(const std::vector<uint8_t> &data) = 0;
|
||||
virtual uint32_t queryDistances(Drm *drm, std::vector<drm_i915_query_item> &queryItems, std::vector<DistanceInfo> &distanceInfos) = 0;
|
||||
virtual int32_t getComputeEngineClass() = 0;
|
||||
virtual uint16_t getWaitUserFenceSoftFlag() = 0;
|
||||
virtual int execBuffer(Drm *drm, drm_i915_gem_execbuffer2 *execBuffer, uint64_t completionGpuAddress, uint32_t counterValue) = 0;
|
||||
virtual bool completionFenceExtensionSupported(Drm &drm, const HardwareInfo &hwInfo) = 0;
|
||||
virtual std::optional<int> getHasPageFaultParamId() = 0;
|
||||
@@ -111,6 +112,7 @@ class IoctlHelperUpstream : public IoctlHelper {
|
||||
std::vector<EngineCapabilities> translateToEngineCaps(const std::vector<uint8_t> &data) override;
|
||||
uint32_t queryDistances(Drm *drm, std::vector<drm_i915_query_item> &queryItems, std::vector<DistanceInfo> &distanceInfos) override;
|
||||
int32_t getComputeEngineClass() override;
|
||||
uint16_t getWaitUserFenceSoftFlag() override;
|
||||
int execBuffer(Drm *drm, drm_i915_gem_execbuffer2 *execBuffer, uint64_t completionGpuAddress, uint32_t counterValue) override;
|
||||
bool completionFenceExtensionSupported(Drm &drm, const HardwareInfo &hwInfo) override;
|
||||
std::optional<int> getHasPageFaultParamId() override;
|
||||
@@ -153,6 +155,7 @@ class IoctlHelperPrelim20 : public IoctlHelper {
|
||||
std::vector<EngineCapabilities> translateToEngineCaps(const std::vector<uint8_t> &data) override;
|
||||
uint32_t queryDistances(Drm *drm, std::vector<drm_i915_query_item> &queryItems, std::vector<DistanceInfo> &distanceInfos) override;
|
||||
int32_t getComputeEngineClass() override;
|
||||
uint16_t getWaitUserFenceSoftFlag() override;
|
||||
int execBuffer(Drm *drm, drm_i915_gem_execbuffer2 *execBuffer, uint64_t completionGpuAddress, uint32_t counterValue) override;
|
||||
bool completionFenceExtensionSupported(Drm &drm, const HardwareInfo &hwInfo) override;
|
||||
std::optional<int> getHasPageFaultParamId() override;
|
||||
|
||||
@@ -198,6 +198,10 @@ uint32_t IoctlHelperPrelim20::getComputeSlicesIoctlVal() {
|
||||
return PRELIM_DRM_I915_QUERY_COMPUTE_SLICES;
|
||||
}
|
||||
|
||||
uint16_t IoctlHelperPrelim20::getWaitUserFenceSoftFlag() {
|
||||
return PRELIM_I915_UFENCE_WAIT_SOFT;
|
||||
};
|
||||
|
||||
std::vector<EngineCapabilities> IoctlHelperPrelim20::translateToEngineCaps(const std::vector<uint8_t> &data) {
|
||||
auto engineInfo = reinterpret_cast<const prelim_drm_i915_query_engine_info *>(data.data());
|
||||
std::vector<EngineCapabilities> engines;
|
||||
|
||||
@@ -138,6 +138,10 @@ int32_t IoctlHelperUpstream::getComputeEngineClass() {
|
||||
return 4;
|
||||
}
|
||||
|
||||
uint16_t IoctlHelperUpstream::getWaitUserFenceSoftFlag() {
|
||||
return 0;
|
||||
};
|
||||
|
||||
int IoctlHelperUpstream::execBuffer(Drm *drm, drm_i915_gem_execbuffer2 *execBuffer, uint64_t completionGpuAddress, uint32_t counterValue) {
|
||||
return ioctl(drm, DRM_IOCTL_I915_GEM_EXECBUFFER2, execBuffer);
|
||||
}
|
||||
|
||||
@@ -253,6 +253,10 @@ int DrmMock::ioctl(unsigned long request, void *arg) {
|
||||
return handleRemainingRequests(request, arg);
|
||||
}
|
||||
|
||||
int DrmMock::waitUserFence(uint32_t ctxIdx, uint64_t address, uint64_t value, ValueWidth dataWidth, int64_t timeout, uint16_t flags) {
|
||||
waitUserFenceParams.push_back({ctxIdx, address, value, dataWidth, timeout, flags});
|
||||
return Drm::waitUserFence(ctxIdx, address, value, dataWidth, timeout, flags);
|
||||
}
|
||||
int DrmMockEngine::handleRemainingRequests(unsigned long request, void *arg) {
|
||||
if ((request == DRM_IOCTL_I915_QUERY) && (arg != nullptr)) {
|
||||
if (i915QuerySuccessCount == 0) {
|
||||
|
||||
@@ -32,6 +32,7 @@ class DrmMock : public Drm {
|
||||
using Drm::contextDebugSupported;
|
||||
using Drm::createDrmContextExt;
|
||||
using Drm::engineInfo;
|
||||
using Drm::fenceVal;
|
||||
using Drm::generateElfUUID;
|
||||
using Drm::generateUUID;
|
||||
using Drm::getQueueSliceCount;
|
||||
@@ -39,6 +40,7 @@ class DrmMock : public Drm {
|
||||
using Drm::memoryInfo;
|
||||
using Drm::nonPersistentContextsSupported;
|
||||
using Drm::pageFaultSupported;
|
||||
using Drm::pagingFence;
|
||||
using Drm::preemptionSupported;
|
||||
using Drm::query;
|
||||
using Drm::requirePerContextVM;
|
||||
@@ -70,6 +72,8 @@ class DrmMock : public Drm {
|
||||
return errnoRetVal;
|
||||
}
|
||||
|
||||
int waitUserFence(uint32_t ctxId, uint64_t address, uint64_t value, ValueWidth dataWidth, int64_t timeout, uint16_t flags) override;
|
||||
|
||||
void writeConfigFile(const char *name, int deviceID) {
|
||||
std::ofstream tempfile(name, std::ios::binary);
|
||||
if (tempfile.is_open()) {
|
||||
@@ -209,6 +213,16 @@ class DrmMock : public Drm {
|
||||
uint64_t storedParamSseu = ULONG_MAX;
|
||||
|
||||
virtual int handleRemainingRequests(unsigned long request, void *arg) { return -1; }
|
||||
|
||||
struct WaitUserFenceParams {
|
||||
uint32_t ctxId;
|
||||
uint64_t address;
|
||||
uint64_t value;
|
||||
ValueWidth dataWidth;
|
||||
int64_t timeout;
|
||||
uint16_t flags;
|
||||
};
|
||||
StackVec<WaitUserFenceParams, 1> waitUserFenceParams;
|
||||
};
|
||||
|
||||
class DrmMockNonFailing : public DrmMock {
|
||||
|
||||
@@ -6,17 +6,35 @@
|
||||
|
||||
set(NEO_CORE_OS_INTERFACE_TESTS_LINUX
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_bind_tests.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_command_stream_l0_tests.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}drm_memory_info_tests.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_mock_impl.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}drm_query_tests.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_query_topology_upstream_tests.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_special_heap_test.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/hw_info_config_uuid_tests.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/os_context_linux_tests.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_command_stream_l0_tests.cpp
|
||||
)
|
||||
|
||||
if(NEO_ENABLE_i915_PRELIM_DETECTION)
|
||||
list(APPEND NEO_CORE_OS_INTERFACE_TESTS_LINUX
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_cache_info_tests.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_query_topology_prelim_tests.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_tests_prelim.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/prelim_helper_func.cpp
|
||||
)
|
||||
if(TESTS_DG1 AND "${BRANCH_TYPE}" STREQUAL "")
|
||||
list(APPEND NEO_CORE_OS_INTERFACE_TESTS_LINUX
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_mock_prod_dg1.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_tests_dg1.cpp
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if("${BRANCH_TYPE}" STREQUAL "")
|
||||
list(APPEND NEO_CORE_OS_INTERFACE_TESTS_LINUX
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_tests_upstream.cpp
|
||||
)
|
||||
endif()
|
||||
|
||||
|
||||
55
shared/test/unit_test/os_interface/linux/drm_bind_tests.cpp
Normal file
55
shared/test/unit_test/os_interface/linux/drm_bind_tests.cpp
Normal file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright (C) 2022 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include "shared/source/helpers/ptr_math.h"
|
||||
#include "shared/source/os_interface/linux/os_context_linux.h"
|
||||
#include "shared/test/common/helpers/engine_descriptor_helper.h"
|
||||
#include "shared/test/common/libult/linux/drm_mock.h"
|
||||
#include "shared/test/common/mocks/mock_execution_environment.h"
|
||||
#include "shared/test/common/test_macros/test.h"
|
||||
|
||||
using namespace NEO;
|
||||
|
||||
TEST(DrmBindTest, givenBindAlreadyCompleteWhenWaitForBindThenWaitUserFenceIoctlIsNotCalled) {
|
||||
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
|
||||
DrmMock drm{*executionEnvironment->rootDeviceEnvironments[0]};
|
||||
OsContextLinux osContext(drm, 0u, EngineDescriptorHelper::getDefaultDescriptor());
|
||||
osContext.ensureContextInitialized();
|
||||
|
||||
drm.pagingFence[0] = 31u;
|
||||
drm.fenceVal[0] = 31u;
|
||||
|
||||
drm.waitForBind(0u);
|
||||
|
||||
EXPECT_EQ(0u, drm.waitUserFenceParams.size());
|
||||
|
||||
drm.pagingFence[0] = 49u;
|
||||
drm.fenceVal[0] = 31u;
|
||||
|
||||
drm.waitForBind(0u);
|
||||
|
||||
EXPECT_EQ(0u, drm.waitUserFenceParams.size());
|
||||
}
|
||||
|
||||
TEST(DrmBindTest, givenBindNotCompleteWhenWaitForBindThenWaitUserFenceIoctlIsCalled) {
|
||||
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
|
||||
DrmMock drm{*executionEnvironment->rootDeviceEnvironments[0]};
|
||||
OsContextLinux osContext(drm, 0u, EngineDescriptorHelper::getDefaultDescriptor());
|
||||
osContext.ensureContextInitialized();
|
||||
|
||||
drm.pagingFence[0] = 26u;
|
||||
drm.fenceVal[0] = 31u;
|
||||
|
||||
drm.waitForBind(0u);
|
||||
|
||||
EXPECT_EQ(1u, drm.waitUserFenceParams.size());
|
||||
EXPECT_EQ(0u, drm.waitUserFenceParams[0].ctxId);
|
||||
EXPECT_EQ(castToUint64(&drm.pagingFence[0]), drm.waitUserFenceParams[0].address);
|
||||
EXPECT_EQ(drm.ioctlHelper->getWaitUserFenceSoftFlag(), drm.waitUserFenceParams[0].flags);
|
||||
EXPECT_EQ(drm.fenceVal[0], drm.waitUserFenceParams[0].value);
|
||||
EXPECT_EQ(-1, drm.waitUserFenceParams[0].timeout);
|
||||
}
|
||||
@@ -12,8 +12,6 @@
|
||||
#include "shared/test/common/libult/linux/drm_query_mock.h"
|
||||
#include "shared/test/common/os_interface/linux/drm_mock_cache_info.h"
|
||||
|
||||
#include "opencl/test/unit_test/helpers/gtest_helpers.h"
|
||||
|
||||
#include "gmock/gmock.h"
|
||||
|
||||
using namespace NEO;
|
||||
@@ -11,8 +11,7 @@
|
||||
#include "shared/test/common/helpers/debug_manager_state_restore.h"
|
||||
#include "shared/test/common/helpers/default_hw_info.h"
|
||||
#include "shared/test/common/test_macros/test.h"
|
||||
|
||||
#include "opencl/test/unit_test/os_interface/linux/drm_mock_impl.h"
|
||||
#include "shared/test/unit_test/os_interface/linux/drm_mock_impl.h"
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2020-2021 Intel Corporation
|
||||
* Copyright (C) 2020-2022 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "opencl/test/unit_test/os_interface/linux/drm_mock_impl.h"
|
||||
#include "shared/test/unit_test/os_interface/linux/drm_mock_impl.h"
|
||||
|
||||
namespace PROD_DG1 {
|
||||
#undef DRM_IOCTL_I915_GEM_CREATE_EXT
|
||||
@@ -10,9 +10,7 @@
|
||||
#include "shared/source/os_interface/linux/memory_info.h"
|
||||
#include "shared/test/common/helpers/debug_manager_state_restore.h"
|
||||
#include "shared/test/common/test_macros/test.h"
|
||||
|
||||
#include "opencl/test/unit_test/os_interface/linux/drm_mock_impl.h"
|
||||
#include "opencl/test/unit_test/os_interface/linux/drm_mock_prod_dg1.h"
|
||||
#include "shared/test/unit_test/os_interface/linux/drm_mock_prod_dg1.h"
|
||||
|
||||
using namespace NEO;
|
||||
|
||||
@@ -374,3 +374,9 @@ TEST_F(IoctlHelperPrelimFixture, givenPrelimWhenQueryEngineInfoAndFailIoctlThenF
|
||||
|
||||
EXPECT_EQ(nullptr, engineInfo);
|
||||
}
|
||||
|
||||
TEST_F(IoctlHelperPrelimFixture, givenPrelimsWhenGettingFlagForWaitUserFenceSoftThenProperFlagIsReturned) {
|
||||
auto ioctlHelper = drm->getIoctlHelper();
|
||||
|
||||
EXPECT_EQ((1u << 15), ioctlHelper->getWaitUserFenceSoftFlag());
|
||||
}
|
||||
@@ -10,8 +10,7 @@
|
||||
#include "shared/test/common/helpers/debug_manager_state_restore.h"
|
||||
#include "shared/test/common/helpers/default_hw_info.h"
|
||||
#include "shared/test/common/test_macros/test.h"
|
||||
|
||||
#include "opencl/test/unit_test/os_interface/linux/drm_mock_impl.h"
|
||||
#include "shared/test/unit_test/os_interface/linux/drm_mock_impl.h"
|
||||
|
||||
using namespace NEO;
|
||||
|
||||
Reference in New Issue
Block a user