Skip to content

Commit cf8e326

Browse files
Set context unrecoverable when debugging enabled
Related-To: NEO-6204 Signed-off-by: Mateusz Hoppe <[email protected]>
1 parent 8587270 commit cf8e326

File tree

6 files changed

+42
-5
lines changed

6 files changed

+42
-5
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ int DrmMock::ioctl(unsigned long request, void *arg) {
104104
if (receivedContextParamRequest.param == I915_CONTEXT_PARAM_VM) {
105105
return this->storedRetVal;
106106
}
107+
if (receivedContextParamRequest.param == I915_CONTEXT_PARAM_RECOVERABLE) {
108+
receivedRecoverableContextValue = receivedContextParamRequest.value;
109+
return this->storedRetVal;
110+
}
107111
}
108112

109113
if ((request == DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM) && (arg != nullptr)) {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ class DrmMock : public Drm {
157157

158158
uint32_t receivedContextParamRequestCount = 0;
159159
drm_i915_gem_context_param receivedContextParamRequest = {};
160+
uint64_t receivedRecoverableContextValue = std::numeric_limits<uint64_t>::max();
160161

161162
//DRM_IOCTL_I915_GEM_EXECBUFFER2
162163
drm_i915_gem_execbuffer2 execBuffer = {0};

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ TEST(DrmTest, givenPerContextVMRequiredWhenCreatingOsContextsThenImplicitVmIdPer
520520
OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor());
521521
osContext.ensureContextInitialized();
522522
EXPECT_EQ(0u, drmMock.receivedCreateContextId);
523-
EXPECT_EQ(1u, drmMock.receivedContextParamRequestCount);
523+
EXPECT_EQ(2u, drmMock.receivedContextParamRequestCount);
524524

525525
auto &drmVmIds = osContext.getDrmVmIds();
526526
EXPECT_EQ(32u, drmVmIds.size());
@@ -541,7 +541,7 @@ TEST(DrmTest, givenPerContextVMRequiredWhenCreatingOsContextForSubDeviceThenImpl
541541
OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor(deviceBitfield));
542542
osContext.ensureContextInitialized();
543543
EXPECT_EQ(0u, drmMock.receivedCreateContextId);
544-
EXPECT_EQ(1u, drmMock.receivedContextParamRequestCount);
544+
EXPECT_EQ(2u, drmMock.receivedContextParamRequestCount);
545545

546546
auto &drmVmIds = osContext.getDrmVmIds();
547547
EXPECT_EQ(32u, drmVmIds.size());
@@ -565,7 +565,7 @@ TEST(DrmTest, givenPerContextVMRequiredWhenCreatingOsContextsForRootDeviceThenIm
565565
OsContextLinux osContext(drmMock, 0u, EngineDescriptorHelper::getDefaultDescriptor(deviceBitfield));
566566
osContext.ensureContextInitialized();
567567
EXPECT_EQ(0u, drmMock.receivedCreateContextId);
568-
EXPECT_EQ(2u, drmMock.receivedContextParamRequestCount);
568+
EXPECT_EQ(2 * 2u, drmMock.receivedContextParamRequestCount);
569569

570570
auto &drmVmIds = osContext.getDrmVmIds();
571571
EXPECT_EQ(32u, drmVmIds.size());
@@ -674,6 +674,23 @@ TEST(DrmTest, givenPrintIoctlDebugFlagNotSetWhenGettingTimestampFrequencyThenCap
674674
EXPECT_EQ(std::string::npos, outputString.find(expectedString));
675675
}
676676

677+
TEST(DrmTest, givenProgramDebuggingWhenCreatingContextThenUnrecoverableContextIsSet) {
678+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
679+
executionEnvironment->setDebuggingEnabled();
680+
executionEnvironment->prepareRootDeviceEnvironments(1);
681+
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
682+
executionEnvironment->calculateMaxOsContextCount();
683+
executionEnvironment->rootDeviceEnvironments[0]->osInterface = std::make_unique<OSInterface>();
684+
685+
DrmMock drm(*executionEnvironment->rootDeviceEnvironments[0]);
686+
687+
OsContextLinux osContext(drm, 0u, EngineDescriptorHelper::getDefaultDescriptor());
688+
osContext.ensureContextInitialized();
689+
690+
EXPECT_EQ(0u, drm.receivedRecoverableContextValue);
691+
EXPECT_EQ(2u, drm.receivedContextParamRequestCount);
692+
}
693+
677694
TEST(DrmQueryTest, GivenDrmWhenSetupHardwareInfoCalledThenCorrectMaxValuesInGtSystemInfoArePreserved) {
678695
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
679696
executionEnvironment->prepareRootDeviceEnvironments(1);

shared/source/os_interface/linux/drm_neo.cpp

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

380+
void Drm::setUnrecoverableContext(uint32_t drmContextId) {
381+
drm_i915_gem_context_param contextParam = {};
382+
contextParam.ctx_id = drmContextId;
383+
contextParam.param = I915_CONTEXT_PARAM_RECOVERABLE;
384+
contextParam.value = 0;
385+
contextParam.size = 0;
386+
387+
ioctl(DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM, &contextParam);
388+
}
389+
380390
uint32_t Drm::createDrmContext(uint32_t drmVmId, bool isSpecialContextRequested) {
381391
drm_i915_gem_context_create_ext gcc = {};
382392

shared/source/os_interface/linux/drm_neo.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ class Drm : public DriverModel {
164164
bool isContextDebugSupported() { return contextDebugSupported; }
165165
MOCKABLE_VIRTUAL void setContextDebugFlag(uint32_t drmContextId);
166166

167+
void setUnrecoverableContext(uint32_t drmContextId);
168+
167169
void setDirectSubmissionActive(bool value) { this->directSubmissionActive = value; }
168170
bool isDirectSubmissionActive() { return this->directSubmissionActive; }
169171

shared/source/os_interface/linux/os_context_linux.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,11 @@ void OsContextLinux::initializeContext() {
5353
drm.setNonPersistentContext(drmContextId);
5454
}
5555

56-
if (drm.getRootDeviceEnvironment().executionEnvironment.isDebuggingEnabled() && !isInternalEngine()) {
57-
drm.setContextDebugFlag(drmContextId);
56+
if (drm.getRootDeviceEnvironment().executionEnvironment.isDebuggingEnabled()) {
57+
drm.setUnrecoverableContext(drmContextId);
58+
if (!isInternalEngine()) {
59+
drm.setContextDebugFlag(drmContextId);
60+
}
5861
}
5962

6063
if (drm.isPreemptionSupported() && isLowPriority()) {

0 commit comments

Comments
 (0)