From 930ca001a1c98ebeda29e21bfb12bcdc0e2b94f3 Mon Sep 17 00:00:00 2001 From: Mateusz Jablonski Date: Fri, 4 Nov 2022 09:43:54 +0000 Subject: [PATCH] Add a layer to translate exec buffer error to SubmissionStatus value handle errors: EWOULDBLOCK, ENOSPC, ENOMEM, ENXIO Related-To: NEO-7144, NEO-7412 Signed-off-by: Mateusz Jablonski --- .../linux/drm_command_stream_bdw_and_later.inl | 8 +------- .../linux/drm_command_stream_xehp_and_later.inl | 5 +---- shared/source/os_interface/linux/drm_neo.cpp | 16 ++++++++++++++++ shared/source/os_interface/linux/drm_neo.h | 4 ++++ .../unit_test/os_interface/linux/drm_tests.cpp | 10 ++++++++++ 5 files changed, 32 insertions(+), 11 deletions(-) diff --git a/shared/source/os_interface/linux/drm_command_stream_bdw_and_later.inl b/shared/source/os_interface/linux/drm_command_stream_bdw_and_later.inl index a229c7b686..c545c74ef6 100644 --- a/shared/source/os_interface/linux/drm_command_stream_bdw_and_later.inl +++ b/shared/source/os_interface/linux/drm_command_stream_bdw_and_later.inl @@ -19,13 +19,7 @@ SubmissionStatus DrmCommandStreamReceiver::flushInternal(const BatchB int ret = this->exec(batchBuffer, 0u, static_cast(osContext)->getDrmContextIds()[0], 0); - if (ret) { - if (ret == EWOULDBLOCK) { - return SubmissionStatus::OUT_OF_HOST_MEMORY; - } - return SubmissionStatus::FAILED; - } - return SubmissionStatus::SUCCESS; + return Drm::getSubmissionStatusFromReturnCode(ret); } template diff --git a/shared/source/os_interface/linux/drm_command_stream_xehp_and_later.inl b/shared/source/os_interface/linux/drm_command_stream_xehp_and_later.inl index 2a84a42c54..eff9868b25 100644 --- a/shared/source/os_interface/linux/drm_command_stream_xehp_and_later.inl +++ b/shared/source/os_interface/linux/drm_command_stream_xehp_and_later.inl @@ -39,10 +39,7 @@ SubmissionStatus DrmCommandStreamReceiver::flushInternal(const BatchB int ret = this->exec(batchBuffer, tileIterator, drmContextIds[contextIndex], contextIndex); if (ret) { - if (ret == EWOULDBLOCK) { - return SubmissionStatus::OUT_OF_HOST_MEMORY; - } - return SubmissionStatus::FAILED; + return Drm::getSubmissionStatusFromReturnCode(ret); } contextIndex++; diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index 36453b77b4..6ec8438dd4 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -7,6 +7,7 @@ #include "drm_neo.h" +#include "shared/source/command_stream/submission_status.h" #include "shared/source/debug_settings/debug_settings_manager.h" #include "shared/source/execution_environment/execution_environment.h" #include "shared/source/execution_environment/root_device_environment.h" @@ -51,6 +52,21 @@ Drm::Drm(std::unique_ptr &&hwDeviceIdIn, RootDeviceEnvironment &r fenceVal.fill(0u); } +SubmissionStatus Drm::getSubmissionStatusFromReturnCode(int32_t retCode) { + switch (retCode) { + case 0: + return SubmissionStatus::SUCCESS; + case EWOULDBLOCK: + case ENOMEM: + case ENOSPC: + return SubmissionStatus::OUT_OF_HOST_MEMORY; + case ENXIO: + return SubmissionStatus::OUT_OF_MEMORY; + default: + return SubmissionStatus::FAILED; + } +} + void Drm::queryAndSetVmBindPatIndexProgrammingSupport() { auto hwInfo = rootDeviceEnvironment.getHardwareInfo(); diff --git a/shared/source/os_interface/linux/drm_neo.h b/shared/source/os_interface/linux/drm_neo.h index 3e94503c58..2576162c42 100644 --- a/shared/source/os_interface/linux/drm_neo.h +++ b/shared/source/os_interface/linux/drm_neo.h @@ -42,6 +42,8 @@ namespace NEO { constexpr uint32_t contextPrivateParamBoost = 0x80000000; enum class AllocationType; +enum class SubmissionStatus : uint32_t; + class BufferObject; class DeviceFactory; class OsContext; @@ -67,6 +69,8 @@ class Drm : public DriverModel { static constexpr DriverModelType driverModelType = DriverModelType::DRM; static constexpr size_t completionFenceOffset = 1024; + static SubmissionStatus getSubmissionStatusFromReturnCode(int32_t retCode); + struct QueryTopologyData { int sliceCount; int subSliceCount; diff --git a/shared/test/unit_test/os_interface/linux/drm_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_tests.cpp index 431e22f352..8a039acf4b 100644 --- a/shared/test/unit_test/os_interface/linux/drm_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_tests.cpp @@ -5,6 +5,7 @@ * */ +#include "shared/source/command_stream/submission_status.h" #include "shared/source/helpers/file_io.h" #include "shared/source/helpers/hw_info.h" #include "shared/source/os_interface/device_factory.h" @@ -38,6 +39,15 @@ std::string getLinuxDevicesPath(const char *file) { return resultString; } +TEST(DrmTest, whenGettingSubmissionStatusFromReturnCodeThenProperValueIsReturned) { + EXPECT_EQ(SubmissionStatus::SUCCESS, Drm::getSubmissionStatusFromReturnCode(0)); + EXPECT_EQ(SubmissionStatus::OUT_OF_HOST_MEMORY, Drm::getSubmissionStatusFromReturnCode(EWOULDBLOCK)); + EXPECT_EQ(SubmissionStatus::OUT_OF_HOST_MEMORY, Drm::getSubmissionStatusFromReturnCode(ENOSPC)); + EXPECT_EQ(SubmissionStatus::OUT_OF_HOST_MEMORY, Drm::getSubmissionStatusFromReturnCode(ENOMEM)); + EXPECT_EQ(SubmissionStatus::OUT_OF_MEMORY, Drm::getSubmissionStatusFromReturnCode(ENXIO)); + EXPECT_EQ(SubmissionStatus::FAILED, Drm::getSubmissionStatusFromReturnCode(EBUSY)); +} + TEST(DrmTest, GivenValidPciPathWhenGettingAdapterBdfThenCorrectValuesAreReturned) { auto executionEnvironment = std::make_unique(); DrmMock drm{*executionEnvironment->rootDeviceEnvironments[0]};