Skip to content

Commit 090a79f

Browse files
Test local memory DRM allocations
Signed-off-by: Daniel Chabrowski [email protected] Related-To: NEO-6591
1 parent 50efd09 commit 090a79f

File tree

8 files changed

+2094
-35
lines changed

8 files changed

+2094
-35
lines changed

opencl/test/unit_test/os_interface/linux/CMakeLists.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ set(IGDRCL_SRCS_tests_os_interface_linux
1818
${CMAKE_CURRENT_SOURCE_DIR}/drm_gem_close_worker_tests.cpp
1919
${CMAKE_CURRENT_SOURCE_DIR}/drm_mapper_tests.cpp
2020
${CMAKE_CURRENT_SOURCE_DIR}/drm_memory_manager_tests.cpp
21-
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}drm_memory_manager_localmem_tests.cpp
2221
${CMAKE_CURRENT_SOURCE_DIR}/drm_os_memory_tests.cpp
2322
${CMAKE_CURRENT_SOURCE_DIR}/drm_residency_handler_tests.cpp
2423
${CMAKE_CURRENT_SOURCE_DIR}/drm_system_info_tests.cpp
@@ -38,6 +37,12 @@ set(IGDRCL_SRCS_tests_os_interface_linux
3837
${CMAKE_CURRENT_SOURCE_DIR}/self_lib_lin.cpp
3938
)
4039

40+
if("${BRANCH_TYPE}" STREQUAL "")
41+
list(APPEND IGDRCL_SRCS_tests_os_interface_linux
42+
${CMAKE_CURRENT_SOURCE_DIR}/drm_memory_manager_localmem_upstream_tests.cpp
43+
)
44+
endif()
45+
4146
if(NEO_ENABLE_i915_PRELIM_DETECTION)
4247
list(APPEND IGDRCL_SRCS_tests_os_interface_linux
4348
${CMAKE_CURRENT_SOURCE_DIR}/device_command_stream_fixture_context.cpp

opencl/test/unit_test/os_interface/linux/device_command_stream_fixture_impl.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
/*
2-
* Copyright (C) 2020-2021 Intel Corporation
2+
* Copyright (C) 2020-2022 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
66
*/
77

88
#pragma once
9+
#include "shared/source/os_interface/linux/ioctl_strings.h"
910
#include "shared/test/common/os_interface/linux/device_command_stream_fixture.h"
1011

1112
class DrmMockCustomImpl : public DrmMockCustom {
@@ -49,7 +50,7 @@ class DrmMockCustomImpl : public DrmMockCustom {
4950
ioctlImpl_cnt.gemCreateExt++;
5051
} break;
5152
default: {
52-
std::cout << "unexpected IOCTL: " << std::hex << request << std::endl;
53+
std::cout << "unexpected IOCTL: " << NEO::IoctlToStringHelper::getIoctlString(request) << std::endl;
5354
UNRECOVERABLE_IF(true);
5455
} break;
5556
}

opencl/test/unit_test/os_interface/linux/drm_memory_manager_localmem_prelim_tests.cpp

Lines changed: 1974 additions & 0 deletions
Large diffs are not rendered by default.

opencl/test/unit_test/os_interface/linux/drm_memory_manager_localmem_tests.cpp renamed to opencl/test/unit_test/os_interface/linux/drm_memory_manager_localmem_upstream_tests.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,6 @@ class DrmMemoryManagerLocalMemoryTest : public ::testing::Test {
4949
memoryManager = std::make_unique<TestedDrmMemoryManager>(localMemoryEnabled, false, false, *executionEnvironment);
5050
}
5151

52-
bool isAllocationWithinHeap(const GraphicsAllocation &allocation, HeapIndex heap) {
53-
const auto allocationStart = allocation.getGpuAddress();
54-
const auto allocationEnd = allocationStart + allocation.getUnderlyingBufferSize();
55-
const auto heapStart = GmmHelper::canonize(memoryManager->getGfxPartition(rootDeviceIndex)->getHeapBase(heap));
56-
const auto heapEnd = GmmHelper::canonize(memoryManager->getGfxPartition(rootDeviceIndex)->getHeapLimit(heap));
57-
return heapStart <= allocationStart && allocationEnd <= heapEnd;
58-
}
59-
6052
protected:
6153
DebugManagerStateRestore restorer{};
6254
ExecutionEnvironment *executionEnvironment = nullptr;

opencl/test/unit_test/os_interface/linux/drm_memory_manager_prelim_fixtures.h

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@
1010
#include "shared/source/execution_environment/execution_environment.h"
1111
#include "shared/source/os_interface/linux/drm_memory_operations_handler.h"
1212
#include "shared/test/common/helpers/debug_manager_state_restore.h"
13+
#include "shared/test/common/libult/linux/drm_mock_helper.h"
1314
#include "shared/test/common/libult/linux/drm_query_mock.h"
1415
#include "shared/test/common/mocks/linux/mock_drm_memory_manager.h"
1516
#include "shared/test/common/mocks/mock_device.h"
17+
#include "shared/test/common/os_interface/linux/drm_memory_manager_tests.h"
1618

1719
#include "opencl/test/unit_test/os_interface/linux/device_command_stream_fixture_prelim.h"
1820
#include "opencl/test/unit_test/os_interface/linux/drm_mock_memory_info.h"
@@ -21,31 +23,42 @@
2123

2224
class DrmMemoryManagerLocalMemoryPrelimTest : public ::testing::Test {
2325
public:
24-
DrmQueryMock *mock;
25-
2626
void SetUp() override {
27-
executionEnvironment = new ExecutionEnvironment;
27+
DebugManager.flags.EnableLocalMemory.set(localMemoryEnabled);
28+
29+
executionEnvironment = new ExecutionEnvironment();
2830
executionEnvironment->prepareRootDeviceEnvironments(1);
2931
executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->setHwInfo(defaultHwInfo.get());
3032

3133
mock = new DrmQueryMock(*executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]);
32-
mock->memoryInfo.reset(new MockExtendedMemoryInfo());
34+
auto memoryInfo = new MockExtendedMemoryInfo();
35+
mock->memoryInfo.reset(memoryInfo);
36+
37+
auto &multiTileArchInfo = executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->getMutableHardwareInfo()->gtSystemInfo.MultiTileArchInfo;
38+
multiTileArchInfo.TileCount = (memoryInfo->getDrmRegionInfos().size() - 1);
39+
multiTileArchInfo.IsValid = (multiTileArchInfo.TileCount > 0);
40+
41+
mock->queryEngineInfo();
3342

3443
executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->osInterface = std::make_unique<OSInterface>();
3544
executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(mock));
3645
executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->memoryOperationsInterface = DrmMemoryOperationsHandler::create(*mock, 0u);
3746

47+
memoryManager = new TestedDrmMemoryManager(localMemoryEnabled, false, false, *executionEnvironment);
48+
executionEnvironment->memoryManager.reset(memoryManager);
49+
3850
device.reset(MockDevice::createWithExecutionEnvironment<MockDevice>(defaultHwInfo.get(), executionEnvironment, rootDeviceIndex));
39-
constexpr bool localMemoryEnabled = true;
40-
memoryManager = std::make_unique<TestedDrmMemoryManager>(localMemoryEnabled, false, false, *executionEnvironment);
4151
}
4252

4353
protected:
4454
DebugManagerStateRestore restorer{};
45-
ExecutionEnvironment *executionEnvironment;
55+
ExecutionEnvironment *executionEnvironment{nullptr};
56+
DrmQueryMock *mock{nullptr};
4657
std::unique_ptr<MockDevice> device;
47-
std::unique_ptr<TestedDrmMemoryManager> memoryManager;
48-
const uint32_t rootDeviceIndex = 0u;
58+
TestedDrmMemoryManager *memoryManager{nullptr};
59+
60+
constexpr static uint32_t rootDeviceIndex{0u};
61+
constexpr static bool localMemoryEnabled{true};
4962
};
5063

5164
class DrmMemoryManagerLocalMemoryWithCustomPrelimMockTest : public ::testing::Test {
@@ -55,6 +68,7 @@ class DrmMemoryManagerLocalMemoryWithCustomPrelimMockTest : public ::testing::Te
5568
executionEnvironment = new ExecutionEnvironment;
5669
executionEnvironment->prepareRootDeviceEnvironments(1);
5770
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
71+
5872
mock = new DrmMockCustomPrelim(*executionEnvironment->rootDeviceEnvironments[0]);
5973
executionEnvironment->rootDeviceEnvironments[0]->osInterface = std::make_unique<OSInterface>();
6074
executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(mock));
@@ -69,3 +83,27 @@ class DrmMemoryManagerLocalMemoryWithCustomPrelimMockTest : public ::testing::Te
6983
DrmMockCustomPrelim *mock;
7084
ExecutionEnvironment *executionEnvironment;
7185
};
86+
87+
class DrmMemoryManagerFixturePrelim : public DrmMemoryManagerFixture {
88+
public:
89+
void SetUp() override {
90+
regionInfo.resize(2);
91+
regionInfo[0].region = {I915_MEMORY_CLASS_SYSTEM, 1};
92+
regionInfo[1].region = {I915_MEMORY_CLASS_DEVICE, DrmMockHelper::getEngineOrMemoryInstanceValue(0, 0)};
93+
94+
MemoryManagementFixture::SetUp();
95+
executionEnvironment = MockDevice::prepareExecutionEnvironment(defaultHwInfo.get(), numRootDevices - 1);
96+
mock = new DrmMockCustomPrelim(*executionEnvironment->rootDeviceEnvironments[0]);
97+
mock->memoryInfo.reset(new MemoryInfo(regionInfo));
98+
99+
DrmMemoryManagerFixture::SetUp(mock, true);
100+
}
101+
102+
void TearDown() override {
103+
mock->testIoctls();
104+
DrmMemoryManagerFixture::TearDown();
105+
}
106+
107+
std::vector<MemoryRegion> regionInfo;
108+
DrmMockCustomPrelim *mock;
109+
};

opencl/test/unit_test/os_interface/linux/drm_mock_memory_info.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,30 @@
77

88
#pragma once
99

10+
#include "shared/source/helpers/constants.h"
1011
#include "shared/source/os_interface/linux/memory_info.h"
1112

12-
const std::vector<MemoryRegion> memoryRegions = {
13+
#include "drm/i915_drm.h"
14+
15+
#include <vector>
16+
17+
const std::vector<NEO::MemoryRegion> memoryRegions = {
1318
{{I915_MEMORY_CLASS_SYSTEM, 0}, 64 * GB, 0},
1419
{{I915_MEMORY_CLASS_DEVICE, 0}, 8 * GB, 0}};
1520

16-
struct MockMemoryInfo : public MemoryInfo {
21+
struct MockMemoryInfo : public NEO::MemoryInfo {
1722
MockMemoryInfo() : MemoryInfo(memoryRegions) {}
1823
~MockMemoryInfo() override = default;
1924
};
2025

21-
const std::vector<MemoryRegion> extendedMemoryRegions = {
26+
const std::vector<NEO::MemoryRegion> extendedMemoryRegions = {
2227
{{I915_MEMORY_CLASS_SYSTEM, 1}, 64 * GB, 0},
2328
{{I915_MEMORY_CLASS_DEVICE, 0x100}, 8 * GB, 0},
2429
{{I915_MEMORY_CLASS_DEVICE, 0x200}, 8 * GB, 0},
2530
{{I915_MEMORY_CLASS_DEVICE, 0x400}, 8 * GB, 0},
2631
{{I915_MEMORY_CLASS_DEVICE, 0x800}, 8 * GB, 0}};
2732

28-
struct MockExtendedMemoryInfo : public MemoryInfo {
33+
struct MockExtendedMemoryInfo : public NEO::MemoryInfo {
2934
MockExtendedMemoryInfo() : MemoryInfo(extendedMemoryRegions) {}
3035
~MockExtendedMemoryInfo() override = default;
3136
};

shared/test/common/libult/linux/drm_mock_prelim_context.cpp

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ int DrmMockPrelimContext::handlePrelimRequest(unsigned long request, void *arg)
6969
case DRM_IOCTL_I915_GEM_MMAP_OFFSET: {
7070
auto mmap_arg = static_cast<drm_i915_gem_mmap_offset *>(arg);
7171
mmap_arg->offset = 0;
72-
return 0;
72+
return mmapOffsetReturn;
7373
} break;
7474
case PRELIM_DRM_IOCTL_I915_GEM_CLOS_RESERVE: {
7575
auto closReserveArg = static_cast<prelim_drm_i915_gem_clos_reserve *>(arg);
@@ -141,10 +141,6 @@ int DrmMockPrelimContext::handlePrelimRequest(unsigned long request, void *arg)
141141
return EINVAL;
142142
}
143143

144-
constexpr uint32_t createExtHandle{1u};
145-
createExt->handle = createExtHandle;
146-
receivedCreateGemExt = CreateGemExt{createExt->size, createExtHandle};
147-
148144
auto extension = reinterpret_cast<prelim_drm_i915_gem_create_ext_setparam *>(createExt->extensions);
149145
if (!extension) {
150146
return EINVAL;
@@ -164,6 +160,11 @@ int DrmMockPrelimContext::handlePrelimRequest(unsigned long request, void *arg)
164160
return EINVAL;
165161
}
166162

163+
constexpr uint32_t createExtHandle{1u};
164+
createExt->handle = createExtHandle;
165+
receivedCreateGemExt = CreateGemExt{createExt->size, createExtHandle};
166+
receivedCreateGemExt->setParamExt = CreateGemExt::SetParam{extension->param.handle, extension->param.size, extension->param.param};
167+
167168
receivedCreateGemExt->memoryRegions.clear();
168169
for (uint32_t i = 0; i < extension->param.size; i++) {
169170
receivedCreateGemExt->memoryRegions.push_back({data[i].memory_class, data[i].memory_instance});
@@ -173,7 +174,8 @@ int DrmMockPrelimContext::handlePrelimRequest(unsigned long request, void *arg)
173174
if ((firstMemoryRegion.memoryClass != PRELIM_I915_MEMORY_CLASS_SYSTEM) && (firstMemoryRegion.memoryClass != PRELIM_I915_MEMORY_CLASS_DEVICE)) {
174175
return EINVAL;
175176
}
176-
return 0;
177+
178+
return gemCreateExtReturn;
177179
} break;
178180
case PRELIM_DRM_IOCTL_I915_GEM_WAIT_USER_FENCE: {
179181
waitUserFenceCalled++;
@@ -199,6 +201,11 @@ int DrmMockPrelimContext::handlePrelimRequest(unsigned long request, void *arg)
199201

200202
return !contextDebugSupported ? EINVAL : 0;
201203
} break;
204+
case PRELIM_DRM_IOCTL_I915_GEM_VM_ADVISE: {
205+
const auto req = reinterpret_cast<prelim_drm_i915_gem_vm_advise *>(arg);
206+
receivedVmAdvise = VmAdvise{req->handle, req->attribute};
207+
return vmAdviseReturn;
208+
} break;
202209
case PRELIM_DRM_IOCTL_I915_UUID_REGISTER: {
203210
auto uuidControl = reinterpret_cast<prelim_drm_i915_uuid_control *>(arg);
204211

@@ -495,3 +502,19 @@ uint64_t DrmPrelimHelper::getMakeResidentVmBindFlag() {
495502
uint64_t DrmPrelimHelper::getSIPContextParamDebugFlag() {
496503
return PRELIM_I915_CONTEXT_PARAM_DEBUG_FLAG_SIP;
497504
}
505+
506+
uint64_t DrmPrelimHelper::getMemoryRegionsParamFlag() {
507+
return PRELIM_I915_OBJECT_PARAM | PRELIM_I915_PARAM_MEMORY_REGIONS;
508+
}
509+
510+
uint32_t DrmPrelimHelper::getVmAdviseNoneFlag() {
511+
return PRELIM_I915_VM_ADVISE_ATOMIC_NONE;
512+
}
513+
514+
uint32_t DrmPrelimHelper::getVmAdviseDeviceFlag() {
515+
return PRELIM_I915_VM_ADVISE_ATOMIC_DEVICE;
516+
}
517+
518+
uint32_t DrmPrelimHelper::getVmAdviseSystemFlag() {
519+
return PRELIM_I915_VM_ADVISE_ATOMIC_SYSTEM;
520+
}

shared/test/common/libult/linux/drm_mock_prelim_context.h

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ struct CreateGemExt {
3131
uint64_t size{0};
3232
uint32_t handle{0};
3333

34+
struct SetParam {
35+
uint32_t handle{0};
36+
uint32_t size{0};
37+
uint64_t param{0};
38+
};
39+
std::optional<SetParam> setParamExt{};
40+
3441
struct MemoryClassInstance {
3542
uint16_t memoryClass{0};
3643
uint16_t memoryInstance{0};
@@ -56,14 +63,18 @@ struct WaitUserFence {
5663
};
5764

5865
struct UserFenceVmBindExt {
59-
uint64_t addr;
60-
uint64_t val;
61-
uint64_t rsvd;
66+
uint64_t addr{0};
67+
uint64_t val{0};
68+
};
69+
70+
struct VmAdvise {
71+
uint32_t handle{0};
72+
uint32_t flags{0};
6273
};
6374

6475
struct UuidVmBindExt {
65-
uint32_t handle;
66-
uint64_t nextExtension;
76+
uint32_t handle{0};
77+
uint64_t nextExtension{0};
6778
};
6879

6980
struct DrmMockPrelimContext {
@@ -106,6 +117,11 @@ struct DrmMockPrelimContext {
106117
size_t waitUserFenceCalled{0};
107118
std::optional<WaitUserFence> receivedWaitUserFence{};
108119

120+
std::optional<VmAdvise> receivedVmAdvise{};
121+
int vmAdviseReturn{0};
122+
123+
int mmapOffsetReturn{0};
124+
109125
uint32_t uuidHandle{1};
110126
std::optional<UuidControl> receivedRegisterUuid{};
111127
std::optional<UuidControl> receivedUnregisterUuid{};
@@ -114,6 +130,7 @@ struct DrmMockPrelimContext {
114130

115131
std::optional<CreateGemExt> receivedCreateGemExt{};
116132
std::optional<GemContextParamAcc> receivedContextParamAcc{};
133+
int gemCreateExtReturn{0};
117134

118135
bool failDistanceInfoQuery{false};
119136
bool disableCcsSupport{false};
@@ -141,4 +158,8 @@ uint64_t getCaptureVmBindFlag();
141158
uint64_t getImmediateVmBindFlag();
142159
uint64_t getMakeResidentVmBindFlag();
143160
uint64_t getSIPContextParamDebugFlag();
161+
uint64_t getMemoryRegionsParamFlag();
162+
uint32_t getVmAdviseNoneFlag();
163+
uint32_t getVmAdviseDeviceFlag();
164+
uint32_t getVmAdviseSystemFlag();
144165
}; // namespace DrmPrelimHelper

0 commit comments

Comments
 (0)