mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-15 13:01:45 +08:00
Test local memory DRM allocations
Signed-off-by: Daniel Chabrowski daniel.chabrowski@intel.com Related-To: NEO-6591
This commit is contained in:

committed by
Compute-Runtime-Automation

parent
50efd09ad8
commit
090a79f3f9
@ -18,7 +18,6 @@ set(IGDRCL_SRCS_tests_os_interface_linux
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_gem_close_worker_tests.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_mapper_tests.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_memory_manager_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
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_system_info_tests.cpp
|
||||
@ -38,6 +37,12 @@ set(IGDRCL_SRCS_tests_os_interface_linux
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/self_lib_lin.cpp
|
||||
)
|
||||
|
||||
if("${BRANCH_TYPE}" STREQUAL "")
|
||||
list(APPEND IGDRCL_SRCS_tests_os_interface_linux
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drm_memory_manager_localmem_upstream_tests.cpp
|
||||
)
|
||||
endif()
|
||||
|
||||
if(NEO_ENABLE_i915_PRELIM_DETECTION)
|
||||
list(APPEND IGDRCL_SRCS_tests_os_interface_linux
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/device_command_stream_fixture_context.cpp
|
||||
|
@ -1,11 +1,12 @@
|
||||
/*
|
||||
* Copyright (C) 2020-2021 Intel Corporation
|
||||
* Copyright (C) 2020-2022 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include "shared/source/os_interface/linux/ioctl_strings.h"
|
||||
#include "shared/test/common/os_interface/linux/device_command_stream_fixture.h"
|
||||
|
||||
class DrmMockCustomImpl : public DrmMockCustom {
|
||||
@ -49,7 +50,7 @@ class DrmMockCustomImpl : public DrmMockCustom {
|
||||
ioctlImpl_cnt.gemCreateExt++;
|
||||
} break;
|
||||
default: {
|
||||
std::cout << "unexpected IOCTL: " << std::hex << request << std::endl;
|
||||
std::cout << "unexpected IOCTL: " << NEO::IoctlToStringHelper::getIoctlString(request) << std::endl;
|
||||
UNRECOVERABLE_IF(true);
|
||||
} break;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -49,14 +49,6 @@ class DrmMemoryManagerLocalMemoryTest : public ::testing::Test {
|
||||
memoryManager = std::make_unique<TestedDrmMemoryManager>(localMemoryEnabled, false, false, *executionEnvironment);
|
||||
}
|
||||
|
||||
bool isAllocationWithinHeap(const GraphicsAllocation &allocation, HeapIndex heap) {
|
||||
const auto allocationStart = allocation.getGpuAddress();
|
||||
const auto allocationEnd = allocationStart + allocation.getUnderlyingBufferSize();
|
||||
const auto heapStart = GmmHelper::canonize(memoryManager->getGfxPartition(rootDeviceIndex)->getHeapBase(heap));
|
||||
const auto heapEnd = GmmHelper::canonize(memoryManager->getGfxPartition(rootDeviceIndex)->getHeapLimit(heap));
|
||||
return heapStart <= allocationStart && allocationEnd <= heapEnd;
|
||||
}
|
||||
|
||||
protected:
|
||||
DebugManagerStateRestore restorer{};
|
||||
ExecutionEnvironment *executionEnvironment = nullptr;
|
@ -10,9 +10,11 @@
|
||||
#include "shared/source/execution_environment/execution_environment.h"
|
||||
#include "shared/source/os_interface/linux/drm_memory_operations_handler.h"
|
||||
#include "shared/test/common/helpers/debug_manager_state_restore.h"
|
||||
#include "shared/test/common/libult/linux/drm_mock_helper.h"
|
||||
#include "shared/test/common/libult/linux/drm_query_mock.h"
|
||||
#include "shared/test/common/mocks/linux/mock_drm_memory_manager.h"
|
||||
#include "shared/test/common/mocks/mock_device.h"
|
||||
#include "shared/test/common/os_interface/linux/drm_memory_manager_tests.h"
|
||||
|
||||
#include "opencl/test/unit_test/os_interface/linux/device_command_stream_fixture_prelim.h"
|
||||
#include "opencl/test/unit_test/os_interface/linux/drm_mock_memory_info.h"
|
||||
@ -21,31 +23,42 @@
|
||||
|
||||
class DrmMemoryManagerLocalMemoryPrelimTest : public ::testing::Test {
|
||||
public:
|
||||
DrmQueryMock *mock;
|
||||
|
||||
void SetUp() override {
|
||||
executionEnvironment = new ExecutionEnvironment;
|
||||
DebugManager.flags.EnableLocalMemory.set(localMemoryEnabled);
|
||||
|
||||
executionEnvironment = new ExecutionEnvironment();
|
||||
executionEnvironment->prepareRootDeviceEnvironments(1);
|
||||
executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->setHwInfo(defaultHwInfo.get());
|
||||
|
||||
mock = new DrmQueryMock(*executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]);
|
||||
mock->memoryInfo.reset(new MockExtendedMemoryInfo());
|
||||
auto memoryInfo = new MockExtendedMemoryInfo();
|
||||
mock->memoryInfo.reset(memoryInfo);
|
||||
|
||||
auto &multiTileArchInfo = executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->getMutableHardwareInfo()->gtSystemInfo.MultiTileArchInfo;
|
||||
multiTileArchInfo.TileCount = (memoryInfo->getDrmRegionInfos().size() - 1);
|
||||
multiTileArchInfo.IsValid = (multiTileArchInfo.TileCount > 0);
|
||||
|
||||
mock->queryEngineInfo();
|
||||
|
||||
executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->osInterface = std::make_unique<OSInterface>();
|
||||
executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(mock));
|
||||
executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->memoryOperationsInterface = DrmMemoryOperationsHandler::create(*mock, 0u);
|
||||
|
||||
memoryManager = new TestedDrmMemoryManager(localMemoryEnabled, false, false, *executionEnvironment);
|
||||
executionEnvironment->memoryManager.reset(memoryManager);
|
||||
|
||||
device.reset(MockDevice::createWithExecutionEnvironment<MockDevice>(defaultHwInfo.get(), executionEnvironment, rootDeviceIndex));
|
||||
constexpr bool localMemoryEnabled = true;
|
||||
memoryManager = std::make_unique<TestedDrmMemoryManager>(localMemoryEnabled, false, false, *executionEnvironment);
|
||||
}
|
||||
|
||||
protected:
|
||||
DebugManagerStateRestore restorer{};
|
||||
ExecutionEnvironment *executionEnvironment;
|
||||
ExecutionEnvironment *executionEnvironment{nullptr};
|
||||
DrmQueryMock *mock{nullptr};
|
||||
std::unique_ptr<MockDevice> device;
|
||||
std::unique_ptr<TestedDrmMemoryManager> memoryManager;
|
||||
const uint32_t rootDeviceIndex = 0u;
|
||||
TestedDrmMemoryManager *memoryManager{nullptr};
|
||||
|
||||
constexpr static uint32_t rootDeviceIndex{0u};
|
||||
constexpr static bool localMemoryEnabled{true};
|
||||
};
|
||||
|
||||
class DrmMemoryManagerLocalMemoryWithCustomPrelimMockTest : public ::testing::Test {
|
||||
@ -55,6 +68,7 @@ class DrmMemoryManagerLocalMemoryWithCustomPrelimMockTest : public ::testing::Te
|
||||
executionEnvironment = new ExecutionEnvironment;
|
||||
executionEnvironment->prepareRootDeviceEnvironments(1);
|
||||
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
|
||||
|
||||
mock = new DrmMockCustomPrelim(*executionEnvironment->rootDeviceEnvironments[0]);
|
||||
executionEnvironment->rootDeviceEnvironments[0]->osInterface = std::make_unique<OSInterface>();
|
||||
executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(mock));
|
||||
@ -69,3 +83,27 @@ class DrmMemoryManagerLocalMemoryWithCustomPrelimMockTest : public ::testing::Te
|
||||
DrmMockCustomPrelim *mock;
|
||||
ExecutionEnvironment *executionEnvironment;
|
||||
};
|
||||
|
||||
class DrmMemoryManagerFixturePrelim : public DrmMemoryManagerFixture {
|
||||
public:
|
||||
void SetUp() override {
|
||||
regionInfo.resize(2);
|
||||
regionInfo[0].region = {I915_MEMORY_CLASS_SYSTEM, 1};
|
||||
regionInfo[1].region = {I915_MEMORY_CLASS_DEVICE, DrmMockHelper::getEngineOrMemoryInstanceValue(0, 0)};
|
||||
|
||||
MemoryManagementFixture::SetUp();
|
||||
executionEnvironment = MockDevice::prepareExecutionEnvironment(defaultHwInfo.get(), numRootDevices - 1);
|
||||
mock = new DrmMockCustomPrelim(*executionEnvironment->rootDeviceEnvironments[0]);
|
||||
mock->memoryInfo.reset(new MemoryInfo(regionInfo));
|
||||
|
||||
DrmMemoryManagerFixture::SetUp(mock, true);
|
||||
}
|
||||
|
||||
void TearDown() override {
|
||||
mock->testIoctls();
|
||||
DrmMemoryManagerFixture::TearDown();
|
||||
}
|
||||
|
||||
std::vector<MemoryRegion> regionInfo;
|
||||
DrmMockCustomPrelim *mock;
|
||||
};
|
||||
|
@ -7,25 +7,30 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "shared/source/helpers/constants.h"
|
||||
#include "shared/source/os_interface/linux/memory_info.h"
|
||||
|
||||
const std::vector<MemoryRegion> memoryRegions = {
|
||||
#include "drm/i915_drm.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
const std::vector<NEO::MemoryRegion> memoryRegions = {
|
||||
{{I915_MEMORY_CLASS_SYSTEM, 0}, 64 * GB, 0},
|
||||
{{I915_MEMORY_CLASS_DEVICE, 0}, 8 * GB, 0}};
|
||||
|
||||
struct MockMemoryInfo : public MemoryInfo {
|
||||
struct MockMemoryInfo : public NEO::MemoryInfo {
|
||||
MockMemoryInfo() : MemoryInfo(memoryRegions) {}
|
||||
~MockMemoryInfo() override = default;
|
||||
};
|
||||
|
||||
const std::vector<MemoryRegion> extendedMemoryRegions = {
|
||||
const std::vector<NEO::MemoryRegion> extendedMemoryRegions = {
|
||||
{{I915_MEMORY_CLASS_SYSTEM, 1}, 64 * GB, 0},
|
||||
{{I915_MEMORY_CLASS_DEVICE, 0x100}, 8 * GB, 0},
|
||||
{{I915_MEMORY_CLASS_DEVICE, 0x200}, 8 * GB, 0},
|
||||
{{I915_MEMORY_CLASS_DEVICE, 0x400}, 8 * GB, 0},
|
||||
{{I915_MEMORY_CLASS_DEVICE, 0x800}, 8 * GB, 0}};
|
||||
|
||||
struct MockExtendedMemoryInfo : public MemoryInfo {
|
||||
struct MockExtendedMemoryInfo : public NEO::MemoryInfo {
|
||||
MockExtendedMemoryInfo() : MemoryInfo(extendedMemoryRegions) {}
|
||||
~MockExtendedMemoryInfo() override = default;
|
||||
};
|
||||
|
@ -69,7 +69,7 @@ int DrmMockPrelimContext::handlePrelimRequest(unsigned long request, void *arg)
|
||||
case DRM_IOCTL_I915_GEM_MMAP_OFFSET: {
|
||||
auto mmap_arg = static_cast<drm_i915_gem_mmap_offset *>(arg);
|
||||
mmap_arg->offset = 0;
|
||||
return 0;
|
||||
return mmapOffsetReturn;
|
||||
} break;
|
||||
case PRELIM_DRM_IOCTL_I915_GEM_CLOS_RESERVE: {
|
||||
auto closReserveArg = static_cast<prelim_drm_i915_gem_clos_reserve *>(arg);
|
||||
@ -141,10 +141,6 @@ int DrmMockPrelimContext::handlePrelimRequest(unsigned long request, void *arg)
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
constexpr uint32_t createExtHandle{1u};
|
||||
createExt->handle = createExtHandle;
|
||||
receivedCreateGemExt = CreateGemExt{createExt->size, createExtHandle};
|
||||
|
||||
auto extension = reinterpret_cast<prelim_drm_i915_gem_create_ext_setparam *>(createExt->extensions);
|
||||
if (!extension) {
|
||||
return EINVAL;
|
||||
@ -164,6 +160,11 @@ int DrmMockPrelimContext::handlePrelimRequest(unsigned long request, void *arg)
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
constexpr uint32_t createExtHandle{1u};
|
||||
createExt->handle = createExtHandle;
|
||||
receivedCreateGemExt = CreateGemExt{createExt->size, createExtHandle};
|
||||
receivedCreateGemExt->setParamExt = CreateGemExt::SetParam{extension->param.handle, extension->param.size, extension->param.param};
|
||||
|
||||
receivedCreateGemExt->memoryRegions.clear();
|
||||
for (uint32_t i = 0; i < extension->param.size; i++) {
|
||||
receivedCreateGemExt->memoryRegions.push_back({data[i].memory_class, data[i].memory_instance});
|
||||
@ -173,7 +174,8 @@ int DrmMockPrelimContext::handlePrelimRequest(unsigned long request, void *arg)
|
||||
if ((firstMemoryRegion.memoryClass != PRELIM_I915_MEMORY_CLASS_SYSTEM) && (firstMemoryRegion.memoryClass != PRELIM_I915_MEMORY_CLASS_DEVICE)) {
|
||||
return EINVAL;
|
||||
}
|
||||
return 0;
|
||||
|
||||
return gemCreateExtReturn;
|
||||
} break;
|
||||
case PRELIM_DRM_IOCTL_I915_GEM_WAIT_USER_FENCE: {
|
||||
waitUserFenceCalled++;
|
||||
@ -199,6 +201,11 @@ int DrmMockPrelimContext::handlePrelimRequest(unsigned long request, void *arg)
|
||||
|
||||
return !contextDebugSupported ? EINVAL : 0;
|
||||
} break;
|
||||
case PRELIM_DRM_IOCTL_I915_GEM_VM_ADVISE: {
|
||||
const auto req = reinterpret_cast<prelim_drm_i915_gem_vm_advise *>(arg);
|
||||
receivedVmAdvise = VmAdvise{req->handle, req->attribute};
|
||||
return vmAdviseReturn;
|
||||
} break;
|
||||
case PRELIM_DRM_IOCTL_I915_UUID_REGISTER: {
|
||||
auto uuidControl = reinterpret_cast<prelim_drm_i915_uuid_control *>(arg);
|
||||
|
||||
@ -495,3 +502,19 @@ uint64_t DrmPrelimHelper::getMakeResidentVmBindFlag() {
|
||||
uint64_t DrmPrelimHelper::getSIPContextParamDebugFlag() {
|
||||
return PRELIM_I915_CONTEXT_PARAM_DEBUG_FLAG_SIP;
|
||||
}
|
||||
|
||||
uint64_t DrmPrelimHelper::getMemoryRegionsParamFlag() {
|
||||
return PRELIM_I915_OBJECT_PARAM | PRELIM_I915_PARAM_MEMORY_REGIONS;
|
||||
}
|
||||
|
||||
uint32_t DrmPrelimHelper::getVmAdviseNoneFlag() {
|
||||
return PRELIM_I915_VM_ADVISE_ATOMIC_NONE;
|
||||
}
|
||||
|
||||
uint32_t DrmPrelimHelper::getVmAdviseDeviceFlag() {
|
||||
return PRELIM_I915_VM_ADVISE_ATOMIC_DEVICE;
|
||||
}
|
||||
|
||||
uint32_t DrmPrelimHelper::getVmAdviseSystemFlag() {
|
||||
return PRELIM_I915_VM_ADVISE_ATOMIC_SYSTEM;
|
||||
}
|
||||
|
@ -31,6 +31,13 @@ struct CreateGemExt {
|
||||
uint64_t size{0};
|
||||
uint32_t handle{0};
|
||||
|
||||
struct SetParam {
|
||||
uint32_t handle{0};
|
||||
uint32_t size{0};
|
||||
uint64_t param{0};
|
||||
};
|
||||
std::optional<SetParam> setParamExt{};
|
||||
|
||||
struct MemoryClassInstance {
|
||||
uint16_t memoryClass{0};
|
||||
uint16_t memoryInstance{0};
|
||||
@ -56,14 +63,18 @@ struct WaitUserFence {
|
||||
};
|
||||
|
||||
struct UserFenceVmBindExt {
|
||||
uint64_t addr;
|
||||
uint64_t val;
|
||||
uint64_t rsvd;
|
||||
uint64_t addr{0};
|
||||
uint64_t val{0};
|
||||
};
|
||||
|
||||
struct VmAdvise {
|
||||
uint32_t handle{0};
|
||||
uint32_t flags{0};
|
||||
};
|
||||
|
||||
struct UuidVmBindExt {
|
||||
uint32_t handle;
|
||||
uint64_t nextExtension;
|
||||
uint32_t handle{0};
|
||||
uint64_t nextExtension{0};
|
||||
};
|
||||
|
||||
struct DrmMockPrelimContext {
|
||||
@ -106,6 +117,11 @@ struct DrmMockPrelimContext {
|
||||
size_t waitUserFenceCalled{0};
|
||||
std::optional<WaitUserFence> receivedWaitUserFence{};
|
||||
|
||||
std::optional<VmAdvise> receivedVmAdvise{};
|
||||
int vmAdviseReturn{0};
|
||||
|
||||
int mmapOffsetReturn{0};
|
||||
|
||||
uint32_t uuidHandle{1};
|
||||
std::optional<UuidControl> receivedRegisterUuid{};
|
||||
std::optional<UuidControl> receivedUnregisterUuid{};
|
||||
@ -114,6 +130,7 @@ struct DrmMockPrelimContext {
|
||||
|
||||
std::optional<CreateGemExt> receivedCreateGemExt{};
|
||||
std::optional<GemContextParamAcc> receivedContextParamAcc{};
|
||||
int gemCreateExtReturn{0};
|
||||
|
||||
bool failDistanceInfoQuery{false};
|
||||
bool disableCcsSupport{false};
|
||||
@ -141,4 +158,8 @@ uint64_t getCaptureVmBindFlag();
|
||||
uint64_t getImmediateVmBindFlag();
|
||||
uint64_t getMakeResidentVmBindFlag();
|
||||
uint64_t getSIPContextParamDebugFlag();
|
||||
uint64_t getMemoryRegionsParamFlag();
|
||||
uint32_t getVmAdviseNoneFlag();
|
||||
uint32_t getVmAdviseDeviceFlag();
|
||||
uint32_t getVmAdviseSystemFlag();
|
||||
}; // namespace DrmPrelimHelper
|
||||
|
Reference in New Issue
Block a user