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 <mateusz.jablonski@intel.com>
This commit is contained in:
Mateusz Jablonski 2022-11-04 09:43:54 +00:00 committed by Compute-Runtime-Automation
parent 797f395f0e
commit 930ca001a1
5 changed files with 32 additions and 11 deletions

View File

@ -19,13 +19,7 @@ SubmissionStatus DrmCommandStreamReceiver<GfxFamily>::flushInternal(const BatchB
int ret = this->exec(batchBuffer, 0u, static_cast<const OsContextLinux *>(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 <typename GfxFamily>

View File

@ -39,10 +39,7 @@ SubmissionStatus DrmCommandStreamReceiver<GfxFamily>::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++;

View File

@ -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<HwDeviceIdDrm> &&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();

View File

@ -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;

View File

@ -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<MockExecutionEnvironment>();
DrmMock drm{*executionEnvironment->rootDeviceEnvironments[0]};