diff --git a/shared/source/os_interface/linux/drm_buffer_object.cpp b/shared/source/os_interface/linux/drm_buffer_object.cpp index 2b921dca2d..4aa51c631e 100644 --- a/shared/source/os_interface/linux/drm_buffer_object.cpp +++ b/shared/source/os_interface/linux/drm_buffer_object.cpp @@ -120,7 +120,6 @@ bool BufferObject::close() { GemClose close{}; close.handle = this->handle.getBoHandle(); - close.userptr = this->userptr; PRINT_DEBUG_STRING(debugManager.flags.PrintBOCreateDestroyResult.get(), stdout, "Calling gem close on handle: BO-%d\n", this->handle.getBoHandle()); diff --git a/shared/source/os_interface/linux/drm_buffer_object.h b/shared/source/os_interface/linux/drm_buffer_object.h index a111e0c9cd..c69ce84dc1 100644 --- a/shared/source/os_interface/linux/drm_buffer_object.h +++ b/shared/source/os_interface/linux/drm_buffer_object.h @@ -214,9 +214,6 @@ class BufferObject { BOType peekBOType() const { return boType; } void setBOType(BOType newBoType) { this->boType = newBoType; } - void setUserptr(uint64_t ptr) { this->userptr = ptr; }; - uint64_t getUserptr() const { return this->userptr; }; - static constexpr int gpuHangDetected{-7171}; uint32_t getOsContextId(OsContext *osContext); @@ -248,7 +245,6 @@ class BufferObject { uint64_t size; uint64_t unmapSize = 0; uint64_t patIndex = CommonConstants::unsupportedPatIndex; - uint64_t userptr = 0u; CacheRegion cacheRegion = CacheRegion::defaultRegion; CachePolicy cachePolicy = CachePolicy::writeBack; StackVec bindExtHandles; diff --git a/shared/source/os_interface/linux/drm_memory_manager.cpp b/shared/source/os_interface/linux/drm_memory_manager.cpp index 066845cea2..f7c15908f4 100644 --- a/shared/source/os_interface/linux/drm_memory_manager.cpp +++ b/shared/source/os_interface/linux/drm_memory_manager.cpp @@ -321,9 +321,8 @@ NEO::BufferObject *DrmMemoryManager::allocUserptr(uintptr_t address, size_t size DEBUG_BREAK_IF(true); return nullptr; } - res->setAddress(address); - res->setUserptr(address); + return res; } diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index 325b9de497..cafc2e6849 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -1312,7 +1312,6 @@ int changeBufferObjectBinding(Drm *drm, OsContext *osContext, uint32_t vmHandleI vmBind.length = bo->peekSize(); vmBind.offset = 0; vmBind.start = bo->peekAddress(); - vmBind.userptr = bo->getUserptr(); if (bo->getColourWithBind()) { vmBind.length = bo->getColourChunk(); diff --git a/shared/source/os_interface/linux/drm_wrappers.h b/shared/source/os_interface/linux/drm_wrappers.h index 0108bb3136..a83eeafbde 100644 --- a/shared/source/os_interface/linux/drm_wrappers.h +++ b/shared/source/os_interface/linux/drm_wrappers.h @@ -179,7 +179,6 @@ struct Query { struct GemClose { uint32_t handle; uint32_t reserved; - uint64_t userptr; }; struct PrimeHandle { diff --git a/shared/source/os_interface/linux/drm_wrappers_checks.cpp b/shared/source/os_interface/linux/drm_wrappers_checks.cpp index 15910166fd..92bf35fcde 100644 --- a/shared/source/os_interface/linux/drm_wrappers_checks.cpp +++ b/shared/source/os_interface/linux/drm_wrappers_checks.cpp @@ -137,7 +137,7 @@ static_assert(offsetof(Query, numItems) == offsetof(struct drm_i915_query, num_i static_assert(offsetof(Query, flags) == offsetof(struct drm_i915_query, flags)); static_assert(offsetof(Query, itemsPtr) == offsetof(struct drm_i915_query, items_ptr)); -static_assert(sizeof(GemClose) >= sizeof(drm_gem_close)); +static_assert(sizeof(GemClose) == sizeof(drm_gem_close)); static_assert(offsetof(GemClose, handle) == offsetof(drm_gem_close, handle)); static_assert(offsetof(GemClose, reserved) == offsetof(drm_gem_close, pad)); diff --git a/shared/source/os_interface/linux/ioctl_helper.h b/shared/source/os_interface/linux/ioctl_helper.h index 24b160ba93..e40ca5bbd9 100644 --- a/shared/source/os_interface/linux/ioctl_helper.h +++ b/shared/source/os_interface/linux/ioctl_helper.h @@ -65,7 +65,6 @@ struct VmBindParams { uint64_t extensions; uint64_t userFence; uint64_t patIndex; - uint64_t userptr; }; struct UuidRegisterResult { diff --git a/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp b/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp index ceafb16e8c..5d3392f9d2 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp @@ -38,6 +38,9 @@ #define STRINGIFY_ME(X) return #X #define RETURN_ME(X) return X +#define XE_USERPTR_FAKE_FLAG 0x800000 +#define XE_USERPTR_FAKE_MASK 0x7FFFFF + namespace NEO { const char *IoctlHelperXe::xeGetClassName(int className) { @@ -967,7 +970,8 @@ int IoctlHelperXe::ioctl(DrmIoctl request, void *arg) { } break; case DrmIoctl::gemUserptr: { GemUserPtr *d = static_cast(arg); - updateBindInfo(0, d->userPtr, d->userSize); + d->handle = userPtrHandle++ | XE_USERPTR_FAKE_FLAG; + updateBindInfo(d->handle, d->userPtr, d->userSize); ret = 0; xeLog(" -> IoctlHelperXe::ioctl GemUserptr p=0x%llx s=0x%llx f=0x%x h=0x%x r=%d\n", d->userPtr, d->userSize, d->flags, d->handle, ret); @@ -1045,17 +1049,11 @@ int IoctlHelperXe::ioctl(DrmIoctl request, void *arg) { struct GemClose *d = static_cast(arg); int found = -1; xeShowBindTable(); - bool isUserptr = false; for (unsigned int i = 0; i < bindInfo.size(); i++) { - if (d->handle && d->handle == bindInfo[i].handle) { + if (d->handle == bindInfo[i].handle) { found = i; break; } - if (d->userptr && d->userptr == bindInfo[i].userptr) { - found = i; - isUserptr = true; - break; - } } if (found != -1) { xeLog(" removing %d: 0x%x 0x%lx 0x%lx\n", @@ -1067,7 +1065,7 @@ int IoctlHelperXe::ioctl(DrmIoctl request, void *arg) { std::unique_lock lock(xeLock); bindInfo.erase(bindInfo.begin() + found); } - if (isUserptr) { + if (d->handle & XE_USERPTR_FAKE_FLAG) { // nothing to do under XE ret = 0; } else { @@ -1264,11 +1262,7 @@ int IoctlHelperXe::xeVmBind(const VmBindParams &vmBindParams, bool isBind) { if (isBind) { for (auto i = 0u; i < bindInfo.size(); i++) { - if (vmBindParams.handle && vmBindParams.handle == bindInfo[i].handle) { - index = i; - break; - } - if (vmBindParams.userptr && vmBindParams.userptr == bindInfo[i].userptr) { + if (vmBindParams.handle == bindInfo[i].handle) { index = i; break; } @@ -1309,7 +1303,7 @@ int IoctlHelperXe::xeVmBind(const VmBindParams &vmBindParams, bool isBind) { if (isBind) { bind.bind.op = DRM_XE_VM_BIND_OP_MAP; bind.bind.obj = vmBindParams.handle; - if (bindInfo[index].userptr) { + if (bindInfo[index].handle & XE_USERPTR_FAKE_FLAG) { bind.bind.op = DRM_XE_VM_BIND_OP_MAP_USERPTR; bind.bind.obj = 0; bind.bind.obj_offset = bindInfo[index].userptr; @@ -1317,7 +1311,7 @@ int IoctlHelperXe::xeVmBind(const VmBindParams &vmBindParams, bool isBind) { } else { bind.bind.op = DRM_XE_VM_BIND_OP_UNMAP; bind.bind.obj = 0; - if (bindInfo[index].userptr) { + if (bindInfo[index].handle & XE_USERPTR_FAKE_FLAG) { bind.bind.obj_offset = bindInfo[index].userptr; } } diff --git a/shared/source/os_interface/linux/xe/ioctl_helper_xe.h b/shared/source/os_interface/linux/xe/ioctl_helper_xe.h index 38e3c2ae90..4a60b013fd 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe.h +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe.h @@ -175,6 +175,7 @@ class IoctlHelperXe : public IoctlHelper { int defaultAlignment = 0; int hasVram = 0; uint32_t xeVmId = 0; + uint32_t userPtrHandle = 0; int xeFileHandle = 0; std::mutex xeLock; std::vector bindInfo; diff --git a/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp index bacad8a046..5789942f05 100644 --- a/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp @@ -1048,7 +1048,7 @@ TEST_F(DrmMemoryManagerTest, WhenAskedButNotAllowedHostPtrThenDoNotPinAfterAlloc TEST_F(DrmMemoryManagerTest, WhenUnreferenceIsCalledThenCallSucceeds) { mock->ioctlExpected.gemUserptr = 1; mock->ioctlExpected.gemClose = 1; - BufferObject *bo = memoryManager->allocUserptr(1234, (size_t)1024, rootDeviceIndex); + BufferObject *bo = memoryManager->allocUserptr(0, (size_t)1024, rootDeviceIndex); ASSERT_NE(nullptr, bo); memoryManager->unreference(bo, false); } diff --git a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp index 0eb2a80e10..3b2e3295a7 100644 --- a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp @@ -533,14 +533,11 @@ TEST(IoctlHelperXeTest, whenCallingIoctlThenProperValueIsReturned) { drm.testMode(0); { GemUserPtr test = {}; - test.userPtr = 2; + test.handle = 1; ret = mockXeIoctlHelper->ioctl(DrmIoctl::gemUserptr, &test); EXPECT_EQ(0, ret); - - EXPECT_EQ(test.userPtr, mockXeIoctlHelper->bindInfo[0].userptr); - EXPECT_EQ(0u, mockXeIoctlHelper->bindInfo[0].handle); GemClose cl = {}; - cl.userptr = test.userPtr; + cl.handle = test.handle; ret = mockXeIoctlHelper->ioctl(DrmIoctl::gemClose, &cl); EXPECT_EQ(0, ret); } @@ -645,7 +642,6 @@ TEST(IoctlHelperXeTest, whenCallingIoctlThenProperValueIsReturned) { } { GemClose test = {}; - test.handle = 1; ret = mockXeIoctlHelper->ioctl(DrmIoctl::gemClose, &test); EXPECT_EQ(0, ret); } @@ -1770,120 +1766,3 @@ TEST(IoctlHelperXeTest, whenCallingGetStatusAndFlagsForResetStatsThenZeroIsRetur EXPECT_FALSE(ioctlHelper->validPageFault(0u)); } - -TEST(IoctlHelperXeTest, givenMultipleBindInfosWhenGemCloseIsCalledThenProperHandleIsTaken) { - auto executionEnvironment = std::make_unique(); - DrmMockXe drm{*executionEnvironment->rootDeviceEnvironments[0]}; - - auto ioctlHelper = std::make_unique(drm); - - drm.gemCloseCalled = 0; - - BindInfo bindInfo{}; - - bindInfo.handle = 1; - ioctlHelper->bindInfo.push_back(bindInfo); - bindInfo.handle = 2; - ioctlHelper->bindInfo.push_back(bindInfo); - - bindInfo = {}; - bindInfo.userptr = 1; - ioctlHelper->bindInfo.push_back(bindInfo); - bindInfo.userptr = 2; - ioctlHelper->bindInfo.push_back(bindInfo); - - GemClose gemClose{}; - gemClose.handle = 0; - gemClose.userptr = 2; - EXPECT_EQ(0, ioctlHelper->ioctl(DrmIoctl::gemClose, &gemClose)); - EXPECT_EQ(0, drm.gemCloseCalled); - - gemClose.handle = 2; - gemClose.userptr = 0; - EXPECT_EQ(0, ioctlHelper->ioctl(DrmIoctl::gemClose, &gemClose)); - EXPECT_EQ(1, drm.gemCloseCalled); - EXPECT_EQ(2u, drm.passedGemClose.handle); - - gemClose.handle = 0; - gemClose.userptr = 1; - EXPECT_EQ(0, ioctlHelper->ioctl(DrmIoctl::gemClose, &gemClose)); - EXPECT_EQ(1, drm.gemCloseCalled); - - gemClose.handle = 1; - gemClose.userptr = 0; - EXPECT_EQ(0, ioctlHelper->ioctl(DrmIoctl::gemClose, &gemClose)); - EXPECT_EQ(2, drm.gemCloseCalled); - EXPECT_EQ(1u, drm.passedGemClose.handle); - - EXPECT_EQ(0ul, ioctlHelper->bindInfo.size()); -} - -TEST(IoctlHelperXeTest, givenMultipleBindInfosWhenVmBindIsCalledThenProperHandleIsTaken) { - auto executionEnvironment = std::make_unique(); - DrmMockXe drm{*executionEnvironment->rootDeviceEnvironments[0]}; - - auto ioctlHelper = std::make_unique(drm); - - drm.vmBindInputs.clear(); - - BindInfo bindInfo{}; - - bindInfo.handle = 1; - ioctlHelper->bindInfo.push_back(bindInfo); - bindInfo.handle = 2; - ioctlHelper->bindInfo.push_back(bindInfo); - - bindInfo = {}; - bindInfo.userptr = 1; - ioctlHelper->bindInfo.push_back(bindInfo); - bindInfo.userptr = 2; - ioctlHelper->bindInfo.push_back(bindInfo); - - MockIoctlHelperXe::UserFenceExtension userFence{}; - userFence.tag = userFence.tagValue; - VmBindParams vmBindParams{}; - vmBindParams.userFence = castToUint64(&userFence); - vmBindParams.handle = 0; - vmBindParams.userptr = 2; - EXPECT_EQ(0, ioctlHelper->vmBind(vmBindParams)); - - EXPECT_EQ(1ul, drm.vmBindInputs.size()); - EXPECT_EQ(0u, drm.vmBindInputs[0].bind.obj); - EXPECT_EQ(2u, drm.vmBindInputs[0].bind.obj_offset); - drm.vmBindInputs.clear(); - - vmBindParams.handle = 2; - vmBindParams.userptr = 0; - EXPECT_EQ(0, ioctlHelper->vmBind(vmBindParams)); - - EXPECT_EQ(1ul, drm.vmBindInputs.size()); - EXPECT_EQ(2u, drm.vmBindInputs[0].bind.obj); - EXPECT_EQ(0u, drm.vmBindInputs[0].bind.obj_offset); - drm.vmBindInputs.clear(); - - vmBindParams.handle = 0; - vmBindParams.userptr = 1; - EXPECT_EQ(0, ioctlHelper->vmBind(vmBindParams)); - - EXPECT_EQ(1ul, drm.vmBindInputs.size()); - EXPECT_EQ(0u, drm.vmBindInputs[0].bind.obj); - EXPECT_EQ(1u, drm.vmBindInputs[0].bind.obj_offset); - drm.vmBindInputs.clear(); - - vmBindParams.handle = 1; - vmBindParams.userptr = 0; - EXPECT_EQ(0, ioctlHelper->vmBind(vmBindParams)); - - EXPECT_EQ(1ul, drm.vmBindInputs.size()); - EXPECT_EQ(1u, drm.vmBindInputs[0].bind.obj); - EXPECT_EQ(0u, drm.vmBindInputs[0].bind.obj_offset); - drm.vmBindInputs.clear(); - - vmBindParams.handle = 0; - vmBindParams.userptr = 0; - EXPECT_NE(0, ioctlHelper->vmBind(vmBindParams)); - - EXPECT_EQ(0ul, drm.vmBindInputs.size()); - - ioctlHelper->bindInfo.clear(); -} diff --git a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.h b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.h index c74dd22d74..6e74fcc1c0 100644 --- a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.h +++ b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.h @@ -33,7 +33,6 @@ struct MockIoctlHelperXe : IoctlHelperXe { using IoctlHelperXe::getFdFromVmExport; using IoctlHelperXe::IoctlHelperXe; using IoctlHelperXe::setDefaultEngine; - using IoctlHelperXe::UserFenceExtension; using IoctlHelperXe::xeFindMatchingEngine; using IoctlHelperXe::xeGetBindFlagsName; using IoctlHelperXe::xeGetBindOperationName; @@ -135,15 +134,10 @@ class DrmMockXe : public DrmMockCustom { v->vm_id = testValueVmId; ret = 0; } break; - case DrmIoctl::gemUserptr: { + case DrmIoctl::gemUserptr: + case DrmIoctl::gemClose: ret = 0; - } break; - case DrmIoctl::gemClose: { - auto gemClose = reinterpret_cast(arg); - passedGemClose = *gemClose; - gemCloseCalled++; - ret = 0; - } break; + break; case DrmIoctl::gemVmDestroy: { struct drm_xe_vm_destroy *v = static_cast(arg); if (v->vm_id == testValueVmId) @@ -271,8 +265,6 @@ class DrmMockXe : public DrmMockCustom { int forceIoctlAnswer = 0; int setIoctlAnswer = 0; int gemVmBindReturn = 0; - GemClose passedGemClose{}; - int gemCloseCalled = 0; static_assert(sizeof(drm_xe_engine) == 4 * sizeof(uint64_t), ""); uint64_t queryEngines[45]{}; // 1 qword for num engines and 4 qwords per engine