From 455f74991e7214b2761a5003f9e6b7859d99b8ae Mon Sep 17 00:00:00 2001 From: Bartosz Dunajski Date: Thu, 6 Jun 2024 11:23:55 +0000 Subject: [PATCH] feature: pass interrupt flag to queue creation api Related-To: NEO-8179 Signed-off-by: Bartosz Dunajski --- shared/source/os_interface/linux/ioctl_helper.h | 4 ++-- shared/source/os_interface/linux/ioctl_helper_i915.cpp | 2 +- shared/source/os_interface/linux/os_context_linux.cpp | 4 ++-- shared/source/os_interface/linux/os_context_linux.h | 2 +- shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp | 3 ++- shared/source/os_interface/linux/xe/ioctl_helper_xe.h | 3 ++- shared/source/os_interface/os_context.cpp | 4 ++-- shared/source/os_interface/os_context.h | 2 +- shared/source/os_interface/windows/os_context_win.cpp | 2 +- shared/source/os_interface/windows/os_context_win.h | 4 ++-- .../command_stream/command_stream_receiver_tests.cpp | 2 +- .../linux/xe/ioctl_helper_xe_debugger_tests.cpp | 8 ++++---- .../os_interface/linux/xe/ioctl_helper_xe_tests.h | 2 ++ shared/test/unit_test/os_interface/os_context_tests.cpp | 6 +++--- 14 files changed, 26 insertions(+), 22 deletions(-) diff --git a/shared/source/os_interface/linux/ioctl_helper.h b/shared/source/os_interface/linux/ioctl_helper.h index 2022172681..e7242bd3a2 100644 --- a/shared/source/os_interface/linux/ioctl_helper.h +++ b/shared/source/os_interface/linux/ioctl_helper.h @@ -154,7 +154,7 @@ class IoctlHelper { virtual std::string getIoctlString(DrmIoctl ioctlRequest) const = 0; virtual bool checkIfIoctlReinvokeRequired(int error, DrmIoctl ioctlRequest) const; - virtual int createDrmContext(Drm &drm, OsContextLinux &osContext, uint32_t drmVmId, uint32_t deviceIndex) = 0; + virtual int createDrmContext(Drm &drm, OsContextLinux &osContext, uint32_t drmVmId, uint32_t deviceIndex, bool allocateInterrupt) = 0; virtual void fillExecObject(ExecObject &execObject, uint32_t handle, uint64_t gpuAddress, uint32_t drmContextId, bool bindInfo, bool isMarkedForCapture) = 0; virtual void logExecObject(const ExecObject &execObject, std::stringstream &logger, size_t size) = 0; @@ -224,7 +224,7 @@ class IoctlHelperI915 : public IoctlHelper { unsigned int getIoctlRequestValue(DrmIoctl ioctlRequest) const override; std::string getDrmParamString(DrmParam param) const override; std::string getIoctlString(DrmIoctl ioctlRequest) const override; - int createDrmContext(Drm &drm, OsContextLinux &osContext, uint32_t drmVmId, uint32_t deviceIndex) override; + int createDrmContext(Drm &drm, OsContextLinux &osContext, uint32_t drmVmId, uint32_t deviceIndex, bool allocateInterrupt) override; std::string getFileForMaxGpuFrequency() const override; std::string getFileForMaxGpuFrequencyOfSubDevice(int tileId) const override; std::string getFileForMaxMemoryFrequencyOfSubDevice(int tileId) const override; diff --git a/shared/source/os_interface/linux/ioctl_helper_i915.cpp b/shared/source/os_interface/linux/ioctl_helper_i915.cpp index 5847b43220..6590694f0e 100644 --- a/shared/source/os_interface/linux/ioctl_helper_i915.cpp +++ b/shared/source/os_interface/linux/ioctl_helper_i915.cpp @@ -413,7 +413,7 @@ std::string IoctlHelperI915::getIoctlString(DrmIoctl ioctlRequest) const { } } -int IoctlHelperI915::createDrmContext(Drm &drm, OsContextLinux &osContext, uint32_t drmVmId, uint32_t deviceIndex) { +int IoctlHelperI915::createDrmContext(Drm &drm, OsContextLinux &osContext, uint32_t drmVmId, uint32_t deviceIndex, bool allocateInterrupt) { const auto numberOfCCS = drm.getRootDeviceEnvironment().getHardwareInfo()->gtSystemInfo.CCSInfo.NumberOfCCSEnabled; const bool debuggableContext = drm.isContextDebugSupported() && drm.getRootDeviceEnvironment().executionEnvironment.isDebuggingEnabled() && !osContext.isInternalEngine(); diff --git a/shared/source/os_interface/linux/os_context_linux.cpp b/shared/source/os_interface/linux/os_context_linux.cpp index 91475d1f51..f431b7e39a 100644 --- a/shared/source/os_interface/linux/os_context_linux.cpp +++ b/shared/source/os_interface/linux/os_context_linux.cpp @@ -36,7 +36,7 @@ OsContextLinux::OsContextLinux(Drm &drm, uint32_t rootDeviceIndex, uint32_t cont fenceVal.fill(0u); } -bool OsContextLinux::initializeContext() { +bool OsContextLinux::initializeContext(bool allocateInterrupt) { auto hwInfo = drm.getRootDeviceEnvironment().getHardwareInfo(); auto defaultEngineType = getChosenEngineType(*hwInfo); @@ -68,7 +68,7 @@ bool OsContextLinux::initializeContext() { this->drmVmIds[deviceIndex] = drmVmId; } - auto drmContextId = drm.getIoctlHelper()->createDrmContext(drm, *this, drmVmId, deviceIndex); + auto drmContextId = drm.getIoctlHelper()->createDrmContext(drm, *this, drmVmId, deviceIndex, allocateInterrupt); if (drmContextId < 0) { return false; } diff --git a/shared/source/os_interface/linux/os_context_linux.h b/shared/source/os_interface/linux/os_context_linux.h index a9769b2bb9..8c10b359a4 100644 --- a/shared/source/os_interface/linux/os_context_linux.h +++ b/shared/source/os_interface/linux/os_context_linux.h @@ -47,7 +47,7 @@ class OsContextLinux : public OsContext { void waitForBind(uint32_t drmIterator); protected: - bool initializeContext() override; + bool initializeContext(bool allocateInterrupt) override; unsigned int engineFlag = 0; std::vector drmContextIds; 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 d7957f1d0d..ee82757c49 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp @@ -1164,7 +1164,7 @@ void IoctlHelperXe::xeShowBindTable() { } } -int IoctlHelperXe::createDrmContext(Drm &drm, OsContextLinux &osContext, uint32_t drmVmId, uint32_t deviceIndex) { +int IoctlHelperXe::createDrmContext(Drm &drm, OsContextLinux &osContext, uint32_t drmVmId, uint32_t deviceIndex, bool allocateInterrupt) { drm_xe_exec_queue_create create = {}; uint32_t drmContextId = 0; @@ -1192,6 +1192,7 @@ int IoctlHelperXe::createDrmContext(Drm &drm, OsContextLinux &osContext, uint32_ } } setContextProperties(osContext, &extProperties, extPropertyIndex); + applyContextFlags(&create, allocateInterrupt); if (extPropertyIndex > 0) { create.extensions = castToUint64(&extProperties[0]); 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 201fbc1217..ed479ced00 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe.h +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe.h @@ -98,7 +98,7 @@ class IoctlHelperXe : public IoctlHelper { int getDrmParamValue(DrmParam drmParam) const override; int getDrmParamValueBase(DrmParam drmParam) const override; std::string getIoctlString(DrmIoctl ioctlRequest) const override; - int createDrmContext(Drm &drm, OsContextLinux &osContext, uint32_t drmVmId, uint32_t deviceIndex) override; + int createDrmContext(Drm &drm, OsContextLinux &osContext, uint32_t drmVmId, uint32_t deviceIndex, bool allocateInterrupt) override; std::string getDrmParamString(DrmParam param) const override; bool getTopologyDataAndMap(const HardwareInfo &hwInfo, DrmQueryTopologyData &topologyData, TopologyMap &topologyMap) override; std::string getFileForMaxGpuFrequency() const override; @@ -164,6 +164,7 @@ class IoctlHelperXe : public IoctlHelper { uint16_t getDefaultEngineClass(const aub_stream::EngineType &defaultEngineType); virtual void setContextProperties(const OsContextLinux &osContext, void *extProperties, uint32_t &extIndexInOut); + virtual void applyContextFlags(void *execQueueCreate, bool allocateInterrupt){}; struct GtIpVersion { uint16_t major; diff --git a/shared/source/os_interface/os_context.cpp b/shared/source/os_interface/os_context.cpp index 415ae26e7d..752fcbb21a 100644 --- a/shared/source/os_interface/os_context.cpp +++ b/shared/source/os_interface/os_context.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2023 Intel Corporation + * Copyright (C) 2021-2024 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -55,7 +55,7 @@ bool OsContext::ensureContextInitialized() { static_cast(rootDevice)); } - if (!initializeContext()) { + if (!initializeContext(false)) { contextInitialized = false; } else { contextInitialized = true; diff --git a/shared/source/os_interface/os_context.h b/shared/source/os_interface/os_context.h index 97c9eadba9..d6ee987c7a 100644 --- a/shared/source/os_interface/os_context.h +++ b/shared/source/os_interface/os_context.h @@ -87,7 +87,7 @@ class OsContext : public ReferenceTrackedObject { } protected: - virtual bool initializeContext() { return true; } + virtual bool initializeContext(bool allocateInterrupt) { return true; } std::atomic tlbFlushCounter{0}; std::atomic lastFlushedTlbFlushCounter{0}; diff --git a/shared/source/os_interface/windows/os_context_win.cpp b/shared/source/os_interface/windows/os_context_win.cpp index 3eec3398c7..be58dceb40 100644 --- a/shared/source/os_interface/windows/os_context_win.cpp +++ b/shared/source/os_interface/windows/os_context_win.cpp @@ -30,7 +30,7 @@ OsContextWin::OsContextWin(Wddm &wddm, uint32_t rootDeviceIndex, uint32_t contex wddm(wddm) { } -bool OsContextWin::initializeContext() { +bool OsContextWin::initializeContext(bool allocateInterrupt) { NEO::EnvironmentVariableReader envReader; bool disableContextCreationFlag = envReader.getSetting("NEO_L0_SYSMAN_NO_CONTEXT_MODE", false); diff --git a/shared/source/os_interface/windows/os_context_win.h b/shared/source/os_interface/windows/os_context_win.h index 577a42453a..d7eaa753a3 100644 --- a/shared/source/os_interface/windows/os_context_win.h +++ b/shared/source/os_interface/windows/os_context_win.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2023 Intel Corporation + * Copyright (C) 2018-2024 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -41,7 +41,7 @@ class OsContextWin : public OsContext { uint64_t getOfflineDumpContextId(uint32_t deviceIndex) const override; protected: - bool initializeContext() override; + bool initializeContext(bool allocateInterrupt) override; WddmResidencyController residencyController; HardwareQueue hardwareQueue; diff --git a/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp b/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp index 645baf901d..643409e855 100644 --- a/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp +++ b/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp @@ -137,7 +137,7 @@ HWTEST_F(CommandStreamReceiverTest, whenContextCreateReturnsFalseThenExpectCSRIn MyOsContext(uint32_t contextId, const EngineDescriptor &engineDescriptor) : OsContext(0, contextId, engineDescriptor) {} - bool initializeContext() override { + bool initializeContext(bool allocateInterrupt) override { initializeContextCalled++; return false; } diff --git a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_debugger_tests.cpp b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_debugger_tests.cpp index 5c0d284128..277df45e71 100644 --- a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_debugger_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_debugger_tests.cpp @@ -204,7 +204,7 @@ HWTEST_F(IoctlHelperXeTestFixture, GivenRunaloneModeRequiredReturnFalseWhenCreat OsContextLinux osContext(drm, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor({aub_stream::EngineType::ENGINE_CCS, EngineUsage::regular})); uint16_t deviceIndex = 1; - xeIoctlHelper->createDrmContext(drm, osContext, 0, deviceIndex); + xeIoctlHelper->createDrmContext(drm, osContext, 0, deviceIndex, false); auto ext = drm.receivedContextCreateSetParam; EXPECT_NE(ext.property, static_cast(DRM_XE_EXEC_QUEUE_SET_PROPERTY_EU_DEBUG)); @@ -232,7 +232,7 @@ HWTEST_F(IoctlHelperXeTestFixture, givenDeviceIndexWhenCreatingContextThenSetCor uint16_t tileId = 1u; uint16_t expectedGtId = xeIoctlHelper->tileIdToGtId[tileId]; - xeIoctlHelper->createDrmContext(drm, osContext, 0, tileId); + xeIoctlHelper->createDrmContext(drm, osContext, 0, tileId, false); EXPECT_EQ(1u, drm.execQueueCreateParams.num_placements); ASSERT_EQ(1u, drm.execQueueEngineInstances.size()); @@ -262,7 +262,7 @@ HWTEST_F(IoctlHelperXeTestFixture, GivenRunaloneModeRequiredReturnTrueWhenCreate drm.engineInfo = std::move(engineInfo); OsContextLinux osContext(drm, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor({aub_stream::EngineType::ENGINE_CCS, EngineUsage::regular})); - xeIoctlHelper->createDrmContext(drm, osContext, 0, 1); + xeIoctlHelper->createDrmContext(drm, osContext, 0, 1, false); auto ext = drm.receivedContextCreateSetParam; EXPECT_EQ(ext.base.name, static_cast(DRM_XE_EXEC_QUEUE_EXTENSION_SET_PROPERTY)); @@ -293,7 +293,7 @@ HWTEST_F(IoctlHelperXeTestFixture, GivenContextCreatedForCopyEngineWhenCreateDrm drm.engineInfo = std::move(engineInfo); OsContextLinux osContext(drm, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor({aub_stream::EngineType::ENGINE_BCS1, EngineUsage::regular})); - xeIoctlHelper->createDrmContext(drm, osContext, 0, 0); + xeIoctlHelper->createDrmContext(drm, osContext, 0, 0, false); auto ext = drm.receivedContextCreateSetParam; EXPECT_NE(ext.property, static_cast(DRM_XE_EXEC_QUEUE_SET_PROPERTY_EU_DEBUG)); 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 dda2bea914..b3dc1879c4 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 @@ -301,6 +301,7 @@ class DrmMockXe : public DrmMockCustom { case DrmIoctl::gemContextCreateExt: { auto queueCreate = static_cast(arg); + latestExecQueueCreate = *queueCreate; auto extension = queueCreate->extensions; while (extension) { @@ -379,6 +380,7 @@ class DrmMockXe : public DrmMockCustom { StackVec vmBindInputs; StackVec syncInputs; StackVec execQueueProperties; + drm_xe_exec_queue_create latestExecQueueCreate = {}; int waitUserFenceReturn = 0; int execQueueBanPropertyReturn = 0; diff --git a/shared/test/unit_test/os_interface/os_context_tests.cpp b/shared/test/unit_test/os_interface/os_context_tests.cpp index cfd0621c97..b3516e3f2e 100644 --- a/shared/test/unit_test/os_interface/os_context_tests.cpp +++ b/shared/test/unit_test/os_interface/os_context_tests.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2023 Intel Corporation + * Copyright (C) 2019-2024 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -194,7 +194,7 @@ TEST_F(DeferredOsContextCreationTests, givenEnsureContextInitializeCalledAndRetu MyOsContext(uint32_t contextId, const EngineDescriptor &engineDescriptor) : OsContext(0, contextId, engineDescriptor) {} - bool initializeContext() override { + bool initializeContext(bool allocateInterrupt) override { initializeContextCalled++; return false; } @@ -215,7 +215,7 @@ TEST_F(DeferredOsContextCreationTests, givenEnsureContextInitializeCalledMultipl MyOsContext(uint32_t contextId, const EngineDescriptor &engineDescriptor) : OsContext(0, contextId, engineDescriptor) {} - bool initializeContext() override { + bool initializeContext(bool allocateInterrupt) override { initializeContextCalled++; return true; }