Skip to content

Commit b488799

Browse files
feature: add support for new vm bind flags based on upstream xe kernel
support for DRM_XE_VM_BIND_FLAG_IMMEDIATE and DRM_XE_VM_BIND_FLAG_READONLY Fixes: #717 Related-To: NEO-10958 Signed-off-by: Mateusz Jablonski <[email protected]>
1 parent 27c2359 commit b488799

File tree

5 files changed

+127
-22
lines changed

5 files changed

+127
-22
lines changed

shared/source/os_interface/linux/xe/CMakeLists.txt

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ set(NEO_CORE_OS_INTERFACE_LINUX_XE
1111
${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_xe.cpp
1212
${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_xe.h
1313
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/ioctl_helper_xe_query_hw_ip_version.cpp
14-
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/ioctl_helper_xe_vm_bind_flags.cpp
1514
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/ioctl_helper_xe_perf.cpp
1615
)
1716

shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp

+47-4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "shared/source/execution_environment/execution_environment.h"
1212
#include "shared/source/execution_environment/root_device_environment.h"
1313
#include "shared/source/gmm_helper/gmm_helper.h"
14+
#include "shared/source/helpers/aligned_memory.h"
1415
#include "shared/source/helpers/basic_math.h"
1516
#include "shared/source/helpers/common_types.h"
1617
#include "shared/source/helpers/constants.h"
@@ -791,13 +792,19 @@ bool IoctlHelperXe::completionFenceExtensionSupported(const bool isVmBindAvailab
791792
}
792793

793794
uint64_t IoctlHelperXe::getFlagsForVmBind(bool bindCapture, bool bindImmediate, bool bindMakeResident, bool bindLock, bool readOnlyResource) {
794-
uint64_t ret = 0;
795+
uint64_t flags = 0;
795796
xeLog(" -> IoctlHelperXe::%s %d %d %d %d %d\n", __FUNCTION__, bindCapture, bindImmediate, bindMakeResident, bindLock, readOnlyResource);
796797
if (bindCapture) {
797-
ret |= DRM_XE_VM_BIND_FLAG_DUMPABLE;
798+
flags |= DRM_XE_VM_BIND_FLAG_DUMPABLE;
798799
}
799-
ret |= getAdditionalFlagsForVmBind(bindImmediate, readOnlyResource);
800-
return ret;
800+
if (bindImmediate && supportedFeatures.flags.vmBindImmediate) {
801+
flags |= DRM_XE_VM_BIND_FLAG_IMMEDIATE;
802+
}
803+
804+
if (readOnlyResource && supportedFeatures.flags.vmBindReadOnly) {
805+
flags |= DRM_XE_VM_BIND_FLAG_READONLY;
806+
}
807+
return flags;
801808
}
802809

803810
int IoctlHelperXe::queryDistances(std::vector<QueryItem> &queryItems, std::vector<DistanceInfo> &distanceInfos) {
@@ -1592,4 +1599,40 @@ std::string IoctlHelperXe::getIoctlString(DrmIoctl ioctlRequest) const {
15921599
return "???";
15931600
}
15941601
}
1602+
1603+
void IoctlHelperXe::querySupportedFeatures() {
1604+
1605+
struct drm_xe_vm_create vmCreate = {};
1606+
auto ret = IoctlHelper::ioctl(DrmIoctl::gemVmCreate, &vmCreate);
1607+
DEBUG_BREAK_IF(ret != 0);
1608+
1609+
auto checkVmBindFlagSupport = [&](uint32_t flag) -> bool {
1610+
uint8_t dummyData[2 * MemoryConstants::pageSize]{};
1611+
drm_xe_vm_bind bind = {};
1612+
bind.num_binds = 1;
1613+
bind.vm_id = vmCreate.vm_id;
1614+
bind.bind.range = MemoryConstants::pageSize;
1615+
bind.bind.userptr = alignUp(castToUint64(dummyData), MemoryConstants::pageSize);
1616+
bind.bind.addr = alignUp(castToUint64(dummyData), MemoryConstants::pageSize);
1617+
bind.bind.op = DRM_XE_VM_BIND_OP_MAP_USERPTR;
1618+
bind.bind.flags = flag;
1619+
bind.bind.pat_index = 1;
1620+
1621+
ret = IoctlHelper::ioctl(DrmIoctl::gemVmBind, &bind);
1622+
if (ret == 0) {
1623+
bind.bind.op = DRM_XE_VM_BIND_OP_UNMAP;
1624+
ret = IoctlHelper::ioctl(DrmIoctl::gemVmBind, &bind);
1625+
DEBUG_BREAK_IF(ret != 0);
1626+
return true;
1627+
}
1628+
return false;
1629+
};
1630+
supportedFeatures.flags.vmBindImmediate = checkVmBindFlagSupport(DRM_XE_VM_BIND_FLAG_IMMEDIATE);
1631+
supportedFeatures.flags.vmBindReadOnly = checkVmBindFlagSupport(DRM_XE_VM_BIND_FLAG_READONLY);
1632+
1633+
struct drm_xe_vm_destroy vmDestroy = {};
1634+
vmDestroy.vm_id = vmCreate.vm_id;
1635+
ret = IoctlHelper::ioctl(DrmIoctl::gemVmDestroy, &vmDestroy);
1636+
DEBUG_BREAK_IF(ret != 0);
1637+
};
15951638
} // namespace NEO

shared/source/os_interface/linux/xe/ioctl_helper_xe.h

-1
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,6 @@ class IoctlHelperXe : public IoctlHelper {
219219
static_assert(sizeof(SupportedFeatures::flags) == sizeof(SupportedFeatures::allFlags), "");
220220

221221
void querySupportedFeatures();
222-
uint64_t getAdditionalFlagsForVmBind(bool bindImmediate, bool readOnlyResource);
223222
};
224223

225224
template <typename... XeLogArgs>

shared/source/os_interface/linux/xe/ioctl_helper_xe_vm_bind_flags.cpp

-16
This file was deleted.

shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp

+80
Original file line numberDiff line numberDiff line change
@@ -2178,3 +2178,83 @@ TEST(IoctlHelperXeTest, whenCheckingGpuHangThenBanPropertyIsQueried) {
21782178
EXPECT_TRUE(drm->checkResetStatus(osContext));
21792179
EXPECT_TRUE(osContext.isHangDetected());
21802180
}
2181+
2182+
TEST(IoctlHelperXeVmBindTest, givenImmediateAndReadOnlyBindFlagsSupportedWhenGettingFlagsForVmBindThenCorrectFlagsAreReturned) {
2183+
2184+
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
2185+
auto drm = DrmMockXe::create(*executionEnvironment->rootDeviceEnvironments[0]);
2186+
auto xeIoctlHelper = static_cast<MockIoctlHelperXe *>(drm->getIoctlHelper());
2187+
xeIoctlHelper->initialize();
2188+
2189+
for (const auto &bindImmediateSupport : ::testing::Bool()) {
2190+
for (const auto &bindReadOnlySupport : ::testing::Bool()) {
2191+
xeIoctlHelper->supportedFeatures.flags.vmBindImmediate = bindImmediateSupport;
2192+
xeIoctlHelper->supportedFeatures.flags.vmBindReadOnly = bindReadOnlySupport;
2193+
2194+
uint64_t expectedFlags = DRM_XE_VM_BIND_FLAG_DUMPABLE;
2195+
2196+
if (bindImmediateSupport) {
2197+
expectedFlags |= DRM_XE_VM_BIND_FLAG_IMMEDIATE;
2198+
}
2199+
if (bindReadOnlySupport) {
2200+
expectedFlags |= DRM_XE_VM_BIND_FLAG_READONLY;
2201+
}
2202+
2203+
auto bindFlags = xeIoctlHelper->getFlagsForVmBind(true, true, false, false, true);
2204+
2205+
EXPECT_EQ(expectedFlags, bindFlags);
2206+
}
2207+
}
2208+
}
2209+
2210+
struct DrmMockXeVmBind : public DrmMockXe {
2211+
static auto create(RootDeviceEnvironment &rootDeviceEnvironment) {
2212+
auto drm = std::unique_ptr<DrmMockXeVmBind>(new DrmMockXeVmBind{rootDeviceEnvironment});
2213+
drm->initInstance();
2214+
2215+
return drm;
2216+
}
2217+
2218+
int ioctl(DrmIoctl request, void *arg) override {
2219+
switch (request) {
2220+
case DrmIoctl::gemVmBind: {
2221+
auto vmBindInput = static_cast<drm_xe_vm_bind *>(arg);
2222+
2223+
if ((vmBindInput->bind.flags & DRM_XE_VM_BIND_FLAG_IMMEDIATE) == DRM_XE_VM_BIND_FLAG_IMMEDIATE && !supportsBindImmediate) {
2224+
return -EINVAL;
2225+
}
2226+
if ((vmBindInput->bind.flags & DRM_XE_VM_BIND_FLAG_READONLY) == DRM_XE_VM_BIND_FLAG_READONLY && !supportsBindReadOnly) {
2227+
return -EINVAL;
2228+
}
2229+
return 0;
2230+
} break;
2231+
2232+
default:
2233+
return DrmMockXe::ioctl(request, arg);
2234+
}
2235+
};
2236+
bool supportsBindImmediate = true;
2237+
bool supportsBindReadOnly = true;
2238+
2239+
protected:
2240+
// Don't call directly, use the create() function
2241+
DrmMockXeVmBind(RootDeviceEnvironment &rootDeviceEnvironment) : DrmMockXe(rootDeviceEnvironment) {}
2242+
};
2243+
2244+
TEST(IoctlHelperXeVmBindTest, whenInitializeIoctlHelperThenQueryBindFlagsSupport) {
2245+
2246+
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
2247+
auto drm = DrmMockXeVmBind::create(*executionEnvironment->rootDeviceEnvironments[0]);
2248+
2249+
for (const auto &bindImmediateSupport : ::testing::Bool()) {
2250+
for (const auto &bindReadOnlySupport : ::testing::Bool()) {
2251+
2252+
drm->supportsBindImmediate = bindImmediateSupport;
2253+
drm->supportsBindReadOnly = bindReadOnlySupport;
2254+
auto xeIoctlHelper = std::make_unique<MockIoctlHelperXe>(*drm);
2255+
xeIoctlHelper->initialize();
2256+
EXPECT_EQ(xeIoctlHelper->supportedFeatures.flags.vmBindImmediate, bindImmediateSupport);
2257+
EXPECT_EQ(xeIoctlHelper->supportedFeatures.flags.vmBindReadOnly, bindReadOnlySupport);
2258+
}
2259+
}
2260+
}

0 commit comments

Comments
 (0)