Skip to content

Crash relating to STATE_SYSTEM_MEM_FENCE_ADDRESS. #994

Description

@mndodd

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.

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions