diff --git a/opencl/source/dll/linux/drm_neo_create.cpp b/opencl/source/dll/linux/drm_neo_create.cpp index 98ff772e6b..9d85ede2ce 100644 --- a/opencl/source/dll/linux/drm_neo_create.cpp +++ b/opencl/source/dll/linux/drm_neo_create.cpp @@ -103,7 +103,9 @@ Drm *Drm::create(std::unique_ptr hwDeviceId, RootDeviceEnvironment & } } - drmObject->createVirtualMemoryAddressSpace(HwHelper::getSubDevicesCount(rootDeviceEnvironment.getHardwareInfo())); + if (!drmObject->createVirtualMemoryAddressSpace(HwHelper::getSubDevicesCount(rootDeviceEnvironment.getHardwareInfo()))) { + printDebugString(DebugManager.flags.PrintDebugMessages.get(), stderr, "%s", "INFO: Device doesn't support GEM Virtual Memory\n"); + } return drmObject.release(); } diff --git a/opencl/test/unit_test/linux/drm_wrap.h b/opencl/test/unit_test/linux/drm_wrap.h index 8b8ed44385..7b46f50359 100644 --- a/opencl/test/unit_test/linux/drm_wrap.h +++ b/opencl/test/unit_test/linux/drm_wrap.h @@ -15,6 +15,8 @@ class DrmWrap : public NEO::Drm { public: + using Drm::virtualMemoryIds; + static std::unique_ptr createDrm(RootDeviceEnvironment &rootDeviceEnvironment) { auto hwDeviceIds = OSInterface::discoverDevices(rootDeviceEnvironment.executionEnvironment); if (!hwDeviceIds.empty()) { diff --git a/opencl/test/unit_test/linux/main_linux_dll.cpp b/opencl/test/unit_test/linux/main_linux_dll.cpp index bb3e37c5f5..8424c9ac13 100644 --- a/opencl/test/unit_test/linux/main_linux_dll.cpp +++ b/opencl/test/unit_test/linux/main_linux_dll.cpp @@ -430,11 +430,23 @@ TEST_F(DrmTests, whenDrmIsCreatedWithMultipleSubDevicesThenCreateMultipleVirtual } } -TEST_F(DrmTests, givenDrmIsCreatedWhenCreateVirtualMemoryFailsThenCallAbort) { - VariableBackup backupFailOnVirtaualMemoryCreate(&failOnVirtualMemoryCreate); +TEST_F(DrmTests, givenDrmIsCreatedWhenCreateVirtualMemoryFailsThenReturnVirtualMemoryIdZeroAndPrintDebugMessage) { + DebugManagerStateRestore dbgRestorer; + DebugManager.flags.PrintDebugMessages.set(true); + + VariableBackup backupFailOnVirtualMemoryCreate(&failOnVirtualMemoryCreate); failOnVirtualMemoryCreate = -1; - EXPECT_THROW(DrmWrap::createDrm(*rootDeviceEnvironment), std::exception); + + ::testing::internal::CaptureStderr(); + auto drm = DrmWrap::createDrm(*rootDeviceEnvironment); + EXPECT_NE(drm, nullptr); + + EXPECT_EQ(0u, drm->getVirtualMemoryAddressSpace(0)); + EXPECT_EQ(0u, static_cast(drm.get())->virtualMemoryIds.size()); + + std::string errStr = ::testing::internal::GetCapturedStderr(); + EXPECT_THAT(errStr, ::testing::HasSubstr(std::string("INFO: Device doesn't support GEM Virtual Memory"))); } int main(int argc, char **argv) { diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index e1ce857ff6..764bb44350 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -215,11 +215,13 @@ void Drm::destroyDrmContext(uint32_t drmContextId) { UNRECOVERABLE_IF(retVal != 0); } -uint32_t Drm::createDrmVirtualMemory() { +int Drm::createDrmVirtualMemory(uint32_t &drmVmId) { drm_i915_gem_vm_control ctl = {}; auto ret = SysCalls::ioctl(getFileDescriptor(), DRM_IOCTL_I915_GEM_VM_CREATE, &ctl); - UNRECOVERABLE_IF(ret != 0); - return ctl.vm_id; + if (ret == 0) { + drmVmId = ctl.vm_id; + } + return ret; } void Drm::destroyDrmVirtualMemory(uint32_t drmVmId) { @@ -424,7 +426,10 @@ bool Drm::queryTopology(int &sliceCount, int &subSliceCount, int &euCount) { bool Drm::createVirtualMemoryAddressSpace(uint32_t vmCount) { for (auto i = 0u; i < vmCount; i++) { - auto id = createDrmVirtualMemory(); + uint32_t id = 0; + if (0 != createDrmVirtualMemory(id)) { + return false; + } virtualMemoryIds.push_back(id); } return true; @@ -437,8 +442,10 @@ void Drm::destroyVirtualMemoryAddressSpace() { } uint32_t Drm::getVirtualMemoryAddressSpace(uint32_t vmId) { - UNRECOVERABLE_IF(vmId >= virtualMemoryIds.size()) - return virtualMemoryIds[vmId]; + if (vmId < virtualMemoryIds.size()) { + return virtualMemoryIds[vmId]; + } + return 0; } Drm::~Drm() { diff --git a/shared/source/os_interface/linux/drm_neo.h b/shared/source/os_interface/linux/drm_neo.h index e348d4e03c..f69b303d42 100644 --- a/shared/source/os_interface/linux/drm_neo.h +++ b/shared/source/os_interface/linux/drm_neo.h @@ -67,7 +67,7 @@ class Drm { MOCKABLE_VIRTUAL void checkPreemptionSupport(); inline int getFileDescriptor() const { return hwDeviceId->getFileDescriptor(); } - uint32_t createDrmVirtualMemory(); + int createDrmVirtualMemory(uint32_t &drmVmId); void destroyDrmVirtualMemory(uint32_t drmVmId); uint32_t createDrmContext(uint32_t drmVmId); void destroyDrmContext(uint32_t drmContextId);