Skip to content

Commit f02b6cd

Browse files
Dont print errno for BO binding result after success
Fixes incorrect errors reported for bind and unbind operations in printfs activated with the debug key PrintBOBindingResult. Related-To: NEO-5869 Signed-off-by: Milczarek, Slawomir <[email protected]>
1 parent 673e954 commit f02b6cd

File tree

4 files changed

+134
-12
lines changed

4 files changed

+134
-12
lines changed

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

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,110 @@ TEST(DrmBufferObject, givenPerContextVmRequiredWhenBoBoundAndUnboundThenCorrectB
392392
EXPECT_FALSE(bo.bindInfo[contextId][0]);
393393
}
394394

395+
TEST(DrmBufferObject, givenPrintBOBindingResultWhenBOBindAndUnbindSucceedsThenPrintDebugInformationAboutBOBindingResult) {
396+
struct DrmMockToSucceedBindBufferObject : public DrmMock {
397+
DrmMockToSucceedBindBufferObject(RootDeviceEnvironment &rootDeviceEnvironment)
398+
: DrmMock(rootDeviceEnvironment) {}
399+
int bindBufferObject(OsContext *osContext, uint32_t vmHandleId, BufferObject *bo) override { return 0; }
400+
int unbindBufferObject(OsContext *osContext, uint32_t vmHandleId, BufferObject *bo) override { return 0; }
401+
};
402+
403+
DebugManagerStateRestore restore;
404+
DebugManager.flags.PrintBOBindingResult.set(true);
405+
406+
auto executionEnvironment = new ExecutionEnvironment;
407+
executionEnvironment->setDebuggingEnabled();
408+
executionEnvironment->prepareRootDeviceEnvironments(1);
409+
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
410+
executionEnvironment->calculateMaxOsContextCount();
411+
executionEnvironment->rootDeviceEnvironments[0]->osInterface = std::make_unique<OSInterface>();
412+
413+
auto drm = new DrmMockToSucceedBindBufferObject(*executionEnvironment->rootDeviceEnvironments[0]);
414+
415+
executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(drm));
416+
executionEnvironment->rootDeviceEnvironments[0]->memoryOperationsInterface = DrmMemoryOperationsHandler::create(*drm, 0u);
417+
418+
std::unique_ptr<Device> device(MockDevice::createWithExecutionEnvironment<MockDevice>(defaultHwInfo.get(), executionEnvironment, 0));
419+
420+
auto osContextCount = device->getExecutionEnvironment()->memoryManager->getRegisteredEnginesCount();
421+
MockBufferObject bo(drm, 0, 0, osContextCount);
422+
423+
EXPECT_EQ(osContextCount, bo.bindInfo.size());
424+
425+
auto contextId = device->getExecutionEnvironment()->memoryManager->getRegisteredEnginesCount() / 2;
426+
auto osContext = device->getExecutionEnvironment()->memoryManager->getRegisteredEngines()[contextId].osContext;
427+
osContext->ensureContextInitialized();
428+
429+
testing::internal::CaptureStdout();
430+
431+
bo.bind(osContext, 0);
432+
EXPECT_TRUE(bo.bindInfo[contextId][0]);
433+
434+
std::string bindOutput = testing::internal::GetCapturedStdout();
435+
EXPECT_STREQ(bindOutput.c_str(), "bind BO-0 to VM 0, drmVmId = 1, range: 0 - 0, size: 0, result: 0\n");
436+
437+
testing::internal::CaptureStdout();
438+
439+
bo.unbind(osContext, 0);
440+
EXPECT_FALSE(bo.bindInfo[contextId][0]);
441+
442+
std::string unbindOutput = testing::internal::GetCapturedStdout();
443+
EXPECT_STREQ(unbindOutput.c_str(), "unbind BO-0 from VM 0, drmVmId = 1, range: 0 - 0, size: 0, result: 0\n");
444+
}
445+
446+
TEST(DrmBufferObject, givenPrintBOBindingResultWhenBOBindAndUnbindFailsThenPrintDebugInformationAboutBOBindingResultWithErrno) {
447+
struct DrmMockToFailBindBufferObject : public DrmMock {
448+
DrmMockToFailBindBufferObject(RootDeviceEnvironment &rootDeviceEnvironment)
449+
: DrmMock(rootDeviceEnvironment) {}
450+
int bindBufferObject(OsContext *osContext, uint32_t vmHandleId, BufferObject *bo) override { return -1; }
451+
int unbindBufferObject(OsContext *osContext, uint32_t vmHandleId, BufferObject *bo) override { return -1; }
452+
int getErrno() override { return EINVAL; }
453+
};
454+
455+
DebugManagerStateRestore restore;
456+
DebugManager.flags.PrintBOBindingResult.set(true);
457+
458+
auto executionEnvironment = new ExecutionEnvironment;
459+
executionEnvironment->setDebuggingEnabled();
460+
executionEnvironment->prepareRootDeviceEnvironments(1);
461+
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
462+
executionEnvironment->calculateMaxOsContextCount();
463+
executionEnvironment->rootDeviceEnvironments[0]->osInterface = std::make_unique<OSInterface>();
464+
465+
auto drm = new DrmMockToFailBindBufferObject(*executionEnvironment->rootDeviceEnvironments[0]);
466+
467+
executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(drm));
468+
executionEnvironment->rootDeviceEnvironments[0]->memoryOperationsInterface = DrmMemoryOperationsHandler::create(*drm, 0u);
469+
470+
std::unique_ptr<Device> device(MockDevice::createWithExecutionEnvironment<MockDevice>(defaultHwInfo.get(), executionEnvironment, 0));
471+
472+
auto osContextCount = device->getExecutionEnvironment()->memoryManager->getRegisteredEnginesCount();
473+
MockBufferObject bo(drm, 0, 0, osContextCount);
474+
475+
EXPECT_EQ(osContextCount, bo.bindInfo.size());
476+
477+
auto contextId = device->getExecutionEnvironment()->memoryManager->getRegisteredEnginesCount() / 2;
478+
auto osContext = device->getExecutionEnvironment()->memoryManager->getRegisteredEngines()[contextId].osContext;
479+
osContext->ensureContextInitialized();
480+
481+
testing::internal::CaptureStderr();
482+
483+
bo.bind(osContext, 0);
484+
EXPECT_FALSE(bo.bindInfo[contextId][0]);
485+
486+
std::string bindOutput = testing::internal::GetCapturedStderr();
487+
EXPECT_THAT(bindOutput.c_str(), testing::HasSubstr("bind BO-0 to VM 0, drmVmId = 1, range: 0 - 0, size: 0, result: -1, errno: 22"));
488+
489+
testing::internal::CaptureStderr();
490+
bo.bindInfo[contextId][0] = true;
491+
492+
bo.unbind(osContext, 0);
493+
EXPECT_TRUE(bo.bindInfo[contextId][0]);
494+
495+
std::string unbindOutput = testing::internal::GetCapturedStderr();
496+
EXPECT_THAT(unbindOutput.c_str(), testing::HasSubstr("unbind BO-0 from VM 0, drmVmId = 1, range: 0 - 0, size: 0, result: -1, errno: 22"));
497+
}
498+
395499
TEST(DrmBufferObject, whenBindExtHandleAddedThenItIsStored) {
396500
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
397501
executionEnvironment->prepareRootDeviceEnvironments(1);

shared/source/os_interface/linux/drm_buffer_object.cpp

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -179,16 +179,35 @@ int BufferObject::exec(uint32_t used, size_t startOffset, unsigned int flags, bo
179179
return err;
180180
}
181181

182+
void BufferObject::printBOBindingResult(OsContext *osContext, uint32_t vmHandleId, bool bind, int retVal) {
183+
if (retVal == 0) {
184+
if (bind) {
185+
PRINT_DEBUG_STRING(DebugManager.flags.PrintBOBindingResult.get(), stdout, "bind BO-%d to VM %u, drmVmId = %u, range: %llx - %llx, size: %lld, result: %d\n",
186+
this->handle, vmHandleId, static_cast<const OsContextLinux *>(osContext)->getDrmVmIds().size() ? static_cast<const OsContextLinux *>(osContext)->getDrmVmIds()[vmHandleId] : 0, this->gpuAddress, ptrOffset(this->gpuAddress, this->size), this->size, retVal);
187+
} else {
188+
PRINT_DEBUG_STRING(DebugManager.flags.PrintBOBindingResult.get(), stdout, "unbind BO-%d from VM %u, drmVmId = %u, range: %llx - %llx, size: %lld, result: %d\n",
189+
this->handle, vmHandleId, static_cast<const OsContextLinux *>(osContext)->getDrmVmIds().size() ? static_cast<const OsContextLinux *>(osContext)->getDrmVmIds()[vmHandleId] : 0, this->gpuAddress, ptrOffset(this->gpuAddress, this->size), this->size, retVal);
190+
}
191+
} else {
192+
auto err = this->drm->getErrno();
193+
if (bind) {
194+
PRINT_DEBUG_STRING(DebugManager.flags.PrintBOBindingResult.get(), stderr, "bind BO-%d to VM %u, drmVmId = %u, range: %llx - %llx, size: %lld, result: %d, errno: %d(%s)\n",
195+
this->handle, vmHandleId, static_cast<const OsContextLinux *>(osContext)->getDrmVmIds().size() ? static_cast<const OsContextLinux *>(osContext)->getDrmVmIds()[vmHandleId] : 0, this->gpuAddress, ptrOffset(this->gpuAddress, this->size), this->size, retVal, err, strerror(err));
196+
} else {
197+
PRINT_DEBUG_STRING(DebugManager.flags.PrintBOBindingResult.get(), stderr, "unbind BO-%d from VM %u, drmVmId = %u, range: %llx - %llx, size: %lld, result: %d, errno: %d(%s)\n",
198+
this->handle, vmHandleId, static_cast<const OsContextLinux *>(osContext)->getDrmVmIds().size() ? static_cast<const OsContextLinux *>(osContext)->getDrmVmIds()[vmHandleId] : 0, this->gpuAddress, ptrOffset(this->gpuAddress, this->size), this->size, retVal, err, strerror(err));
199+
}
200+
}
201+
}
202+
182203
int BufferObject::bind(OsContext *osContext, uint32_t vmHandleId) {
183204
int retVal = 0;
184205
auto contextId = getOsContextId(osContext);
185206
if (!this->bindInfo[contextId][vmHandleId]) {
186207
retVal = this->drm->bindBufferObject(osContext, vmHandleId, this);
187-
auto err = this->drm->getErrno();
188-
189-
PRINT_DEBUG_STRING(DebugManager.flags.PrintBOBindingResult.get(), stderr, "bind BO-%d to VM %u, drmVmId = %u, range: %llx - %llx, size: %lld, result: %d, errno: %d(%s)\n",
190-
this->handle, vmHandleId, static_cast<const OsContextLinux *>(osContext)->getDrmVmIds().size() ? static_cast<const OsContextLinux *>(osContext)->getDrmVmIds()[vmHandleId] : 0, this->gpuAddress, ptrOffset(this->gpuAddress, this->size), this->size, retVal, err, strerror(err));
191-
208+
if (DebugManager.flags.PrintBOBindingResult.get()) {
209+
printBOBindingResult(osContext, vmHandleId, true, retVal);
210+
}
192211
if (!retVal) {
193212
this->bindInfo[contextId][vmHandleId] = true;
194213
}
@@ -201,11 +220,9 @@ int BufferObject::unbind(OsContext *osContext, uint32_t vmHandleId) {
201220
auto contextId = getOsContextId(osContext);
202221
if (this->bindInfo[contextId][vmHandleId]) {
203222
retVal = this->drm->unbindBufferObject(osContext, vmHandleId, this);
204-
auto err = this->drm->getErrno();
205-
206-
PRINT_DEBUG_STRING(DebugManager.flags.PrintBOBindingResult.get(), stderr, "unbind BO-%d from VM %u, drmVmId = %u, range: %llx - %llx, size: %lld, result: %d, errno: %d(%s)\n",
207-
this->handle, vmHandleId, static_cast<const OsContextLinux *>(osContext)->getDrmVmIds().size() ? static_cast<const OsContextLinux *>(osContext)->getDrmVmIds()[vmHandleId] : 0, this->gpuAddress, ptrOffset(this->gpuAddress, this->size), this->size, retVal, err, strerror(err));
208-
223+
if (DebugManager.flags.PrintBOBindingResult.get()) {
224+
printBOBindingResult(osContext, vmHandleId, false, retVal);
225+
}
209226
if (!retVal) {
210227
this->bindInfo[contextId][vmHandleId] = false;
211228
}

shared/source/os_interface/linux/drm_buffer_object.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ class BufferObject {
156156
uint32_t getOsContextId(OsContext *osContext);
157157
MOCKABLE_VIRTUAL void fillExecObject(drm_i915_gem_exec_object2 &execObject, OsContext *osContext, uint32_t vmHandleId, uint32_t drmContextId);
158158
void fillExecObjectImpl(drm_i915_gem_exec_object2 &execObject, OsContext *osContext, uint32_t vmHandleId);
159+
void printBOBindingResult(OsContext *osContext, uint32_t vmHandleId, bool bind, int retVal);
159160

160161
void *lockedAddress; // CPU side virtual address
161162

shared/source/os_interface/linux/drm_neo.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,8 @@ class Drm : public DriverModel {
140140
bool createVirtualMemoryAddressSpace(uint32_t vmCount);
141141
void destroyVirtualMemoryAddressSpace();
142142
uint32_t getVirtualMemoryAddressSpace(uint32_t vmId);
143-
int bindBufferObject(OsContext *osContext, uint32_t vmHandleId, BufferObject *bo);
144-
int unbindBufferObject(OsContext *osContext, uint32_t vmHandleId, BufferObject *bo);
143+
MOCKABLE_VIRTUAL int bindBufferObject(OsContext *osContext, uint32_t vmHandleId, BufferObject *bo);
144+
MOCKABLE_VIRTUAL int unbindBufferObject(OsContext *osContext, uint32_t vmHandleId, BufferObject *bo);
145145
int setupHardwareInfo(DeviceDescriptor *, bool);
146146
void setupSystemInfo(HardwareInfo *hwInfo, SystemInfo *sysInfo);
147147
void setupCacheInfo(const HardwareInfo &hwInfo);

0 commit comments

Comments
 (0)