Skip to content

Commit e9f56e7

Browse files
Stop using CONTEXT_SET_PARAM
Related-To: NEO-5881 Signed-off-by: Piotr Obst <[email protected]>
1 parent ce12c97 commit e9f56e7

File tree

8 files changed

+172
-141
lines changed

8 files changed

+172
-141
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ set(IGDRCL_SRCS_tests_os_interface_linux
3131
${CMAKE_CURRENT_SOURCE_DIR}/drm_residency_handler_tests.cpp
3232
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/drm_system_info_tests.cpp
3333
${CMAKE_CURRENT_SOURCE_DIR}/drm_tests.cpp
34+
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/drm_context_tests.cpp
3435
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/drm_uuid_tests.cpp
3536
${CMAKE_CURRENT_SOURCE_DIR}/file_logger_linux_tests.cpp
3637
${CMAKE_CURRENT_SOURCE_DIR}/hw_info_config_linux_tests.cpp
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
/*
2+
* Copyright (C) 2018-2021 Intel Corporation
3+
*
4+
* SPDX-License-Identifier: MIT
5+
*
6+
*/
7+
8+
#include "shared/source/os_interface/linux/os_context_linux.h"
9+
#include "shared/test/common/helpers/default_hw_info.h"
10+
#include "shared/test/common/helpers/engine_descriptor_helper.h"
11+
12+
#include "opencl/test/unit_test/os_interface/linux/drm_mock.h"
13+
14+
#include "gtest/gtest.h"
15+
16+
using namespace NEO;
17+
18+
TEST(DrmTest, givenDrmWhenOsContextIsCreatedThenCreateAndDestroyNewDrmOsContext) {
19+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
20+
executionEnvironment->prepareRootDeviceEnvironments(1);
21+
DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]);
22+
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
23+
24+
{
25+
OsContextLinux osContext1(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor());
26+
osContext1.ensureContextInitialized();
27+
28+
EXPECT_EQ(1u, osContext1.getDrmContextIds().size());
29+
EXPECT_EQ(drmMock.receivedCreateContextId, osContext1.getDrmContextIds()[0]);
30+
EXPECT_EQ(0u, drmMock.receivedDestroyContextId);
31+
32+
{
33+
OsContextLinux osContext2(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor());
34+
osContext2.ensureContextInitialized();
35+
EXPECT_EQ(1u, osContext2.getDrmContextIds().size());
36+
EXPECT_EQ(drmMock.receivedCreateContextId, osContext2.getDrmContextIds()[0]);
37+
EXPECT_EQ(0u, drmMock.receivedDestroyContextId);
38+
}
39+
}
40+
41+
EXPECT_EQ(2u, drmMock.receivedContextParamRequestCount);
42+
}
43+
44+
TEST(DrmTest, whenCreatingDrmContextWithVirtualMemoryAddressSpaceThenProperVmIdIsSet) {
45+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
46+
executionEnvironment->prepareRootDeviceEnvironments(1);
47+
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
48+
DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]);
49+
50+
ASSERT_EQ(1u, drmMock.virtualMemoryIds.size());
51+
52+
OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor());
53+
osContext.ensureContextInitialized();
54+
55+
EXPECT_EQ(drmMock.receivedContextParamRequest.value, drmMock.getVirtualMemoryAddressSpace(0u));
56+
}
57+
58+
TEST(DrmTest, givenDrmAndNegativeCheckNonPersistentContextsSupportWhenOsContextIsCreatedThenReceivedContextParamRequestCountReturnsCorrectValue) {
59+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
60+
executionEnvironment->prepareRootDeviceEnvironments(1);
61+
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
62+
DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]);
63+
auto expectedCount = 0u;
64+
65+
{
66+
drmMock.storedRetValForPersistant = -1;
67+
drmMock.checkNonPersistentContextsSupport();
68+
expectedCount += 2;
69+
OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor());
70+
osContext.ensureContextInitialized();
71+
EXPECT_EQ(expectedCount, drmMock.receivedContextParamRequestCount);
72+
}
73+
{
74+
drmMock.storedRetValForPersistant = 0;
75+
drmMock.checkNonPersistentContextsSupport();
76+
++expectedCount;
77+
OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor());
78+
osContext.ensureContextInitialized();
79+
expectedCount += 2;
80+
EXPECT_EQ(expectedCount, drmMock.receivedContextParamRequestCount);
81+
}
82+
}
83+
84+
TEST(DrmTest, givenDrmPreemptionEnabledAndLowPriorityEngineWhenCreatingOsContextThenCallSetContextPriorityIoctl) {
85+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
86+
executionEnvironment->prepareRootDeviceEnvironments(1);
87+
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
88+
DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]);
89+
drmMock.preemptionSupported = false;
90+
91+
OsContextLinux osContext1(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor());
92+
osContext1.ensureContextInitialized();
93+
OsContextLinux osContext2(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_RCS, EngineUsage::LowPriority}));
94+
osContext2.ensureContextInitialized();
95+
96+
EXPECT_EQ(2u, drmMock.receivedContextParamRequestCount);
97+
98+
drmMock.preemptionSupported = true;
99+
100+
OsContextLinux osContext3(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor());
101+
osContext3.ensureContextInitialized();
102+
EXPECT_EQ(3u, drmMock.receivedContextParamRequestCount);
103+
104+
OsContextLinux osContext4(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_RCS, EngineUsage::LowPriority}));
105+
osContext4.ensureContextInitialized();
106+
EXPECT_EQ(5u, drmMock.receivedContextParamRequestCount);
107+
EXPECT_EQ(drmMock.receivedCreateContextId, drmMock.receivedContextParamRequest.ctx_id);
108+
EXPECT_EQ(static_cast<uint64_t>(I915_CONTEXT_PARAM_PRIORITY), drmMock.receivedContextParamRequest.param);
109+
EXPECT_EQ(static_cast<uint64_t>(-1023), drmMock.receivedContextParamRequest.value);
110+
EXPECT_EQ(0u, drmMock.receivedContextParamRequest.size);
111+
}
112+
113+
TEST(DrmTest, givenNoPerContextVmsDrmWhenCreatingOsContextsThenVmIdIsNotQueriedAndStored) {
114+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
115+
executionEnvironment->prepareRootDeviceEnvironments(1);
116+
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
117+
DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]);
118+
EXPECT_FALSE(drmMock.requirePerContextVM);
119+
120+
drmMock.storedRetValForVmId = 1;
121+
122+
OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor());
123+
osContext.ensureContextInitialized();
124+
EXPECT_EQ(0u, drmMock.receivedCreateContextId);
125+
EXPECT_EQ(1u, drmMock.receivedContextParamRequestCount);
126+
127+
auto &drmVmIds = osContext.getDrmVmIds();
128+
EXPECT_EQ(0u, drmVmIds.size());
129+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ int DrmMock::ioctl(unsigned long request, void *arg) {
7474
auto create = static_cast<drm_i915_gem_context_create_ext *>(arg);
7575
this->receivedCreateContextId = create->ctx_id;
7676
this->receivedContextCreateFlags = create->flags;
77+
this->receivedContextCreateExtensions = create->extensions;
7778
return this->storedRetVal;
7879
}
7980

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ class DrmMock : public Drm {
150150
bool allowDebugAttachCallBase = false;
151151
uint32_t passedContextDebugId = std::numeric_limits<uint32_t>::max();
152152

153+
uint64_t receivedContextCreateExtensions = 0;
153154
uint32_t receivedContextCreateFlags = 0;
154155
uint32_t receivedCreateContextId = 0;
155156
uint32_t receivedDestroyContextId = 0;

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

Lines changed: 0 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,16 @@
55
*
66
*/
77

8-
#include "shared/source/helpers/file_io.h"
9-
#include "shared/source/helpers/hw_info.h"
10-
#include "shared/source/os_interface/device_factory.h"
118
#include "shared/source/os_interface/linux/os_context_linux.h"
12-
#include "shared/source/os_interface/os_interface.h"
139
#include "shared/test/common/helpers/debug_manager_state_restore.h"
1410
#include "shared/test/common/helpers/default_hw_info.h"
1511
#include "shared/test/common/helpers/engine_descriptor_helper.h"
1612

17-
#include "opencl/test/unit_test/fixtures/memory_management_fixture.h"
1813
#include "opencl/test/unit_test/mocks/mock_platform.h"
1914
#include "opencl/test/unit_test/os_interface/linux/drm_mock.h"
2015

2116
#include "gtest/gtest.h"
2217

23-
#include <fstream>
24-
#include <memory>
25-
2618
using namespace NEO;
2719

2820
TEST(DrmTest, WhenGettingDeviceIdThenCorrectIdReturned) {
@@ -186,46 +178,6 @@ TEST(DrmTest, GivenDrmWhenAskedForContextThatFailsThenFalseIsReturned) {
186178
delete pDrm;
187179
}
188180

189-
TEST(DrmTest, givenDrmWhenOsContextIsCreatedThenCreateAndDestroyNewDrmOsContext) {
190-
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
191-
executionEnvironment->prepareRootDeviceEnvironments(1);
192-
DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]);
193-
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
194-
195-
{
196-
OsContextLinux osContext1(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor());
197-
osContext1.ensureContextInitialized();
198-
199-
EXPECT_EQ(1u, osContext1.getDrmContextIds().size());
200-
EXPECT_EQ(drmMock.receivedCreateContextId, osContext1.getDrmContextIds()[0]);
201-
EXPECT_EQ(0u, drmMock.receivedDestroyContextId);
202-
203-
{
204-
OsContextLinux osContext2(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor());
205-
osContext2.ensureContextInitialized();
206-
EXPECT_EQ(1u, osContext2.getDrmContextIds().size());
207-
EXPECT_EQ(drmMock.receivedCreateContextId, osContext2.getDrmContextIds()[0]);
208-
EXPECT_EQ(0u, drmMock.receivedDestroyContextId);
209-
}
210-
}
211-
212-
EXPECT_EQ(2u, drmMock.receivedContextParamRequestCount);
213-
}
214-
215-
TEST(DrmTest, whenCreatingDrmContextWithVirtualMemoryAddressSpaceThenProperVmIdIsSet) {
216-
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
217-
executionEnvironment->prepareRootDeviceEnvironments(1);
218-
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
219-
DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]);
220-
221-
ASSERT_EQ(1u, drmMock.virtualMemoryIds.size());
222-
223-
OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor());
224-
osContext.ensureContextInitialized();
225-
226-
EXPECT_EQ(drmMock.receivedContextParamRequest.value, drmMock.getVirtualMemoryAddressSpace(0u));
227-
}
228-
229181
TEST(DrmTest, whenCreatingDrmContextWithNoVirtualMemoryAddressSpaceThenProperContextIdIsSet) {
230182
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
231183
executionEnvironment->prepareRootDeviceEnvironments(1);
@@ -242,61 +194,6 @@ TEST(DrmTest, whenCreatingDrmContextWithNoVirtualMemoryAddressSpaceThenProperCon
242194
EXPECT_EQ(0u, drmMock.receivedContextParamRequestCount);
243195
}
244196

245-
TEST(DrmTest, givenDrmAndNegativeCheckNonPersistentContextsSupportWhenOsContextIsCreatedThenReceivedContextParamRequestCountReturnsCorrectValue) {
246-
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
247-
executionEnvironment->prepareRootDeviceEnvironments(1);
248-
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
249-
DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]);
250-
auto expectedCount = 0u;
251-
252-
{
253-
drmMock.storedRetValForPersistant = -1;
254-
drmMock.checkNonPersistentContextsSupport();
255-
expectedCount += 2;
256-
OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor());
257-
osContext.ensureContextInitialized();
258-
EXPECT_EQ(expectedCount, drmMock.receivedContextParamRequestCount);
259-
}
260-
{
261-
drmMock.storedRetValForPersistant = 0;
262-
drmMock.checkNonPersistentContextsSupport();
263-
++expectedCount;
264-
OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor());
265-
osContext.ensureContextInitialized();
266-
expectedCount += 2;
267-
EXPECT_EQ(expectedCount, drmMock.receivedContextParamRequestCount);
268-
}
269-
}
270-
271-
TEST(DrmTest, givenDrmPreemptionEnabledAndLowPriorityEngineWhenCreatingOsContextThenCallSetContextPriorityIoctl) {
272-
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
273-
executionEnvironment->prepareRootDeviceEnvironments(1);
274-
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
275-
DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]);
276-
drmMock.preemptionSupported = false;
277-
278-
OsContextLinux osContext1(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor());
279-
osContext1.ensureContextInitialized();
280-
OsContextLinux osContext2(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_RCS, EngineUsage::LowPriority}));
281-
osContext2.ensureContextInitialized();
282-
283-
EXPECT_EQ(2u, drmMock.receivedContextParamRequestCount);
284-
285-
drmMock.preemptionSupported = true;
286-
287-
OsContextLinux osContext3(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor());
288-
osContext3.ensureContextInitialized();
289-
EXPECT_EQ(3u, drmMock.receivedContextParamRequestCount);
290-
291-
OsContextLinux osContext4(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_RCS, EngineUsage::LowPriority}));
292-
osContext4.ensureContextInitialized();
293-
EXPECT_EQ(5u, drmMock.receivedContextParamRequestCount);
294-
EXPECT_EQ(drmMock.receivedCreateContextId, drmMock.receivedContextParamRequest.ctx_id);
295-
EXPECT_EQ(static_cast<uint64_t>(I915_CONTEXT_PARAM_PRIORITY), drmMock.receivedContextParamRequest.param);
296-
EXPECT_EQ(static_cast<uint64_t>(-1023), drmMock.receivedContextParamRequest.value);
297-
EXPECT_EQ(0u, drmMock.receivedContextParamRequest.size);
298-
}
299-
300197
TEST(DrmTest, WhenGettingExecSoftPinThenCorrectValueIsReturned) {
301198
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
302199
executionEnvironment->prepareRootDeviceEnvironments(1);
@@ -577,24 +474,6 @@ TEST(DrmTest, givenPerContextVMRequiredWhenCreatingOsContextsForRootDeviceThenIm
577474
EXPECT_EQ(0u, drmVmIds[31]);
578475
}
579476

580-
TEST(DrmTest, givenNoPerContextVmsDrmWhenCreatingOsContextsThenVmIdIsNotQueriedAndStored) {
581-
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
582-
executionEnvironment->prepareRootDeviceEnvironments(1);
583-
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
584-
DrmMock drmMock(*executionEnvironment->rootDeviceEnvironments[0]);
585-
EXPECT_FALSE(drmMock.requirePerContextVM);
586-
587-
drmMock.storedRetValForVmId = 1;
588-
589-
OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor());
590-
osContext.ensureContextInitialized();
591-
EXPECT_EQ(0u, drmMock.receivedCreateContextId);
592-
EXPECT_EQ(1u, drmMock.receivedContextParamRequestCount);
593-
594-
auto &drmVmIds = osContext.getDrmVmIds();
595-
EXPECT_EQ(0u, drmVmIds.size());
596-
}
597-
598477
TEST(DrmTest, givenProgramDebuggingAndContextDebugAvailableWhenCreatingContextThenSetContextDebugFlagIsCalled) {
599478
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
600479
executionEnvironment->setDebuggingEnabled();

shared/source/os_interface/linux/drm_neo.cpp

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -377,26 +377,6 @@ void Drm::setNonPersistentContext(uint32_t drmContextId) {
377377
ioctl(DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM, &contextParam);
378378
}
379379

380-
uint32_t Drm::createDrmContext(uint32_t drmVmId, bool isSpecialContextRequested) {
381-
drm_i915_gem_context_create_ext gcc = {};
382-
383-
this->appendDrmContextFlags(gcc, isSpecialContextRequested);
384-
385-
auto retVal = ioctl(DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &gcc);
386-
UNRECOVERABLE_IF(retVal != 0);
387-
388-
if (drmVmId > 0) {
389-
drm_i915_gem_context_param param{};
390-
param.ctx_id = gcc.ctx_id;
391-
param.value = drmVmId;
392-
param.param = I915_CONTEXT_PARAM_VM;
393-
retVal = ioctl(DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM, &param);
394-
UNRECOVERABLE_IF(retVal != 0);
395-
}
396-
397-
return gcc.ctx_id;
398-
}
399-
400380
void Drm::destroyDrmContext(uint32_t drmContextId) {
401381
drm_i915_gem_context_destroy destroy = {};
402382
destroy.ctx_id = drmContextId;

shared/source/os_interface/linux/drm_query.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,4 +117,24 @@ int Drm::createDrmVirtualMemory(uint32_t &drmVmId) {
117117
return ret;
118118
}
119119

120+
uint32_t Drm::createDrmContext(uint32_t drmVmId, bool isSpecialContextRequested) {
121+
drm_i915_gem_context_create_ext gcc = {};
122+
123+
this->appendDrmContextFlags(gcc, isSpecialContextRequested);
124+
125+
auto retVal = ioctl(DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &gcc);
126+
UNRECOVERABLE_IF(retVal != 0);
127+
128+
if (drmVmId > 0) {
129+
drm_i915_gem_context_param param{};
130+
param.ctx_id = gcc.ctx_id;
131+
param.value = drmVmId;
132+
param.param = I915_CONTEXT_PARAM_VM;
133+
retVal = ioctl(DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM, &param);
134+
UNRECOVERABLE_IF(retVal != 0);
135+
}
136+
137+
return gcc.ctx_id;
138+
}
139+
120140
} // namespace NEO

shared/source/os_interface/linux/drm_query_dg1.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,4 +126,24 @@ int Drm::createDrmVirtualMemory(uint32_t &drmVmId) {
126126
return ret;
127127
}
128128

129+
uint32_t Drm::createDrmContext(uint32_t drmVmId, bool isSpecialContextRequested) {
130+
drm_i915_gem_context_create_ext gcc = {};
131+
132+
this->appendDrmContextFlags(gcc, isSpecialContextRequested);
133+
134+
auto retVal = ioctl(DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &gcc);
135+
UNRECOVERABLE_IF(retVal != 0);
136+
137+
if (drmVmId > 0) {
138+
drm_i915_gem_context_param param{};
139+
param.ctx_id = gcc.ctx_id;
140+
param.value = drmVmId;
141+
param.param = I915_CONTEXT_PARAM_VM;
142+
retVal = ioctl(DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM, &param);
143+
UNRECOVERABLE_IF(retVal != 0);
144+
}
145+
146+
return gcc.ctx_id;
147+
}
148+
129149
} // namespace NEO

0 commit comments

Comments
 (0)