refactor: Refactor user fence setup logic

Signed-off-by: Bellekallu Rajkiran <bellekallu.rajkiran@intel.com>
This commit is contained in:
Bellekallu Rajkiran
2025-10-23 16:55:53 +00:00
committed by Compute-Runtime-Automation
parent b7d1c32edd
commit 4573511966
11 changed files with 38 additions and 46 deletions

View File

@@ -1628,8 +1628,7 @@ int changeBufferObjectBinding(Drm *drm, OsContext *osContext, uint32_t vmHandleI
VmBindExtUserFenceT vmBindExtUserFence{};
bool incrementFenceValue = false;
if ((ioctlHelper->isWaitBeforeBindRequired(bind) && drm->useVMBindImmediate()) || guaranteePagingFence) {
if ((ioctlHelper->requiresUserFenceSetup(bind) && drm->useVMBindImmediate()) || guaranteePagingFence) {
lock = drm->lockBindFenceMutex();
auto nextExtension = vmBind.extensions;
incrementFenceValue = true;
@@ -1653,7 +1652,6 @@ int changeBufferObjectBinding(Drm *drm, OsContext *osContext, uint32_t vmHandleI
}
if (incrementFenceValue) {
auto osContextLinux = static_cast<OsContextLinux *>(osContext);
std::pair<uint64_t, uint64_t> fenceAddressAndValToWait = osContextLinux->getFenceAddressAndValToWait(vmHandleId, true);
if (drm->isPerContextVMRequired()) {
@@ -1668,14 +1666,12 @@ int changeBufferObjectBinding(Drm *drm, OsContext *osContext, uint32_t vmHandleI
const auto fenceValToWait = fenceAddressAndValToWait.second;
if (fenceAddressToWait != 0u) {
bool waitOnUserFenceAfterBindAndUnbind = false;
if (debugManager.flags.EnableWaitOnUserFenceAfterBindAndUnbind.get() != -1) {
waitOnUserFenceAfterBindAndUnbind = !!debugManager.flags.EnableWaitOnUserFenceAfterBindAndUnbind.get();
}
if ((ioctlHelper->isWaitBeforeBindRequired(bind) && waitOnUserFenceAfterBindAndUnbind && drm->useVMBindImmediate()) || guaranteePagingFence) {
if ((waitOnUserFenceAfterBindAndUnbind && drm->useVMBindImmediate()) || guaranteePagingFence) {
drm->waitUserFence(0u, fenceAddressToWait, fenceValToWait, Drm::ValueWidth::u64, -1, ioctlHelper->getWaitUserFenceSoftFlag(), false, NEO::InterruptId::notUsed, nullptr);
}
}

View File

@@ -194,7 +194,7 @@ class IoctlHelper {
virtual std::string getFileForMaxGpuFrequencyOfSubDevice(int tileId) const = 0;
virtual std::string getFileForMaxMemoryFrequencyOfSubDevice(int tileId) const = 0;
virtual bool getFabricLatency(uint32_t fabricId, uint32_t &latency, uint32_t &bandwidth) = 0;
virtual bool isWaitBeforeBindRequired(bool bind) const = 0;
virtual bool requiresUserFenceSetup(bool bind) const = 0;
virtual void *pciBarrierMmap() { return nullptr; };
virtual void setupIpVersion();
virtual bool isImmediateVmBindRequired() const { return false; }
@@ -366,7 +366,7 @@ class IoctlHelperUpstream : public IoctlHelperI915 {
int getDrmParamValue(DrmParam drmParam) const override;
std::string getIoctlString(DrmIoctl ioctlRequest) const override;
bool getFabricLatency(uint32_t fabricId, uint32_t &latency, uint32_t &bandwidth) override;
bool isWaitBeforeBindRequired(bool bind) const override;
bool requiresUserFenceSetup(bool bind) const override;
protected:
MOCKABLE_VIRTUAL void detectExtSetPatSupport();
@@ -444,7 +444,7 @@ class IoctlHelperPrelim20 : public IoctlHelperI915 {
std::string getIoctlString(DrmIoctl ioctlRequest) const override;
bool checkIfIoctlReinvokeRequired(int error, DrmIoctl ioctlRequest) const override;
bool getFabricLatency(uint32_t fabricId, uint32_t &latency, uint32_t &bandwidth) override;
bool isWaitBeforeBindRequired(bool bind) const override;
bool requiresUserFenceSetup(bool bind) const override;
void *pciBarrierMmap() override;
void setupIpVersion() override;
bool getTopologyDataAndMap(HardwareInfo &hwInfo, DrmQueryTopologyData &topologyData, TopologyMap &topologyMap) override;

View File

@@ -1037,12 +1037,11 @@ bool IoctlHelperPrelim20::getFabricLatency(uint32_t fabricId, uint32_t &latency,
return true;
}
bool IoctlHelperPrelim20::isWaitBeforeBindRequired(bool bind) const {
bool IoctlHelperPrelim20::requiresUserFenceSetup(bool bind) const {
bool userFenceOnUnbind = false;
if (debugManager.flags.EnableUserFenceUponUnbind.get() != -1) {
userFenceOnUnbind = !!debugManager.flags.EnableUserFenceUponUnbind.get();
}
return (bind || userFenceOnUnbind);
}

View File

@@ -311,11 +311,8 @@ bool IoctlHelperUpstream::getFabricLatency(uint32_t fabricId, uint32_t &latency,
return false;
}
bool IoctlHelperUpstream::isWaitBeforeBindRequired(bool bind) const {
bool userFenceOnUnbind = false;
if (debugManager.flags.EnableUserFenceUponUnbind.get() != -1) {
userFenceOnUnbind = !!debugManager.flags.EnableUserFenceUponUnbind.get();
}
return userFenceOnUnbind;
bool IoctlHelperUpstream::requiresUserFenceSetup(bool bind) const {
return false;
}
} // namespace NEO

View File

@@ -1799,7 +1799,7 @@ bool IoctlHelperXe::getFabricLatency(uint32_t fabricId, uint32_t &latency, uint3
return false;
}
bool IoctlHelperXe::isWaitBeforeBindRequired(bool bind) const {
bool IoctlHelperXe::requiresUserFenceSetup(bool bind) const {
return true;
}

View File

@@ -113,7 +113,7 @@ class IoctlHelperXe : public IoctlHelper {
void configureCcsMode(std::vector<std::string> &files, const std::string expectedPrefix, uint32_t ccsMode,
std::vector<std::tuple<std::string, uint32_t>> &deviceCcsModeVec) override;
bool getFabricLatency(uint32_t fabricId, uint32_t &latency, uint32_t &bandwidth) override;
bool isWaitBeforeBindRequired(bool bind) const override;
bool requiresUserFenceSetup(bool bind) const override;
std::unique_ptr<EngineInfo> createEngineInfo(bool isSysmanEnabled) override;
std::unique_ptr<MemoryInfo> createMemoryInfo() override;
size_t getLocalMemoryRegionsSize(const MemoryInfo *memoryInfo, uint32_t subDevicesCount, uint32_t deviceBitfield) const override;

View File

@@ -30,7 +30,7 @@ class MockIoctlHelper : public IoctlHelperPrelim20 {
using IoctlHelperPrelim20::IoctlHelperPrelim20;
ADDMETHOD_CONST_NOBASE(isImmediateVmBindRequired, bool, false, ());
ADDMETHOD_CONST_NOBASE(getIoctlRequestValue, unsigned int, 1234u, (DrmIoctl));
ADDMETHOD_CONST_NOBASE(isWaitBeforeBindRequired, bool, false, (bool));
ADDMETHOD_CONST_NOBASE(requiresUserFenceSetup, bool, false, (bool));
ADDMETHOD_CONST_NOBASE(makeResidentBeforeLockNeeded, bool, false, ());
ADDMETHOD_NOBASE(vmBind, int, 0, (const VmBindParams &));

View File

@@ -630,7 +630,7 @@ TEST(DrmBufferObject, givenDrmWhenBindOperationFailsThenFenceValueNotGrow) {
drm->isVMBindImmediateSupported = true;
auto ioctlHelper = std::make_unique<MockIoctlHelper>(*drm);
ioctlHelper->vmBindResult = -1;
ioctlHelper->isWaitBeforeBindRequiredResult = true;
ioctlHelper->requiresUserFenceSetupResult = true;
drm->ioctlHelper.reset(ioctlHelper.release());
executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(drm));
@@ -665,7 +665,7 @@ TEST(DrmBufferObject, givenDrmWhenBindOperationSucceedsThenFenceValueGrow) {
drm->requirePerContextVM = false;
drm->isVMBindImmediateSupported = true;
auto ioctlHelper = std::make_unique<MockIoctlHelper>(*drm);
ioctlHelper->isWaitBeforeBindRequiredResult = true;
ioctlHelper->requiresUserFenceSetupResult = true;
drm->ioctlHelper.reset(ioctlHelper.release());
executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(drm));
@@ -693,7 +693,7 @@ class DrmBufferObjectBindTestWithForcePagingFenceSucceeds : public ::testing::Te
TEST_P(DrmBufferObjectBindTestWithForcePagingFenceSucceeds, givenDrmWhenBindOperationSucceedsWithForcePagingFenceThenFenceValueGrow) {
int32_t waitOnUserFenceAfterBindAndUnbindVal = std::get<0>(GetParam());
bool isVMBindImmediateSupportedVal = std::get<1>(GetParam());
bool isWaitBeforeBindRequiredResultVal = std::get<2>(GetParam());
bool requiresUserFenceSetupResultVal = std::get<2>(GetParam());
DebugManagerStateRestore restorer;
debugManager.flags.EnableWaitOnUserFenceAfterBindAndUnbind.set(waitOnUserFenceAfterBindAndUnbindVal);
@@ -723,7 +723,7 @@ TEST_P(DrmBufferObjectBindTestWithForcePagingFenceSucceeds, givenDrmWhenBindOper
drm->requirePerContextVM = false;
drm->isVMBindImmediateSupported = isVMBindImmediateSupportedVal;
auto ioctlHelper = std::make_unique<MockIoctlHelper>(*drm);
ioctlHelper->isWaitBeforeBindRequiredResult = isWaitBeforeBindRequiredResultVal;
ioctlHelper->requiresUserFenceSetupResult = requiresUserFenceSetupResultVal;
drm->ioctlHelper.reset(ioctlHelper.release());
auto osContext = new OsContextLinux(*drm, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor());
@@ -761,7 +761,7 @@ class DrmBufferObjectBindTestWithForcePagingFenceFalseWaitUserFenceNotCalled : p
TEST_P(DrmBufferObjectBindTestWithForcePagingFenceFalseWaitUserFenceNotCalled, givenDrmWhenBindOperationSucceedsWithForcePagingFenceFalseThenFenceValueDoesNotGrow) {
int32_t waitOnUserFenceAfterBindAndUnbindVal = std::get<0>(GetParam());
bool isVMBindImmediateSupportedVal = std::get<1>(GetParam());
bool isWaitBeforeBindRequiredResultVal = std::get<2>(GetParam());
bool requiresUserFenceSetupResultVal = std::get<2>(GetParam());
DebugManagerStateRestore restorer;
debugManager.flags.EnableWaitOnUserFenceAfterBindAndUnbind.set(waitOnUserFenceAfterBindAndUnbindVal);
@@ -791,7 +791,7 @@ TEST_P(DrmBufferObjectBindTestWithForcePagingFenceFalseWaitUserFenceNotCalled, g
drm->requirePerContextVM = false;
drm->isVMBindImmediateSupported = isVMBindImmediateSupportedVal;
auto ioctlHelper = std::make_unique<MockIoctlHelper>(*drm);
ioctlHelper->isWaitBeforeBindRequiredResult = isWaitBeforeBindRequiredResultVal;
ioctlHelper->requiresUserFenceSetupResult = requiresUserFenceSetupResultVal;
drm->ioctlHelper.reset(ioctlHelper.release());
auto osContext = new OsContextLinux(*drm, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor());
@@ -858,7 +858,7 @@ TEST(DrmBufferObject, givenDrmWhenBindOperationSucceedsWithForcePagingFenceWithD
// Making the useVMBindImmediate() false
drm->isVMBindImmediateSupported = false;
auto ioctlHelper = std::make_unique<MockIoctlHelper>(*drm);
ioctlHelper->isWaitBeforeBindRequiredResult = true;
ioctlHelper->requiresUserFenceSetupResult = true;
drm->ioctlHelper.reset(ioctlHelper.release());
auto osContext = new OsContextLinux(*drm, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor());
@@ -896,7 +896,7 @@ TEST(DrmBufferObject, givenDrmWhenUnBindOperationFailsThenFenceValueNotGrow) {
drm->isVMBindImmediateSupported = true;
auto ioctlHelper = std::make_unique<MockIoctlHelper>(*drm);
ioctlHelper->vmUnbindResult = -1;
ioctlHelper->isWaitBeforeBindRequiredResult = true;
ioctlHelper->requiresUserFenceSetupResult = true;
drm->ioctlHelper.reset(ioctlHelper.release());
executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(drm));
@@ -927,7 +927,7 @@ TEST(DrmBufferObject, givenDrmWhenUnBindOperationSucceedsThenFenceValueGrow) {
drm->requirePerContextVM = false;
drm->isVMBindImmediateSupported = true;
auto ioctlHelper = std::make_unique<MockIoctlHelper>(*drm);
ioctlHelper->isWaitBeforeBindRequiredResult = true;
ioctlHelper->requiresUserFenceSetupResult = true;
drm->ioctlHelper.reset(ioctlHelper.release());
executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(drm));
@@ -962,7 +962,7 @@ TEST(DrmBufferObject, givenDrmWhenUnBindOperationSucceedsAndForceUserFenceUponUn
drm->requirePerContextVM = false;
drm->isVMBindImmediateSupported = true;
auto ioctlHelper = std::make_unique<MockIoctlHelper>(*drm);
ioctlHelper->isWaitBeforeBindRequiredResult = true;
ioctlHelper->requiresUserFenceSetupResult = true;
drm->ioctlHelper.reset(ioctlHelper.release());
executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(drm));
@@ -1011,7 +1011,7 @@ TEST(DrmBufferObject, givenDrmWhenUnBindOperationSucceedsAndForceFenceWaitThenFe
drm->requirePerContextVM = false;
drm->isVMBindImmediateSupported = true;
auto ioctlHelper = std::make_unique<MockIoctlHelper>(*drm);
ioctlHelper->isWaitBeforeBindRequiredResult = true;
ioctlHelper->requiresUserFenceSetupResult = true;
drm->ioctlHelper.reset(ioctlHelper.release());
auto osContext = new OsContextLinux(*drm, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor());
@@ -1064,7 +1064,7 @@ TEST(DrmBufferObject, givenDrmWhenUnBindOperationSucceedsWaitBeforeBindFalseAndF
drm->requirePerContextVM = false;
drm->isVMBindImmediateSupported = true;
auto ioctlHelper = std::make_unique<MockIoctlHelper>(*drm);
ioctlHelper->isWaitBeforeBindRequiredResult = false;
ioctlHelper->requiresUserFenceSetupResult = false;
drm->ioctlHelper.reset(ioctlHelper.release());
auto osContext = new OsContextLinux(*drm, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor());
@@ -1117,7 +1117,7 @@ TEST(DrmBufferObject, givenDrmWhenUnBindOperationSucceedsWaitBeforeBindTrueAndFo
drm->requirePerContextVM = false;
drm->isVMBindImmediateSupported = false;
auto ioctlHelper = std::make_unique<MockIoctlHelper>(*drm);
ioctlHelper->isWaitBeforeBindRequiredResult = true;
ioctlHelper->requiresUserFenceSetupResult = true;
drm->ioctlHelper.reset(ioctlHelper.release());
auto osContext = new OsContextLinux(*drm, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor());

View File

@@ -812,8 +812,8 @@ TEST_F(IoctlPrelimHelperTests, whenChangingBufferBindingThenWaitIsNeededOnlyBefo
IoctlHelperPrelim20 ioctlHelper{*drm};
EXPECT_TRUE(ioctlHelper.isWaitBeforeBindRequired(true));
EXPECT_FALSE(ioctlHelper.isWaitBeforeBindRequired(false));
EXPECT_TRUE(ioctlHelper.requiresUserFenceSetup(true));
EXPECT_FALSE(ioctlHelper.requiresUserFenceSetup(false));
}
TEST_F(IoctlPrelimHelperTests, whenChangingBufferBindingAndForcingFenceWaitThenCallReturnsTrueForBindAndUnbind) {
@@ -824,8 +824,8 @@ TEST_F(IoctlPrelimHelperTests, whenChangingBufferBindingAndForcingFenceWaitThenC
IoctlHelperPrelim20 ioctlHelper{*drm};
debugManager.flags.EnableUserFenceUponUnbind.set(1);
EXPECT_TRUE(ioctlHelper.isWaitBeforeBindRequired(true));
EXPECT_TRUE(ioctlHelper.isWaitBeforeBindRequired(false));
EXPECT_TRUE(ioctlHelper.requiresUserFenceSetup(true));
EXPECT_TRUE(ioctlHelper.requiresUserFenceSetup(false));
}
TEST_F(IoctlPrelimHelperTests, whenChangingBufferBindingAndNotForcingFenceWaitThenCallReturnsTrueForBindOnly) {
@@ -836,8 +836,8 @@ TEST_F(IoctlPrelimHelperTests, whenChangingBufferBindingAndNotForcingFenceWaitTh
IoctlHelperPrelim20 ioctlHelper{*drm};
debugManager.flags.EnableUserFenceUponUnbind.set(0);
EXPECT_TRUE(ioctlHelper.isWaitBeforeBindRequired(true));
EXPECT_FALSE(ioctlHelper.isWaitBeforeBindRequired(false));
EXPECT_TRUE(ioctlHelper.requiresUserFenceSetup(true));
EXPECT_FALSE(ioctlHelper.requiresUserFenceSetup(false));
}
TEST_F(IoctlPrelimHelperTests, whenGettingPreferredLocationRegionThenReturnCorrectMemoryClassAndInstance) {

View File

@@ -148,11 +148,11 @@ TEST(IoctlHelperUpstreamTest, whenChangingBufferBindingThenWaitIsNeverNeeded) {
IoctlHelperUpstream ioctlHelper{*drm};
EXPECT_FALSE(ioctlHelper.isWaitBeforeBindRequired(true));
EXPECT_FALSE(ioctlHelper.isWaitBeforeBindRequired(false));
EXPECT_FALSE(ioctlHelper.requiresUserFenceSetup(true));
EXPECT_FALSE(ioctlHelper.requiresUserFenceSetup(false));
}
TEST(IoctlHelperUpstreamTest, whenChangingBufferBindingThenWaitIsAddedWhenForced) {
TEST(IoctlHelperUpstreamTest, whenChangingBufferBindingThenRequiresUserFenceSetupIsFalse) {
DebugManagerStateRestore restorer;
MockExecutionEnvironment executionEnvironment{};
std::unique_ptr<Drm> drm{Drm::create(std::make_unique<HwDeviceIdDrm>(0, ""), *executionEnvironment.rootDeviceEnvironments[0])};
@@ -160,8 +160,8 @@ TEST(IoctlHelperUpstreamTest, whenChangingBufferBindingThenWaitIsAddedWhenForced
IoctlHelperUpstream ioctlHelper{*drm};
debugManager.flags.EnableUserFenceUponUnbind.set(1);
EXPECT_TRUE(ioctlHelper.isWaitBeforeBindRequired(true));
EXPECT_TRUE(ioctlHelper.isWaitBeforeBindRequired(false));
EXPECT_FALSE(ioctlHelper.requiresUserFenceSetup(true));
EXPECT_FALSE(ioctlHelper.requiresUserFenceSetup(false));
}
TEST(IoctlHelperUpstreamTest, whenGettingIoctlRequestStringThenProperStringIsReturned) {

View File

@@ -78,8 +78,8 @@ TEST_F(IoctlHelperXeTest, whenChangingBufferBindingThenWaitIsNeededAlways) {
IoctlHelperXe ioctlHelper{*drm};
EXPECT_TRUE(ioctlHelper.isWaitBeforeBindRequired(true));
EXPECT_TRUE(ioctlHelper.isWaitBeforeBindRequired(false));
EXPECT_TRUE(ioctlHelper.requiresUserFenceSetup(true));
EXPECT_TRUE(ioctlHelper.requiresUserFenceSetup(false));
}
struct GemCreateExtFixture {