Fix storing VmIds in OsContextLinux

Related-To: NEO-5801

Signed-off-by: Mateusz Hoppe <mateusz.hoppe@intel.com>
This commit is contained in:
Mateusz Hoppe
2021-04-29 16:02:10 +00:00
committed by Compute-Runtime-Automation
parent 352254416f
commit 27c28d275e
2 changed files with 57 additions and 3 deletions

View File

@@ -523,7 +523,7 @@ TEST(DrmTest, givenDrmWithPerContextVMRequiredWhenCreatingOsContextsThenImplicit
EXPECT_EQ(0u, drmMock.receivedCreateContextId);
}
TEST(DrmTest, givenDrmWithPerContextVMRequiredWhenCreatingOsContextsThenImplicitVmIdPerContextIsQueriedAndStored) {
TEST(DrmTest, givenPerContextVMRequiredWhenCreatingOsContextsThenImplicitVmIdPerContextIsQueriedAndStored) {
auto &rootEnv = *platform()->peekExecutionEnvironment()->rootDeviceEnvironments[0];
rootEnv.executionEnvironment.setDebuggingEnabled();
@@ -538,11 +538,60 @@ TEST(DrmTest, givenDrmWithPerContextVMRequiredWhenCreatingOsContextsThenImplicit
EXPECT_EQ(1u, drmMock.receivedContextParamRequestCount);
auto &drmVmIds = osContext.getDrmVmIds();
EXPECT_EQ(1u, drmVmIds.size());
EXPECT_EQ(32u, drmVmIds.size());
EXPECT_EQ(20u, drmVmIds[0]);
}
TEST(DrmTest, givenPerContextVMRequiredWhenCreatingOsContextForSubDeviceThenImplicitVmIdPerContextIsQueriedAndStoredAtSubDeviceIndex) {
auto &rootEnv = *platform()->peekExecutionEnvironment()->rootDeviceEnvironments[0];
rootEnv.executionEnvironment.setDebuggingEnabled();
DrmMock drmMock(rootEnv);
EXPECT_TRUE(drmMock.requirePerContextVM);
drmMock.StoredRetValForVmId = 20;
DeviceBitfield deviceBitfield(1 << 3);
OsContextLinux osContext(drmMock, 0u, deviceBitfield, EngineTypeUsage{aub_stream::ENGINE_RCS, EngineUsage::Regular}, PreemptionMode::Disabled, false);
osContext.ensureContextInitialized();
EXPECT_EQ(0u, drmMock.receivedCreateContextId);
EXPECT_EQ(1u, drmMock.receivedContextParamRequestCount);
auto &drmVmIds = osContext.getDrmVmIds();
EXPECT_EQ(32u, drmVmIds.size());
EXPECT_EQ(20u, drmVmIds[3]);
EXPECT_EQ(0u, drmVmIds[0]);
EXPECT_EQ(0u, drmVmIds[2]);
}
TEST(DrmTest, givenPerContextVMRequiredWhenCreatingOsContextsForRootDeviceThenImplicitVmIdsPerContextAreQueriedAndStoredAtSubDeviceIndices) {
auto &rootEnv = *platform()->peekExecutionEnvironment()->rootDeviceEnvironments[0];
rootEnv.executionEnvironment.setDebuggingEnabled();
DrmMock drmMock(rootEnv);
EXPECT_TRUE(drmMock.requirePerContextVM);
drmMock.StoredRetValForVmId = 20;
DeviceBitfield deviceBitfield(1 | 1 << 1);
OsContextLinux osContext(drmMock, 0u, deviceBitfield, EngineTypeUsage{aub_stream::ENGINE_RCS, EngineUsage::Regular}, PreemptionMode::Disabled, false);
osContext.ensureContextInitialized();
EXPECT_EQ(0u, drmMock.receivedCreateContextId);
EXPECT_EQ(2u, drmMock.receivedContextParamRequestCount);
auto &drmVmIds = osContext.getDrmVmIds();
EXPECT_EQ(32u, drmVmIds.size());
EXPECT_EQ(20u, drmVmIds[0]);
EXPECT_EQ(20u, drmVmIds[1]);
EXPECT_EQ(0u, drmVmIds[2]);
EXPECT_EQ(0u, drmVmIds[31]);
}
TEST(DrmTest, givenNoPerContextVmsDrmWhenCreatingOsContextsThenVmIdIsNotQueriedAndStored) {
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
executionEnvironment->prepareRootDeviceEnvironments(1);

View File

@@ -43,6 +43,10 @@ void OsContextLinux::initializeContext() {
bool submitDirect = false;
this->isDirectSubmissionAvailable(*drm.getRootDeviceEnvironment().getHardwareInfo(), submitDirect);
if (drm.isPerContextVMRequired()) {
this->drmVmIds.resize(deviceBitfield.size(), 0);
}
for (auto deviceIndex = 0u; deviceIndex < deviceBitfield.size(); deviceIndex++) {
if (deviceBitfield.test(deviceIndex)) {
auto drmVmId = drm.getVirtualMemoryAddressSpace(deviceIndex);
@@ -74,7 +78,8 @@ void OsContextLinux::initializeContext() {
DEBUG_BREAK_IF(drmVmId == 0);
DEBUG_BREAK_IF(ret != 0);
UNUSED_VARIABLE(ret);
this->drmVmIds.push_back(drmVmId);
UNRECOVERABLE_IF(this->drmVmIds.size() <= deviceIndex);
this->drmVmIds[deviceIndex] = drmVmId;
}
}
}