Skip to content

Commit 930ca00

Browse files
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 <[email protected]>
1 parent 797f395 commit 930ca00

File tree

5 files changed

+32
-11
lines changed

5 files changed

+32
-11
lines changed

shared/source/os_interface/linux/drm_command_stream_bdw_and_later.inl

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,7 @@ SubmissionStatus DrmCommandStreamReceiver<GfxFamily>::flushInternal(const BatchB
1919

2020
int ret = this->exec(batchBuffer, 0u, static_cast<const OsContextLinux *>(osContext)->getDrmContextIds()[0], 0);
2121

22-
if (ret) {
23-
if (ret == EWOULDBLOCK) {
24-
return SubmissionStatus::OUT_OF_HOST_MEMORY;
25-
}
26-
return SubmissionStatus::FAILED;
27-
}
28-
return SubmissionStatus::SUCCESS;
22+
return Drm::getSubmissionStatusFromReturnCode(ret);
2923
}
3024

3125
template <typename GfxFamily>

shared/source/os_interface/linux/drm_command_stream_xehp_and_later.inl

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,7 @@ SubmissionStatus DrmCommandStreamReceiver<GfxFamily>::flushInternal(const BatchB
3939

4040
int ret = this->exec(batchBuffer, tileIterator, drmContextIds[contextIndex], contextIndex);
4141
if (ret) {
42-
if (ret == EWOULDBLOCK) {
43-
return SubmissionStatus::OUT_OF_HOST_MEMORY;
44-
}
45-
return SubmissionStatus::FAILED;
42+
return Drm::getSubmissionStatusFromReturnCode(ret);
4643
}
4744

4845
contextIndex++;

shared/source/os_interface/linux/drm_neo.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include "drm_neo.h"
99

10+
#include "shared/source/command_stream/submission_status.h"
1011
#include "shared/source/debug_settings/debug_settings_manager.h"
1112
#include "shared/source/execution_environment/execution_environment.h"
1213
#include "shared/source/execution_environment/root_device_environment.h"
@@ -51,6 +52,21 @@ Drm::Drm(std::unique_ptr<HwDeviceIdDrm> &&hwDeviceIdIn, RootDeviceEnvironment &r
5152
fenceVal.fill(0u);
5253
}
5354

55+
SubmissionStatus Drm::getSubmissionStatusFromReturnCode(int32_t retCode) {
56+
switch (retCode) {
57+
case 0:
58+
return SubmissionStatus::SUCCESS;
59+
case EWOULDBLOCK:
60+
case ENOMEM:
61+
case ENOSPC:
62+
return SubmissionStatus::OUT_OF_HOST_MEMORY;
63+
case ENXIO:
64+
return SubmissionStatus::OUT_OF_MEMORY;
65+
default:
66+
return SubmissionStatus::FAILED;
67+
}
68+
}
69+
5470
void Drm::queryAndSetVmBindPatIndexProgrammingSupport() {
5571
auto hwInfo = rootDeviceEnvironment.getHardwareInfo();
5672

shared/source/os_interface/linux/drm_neo.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ namespace NEO {
4242
constexpr uint32_t contextPrivateParamBoost = 0x80000000;
4343

4444
enum class AllocationType;
45+
enum class SubmissionStatus : uint32_t;
46+
4547
class BufferObject;
4648
class DeviceFactory;
4749
class OsContext;
@@ -67,6 +69,8 @@ class Drm : public DriverModel {
6769
static constexpr DriverModelType driverModelType = DriverModelType::DRM;
6870
static constexpr size_t completionFenceOffset = 1024;
6971

72+
static SubmissionStatus getSubmissionStatusFromReturnCode(int32_t retCode);
73+
7074
struct QueryTopologyData {
7175
int sliceCount;
7276
int subSliceCount;

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*
66
*/
77

8+
#include "shared/source/command_stream/submission_status.h"
89
#include "shared/source/helpers/file_io.h"
910
#include "shared/source/helpers/hw_info.h"
1011
#include "shared/source/os_interface/device_factory.h"
@@ -38,6 +39,15 @@ std::string getLinuxDevicesPath(const char *file) {
3839
return resultString;
3940
}
4041

42+
TEST(DrmTest, whenGettingSubmissionStatusFromReturnCodeThenProperValueIsReturned) {
43+
EXPECT_EQ(SubmissionStatus::SUCCESS, Drm::getSubmissionStatusFromReturnCode(0));
44+
EXPECT_EQ(SubmissionStatus::OUT_OF_HOST_MEMORY, Drm::getSubmissionStatusFromReturnCode(EWOULDBLOCK));
45+
EXPECT_EQ(SubmissionStatus::OUT_OF_HOST_MEMORY, Drm::getSubmissionStatusFromReturnCode(ENOSPC));
46+
EXPECT_EQ(SubmissionStatus::OUT_OF_HOST_MEMORY, Drm::getSubmissionStatusFromReturnCode(ENOMEM));
47+
EXPECT_EQ(SubmissionStatus::OUT_OF_MEMORY, Drm::getSubmissionStatusFromReturnCode(ENXIO));
48+
EXPECT_EQ(SubmissionStatus::FAILED, Drm::getSubmissionStatusFromReturnCode(EBUSY));
49+
}
50+
4151
TEST(DrmTest, GivenValidPciPathWhenGettingAdapterBdfThenCorrectValuesAreReturned) {
4252
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
4353
DrmMock drm{*executionEnvironment->rootDeviceEnvironments[0]};

0 commit comments

Comments
 (0)