diff --git a/shared/source/direct_submission/linux/drm_direct_submission.h b/shared/source/direct_submission/linux/drm_direct_submission.h
index 8e3f9b60d9..6fc7311bce 100644
--- a/shared/source/direct_submission/linux/drm_direct_submission.h
+++ b/shared/source/direct_submission/linux/drm_direct_submission.h
@@ -28,6 +28,7 @@ class DrmDirectSubmission : public DirectSubmissionHw<GfxFamily, Dispatcher> {
protected:
bool allocateOsResources() override;
+ void makeGlobalFenceAlwaysResident() override;
bool submit(uint64_t gpuAddress, size_t size, const ResidencyContainer *allocationsForResidency) override;
bool handleResidency(const ResidencyContainer *allocationsForResidency) override;
diff --git a/shared/source/direct_submission/linux/drm_direct_submission.inl b/shared/source/direct_submission/linux/drm_direct_submission.inl
index 0d77c31250..070f360fb0 100644
--- a/shared/source/direct_submission/linux/drm_direct_submission.inl
+++ b/shared/source/direct_submission/linux/drm_direct_submission.inl
@@ -340,4 +340,12 @@ bool DrmDirectSubmission<GfxFamily, Dispatcher>::isGpuHangDetected(std::chrono::
return false;
}
+template <typename GfxFamily, typename Dispatcher>
+inline void DrmDirectSubmission<GfxFamily, Dispatcher>::makeGlobalFenceAlwaysResident() {
+ if (this->globalFenceAllocation != nullptr) {
+ DirectSubmissionAllocations allocations;
+ allocations.push_back(this->globalFenceAllocation);
+ UNRECOVERABLE_IF(!this->makeResourcesResident(allocations));
+ }
+}
+
} // namespace NEO
DirectSubmissionHw::dispatchSystemMemoryFenceAddress() calls
makeGlobalFenceAlwaysResident() and then programs the fence's GPU address into
the ring via STATE_SYSTEM_MEM_FENCE_ADDRESS, after which the CCS reads that
address. The hook is an empty virtual in direct_submission_hw.h and is
overridden only by WddmDirectSubmission; DrmDirectSubmission overrides fifteen
other methods but not this one, so on Linux the fence is never made resident
for the ring's own use. The CSR's per-flush makeResident() does not cover it.