Drm create context with an implicit virtual memory address space

Related-To: NEO-4821

Change-Id: I18545d976788daacbb195e243f4049b7f83fd3a2
This commit is contained in:
Slawomir Milczarek
2020-07-14 04:36:16 +02:00
committed by sys_ocldev
parent 031ee61b5a
commit 3c4c7a0215
5 changed files with 34 additions and 11 deletions

View File

@ -103,7 +103,9 @@ Drm *Drm::create(std::unique_ptr<HwDeviceId> 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();
}

View File

@ -15,6 +15,8 @@
class DrmWrap : public NEO::Drm {
public:
using Drm::virtualMemoryIds;
static std::unique_ptr<NEO::Drm> createDrm(RootDeviceEnvironment &rootDeviceEnvironment) {
auto hwDeviceIds = OSInterface::discoverDevices(rootDeviceEnvironment.executionEnvironment);
if (!hwDeviceIds.empty()) {

View File

@ -430,11 +430,23 @@ TEST_F(DrmTests, whenDrmIsCreatedWithMultipleSubDevicesThenCreateMultipleVirtual
}
}
TEST_F(DrmTests, givenDrmIsCreatedWhenCreateVirtualMemoryFailsThenCallAbort) {
VariableBackup<decltype(failOnVirtualMemoryCreate)> backupFailOnVirtaualMemoryCreate(&failOnVirtualMemoryCreate);
TEST_F(DrmTests, givenDrmIsCreatedWhenCreateVirtualMemoryFailsThenReturnVirtualMemoryIdZeroAndPrintDebugMessage) {
DebugManagerStateRestore dbgRestorer;
DebugManager.flags.PrintDebugMessages.set(true);
VariableBackup<decltype(failOnVirtualMemoryCreate)> 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<DrmWrap *>(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) {

View File

@ -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())
if (vmId < virtualMemoryIds.size()) {
return virtualMemoryIds[vmId];
}
return 0;
}
Drm::~Drm() {

View File

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