]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/xe/guc: READ/WRITE_ONCE g2h_fence->done
authorJonathan Cavitt <jonathan.cavitt@intel.com>
Mon, 22 Dec 2025 20:19:59 +0000 (20:19 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 8 Jan 2026 09:16:51 +0000 (10:16 +0100)
[ Upstream commit bed2a6bd20681aacfb063015c1edfab6f58a333e ]

Use READ_ONCE and WRITE_ONCE when operating on g2h_fence->done
to prevent the compiler from ignoring important modifications
to its value.

Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel GPUs")
Suggested-by: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Link: https://patch.msgid.link/20251222201957.63245-5-jonathan.cavitt@intel.com
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
(cherry picked from commit b5179dbd1c14743ae80f0aaa28eaaf35c361608f)
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/xe/xe_guc_ct.c

index b7afe8e983cb792210d79f8014a44bdd948db1e8..3aac1a7aa2e7b2b8d5719a6d9261f822a35b5e32 100644 (file)
@@ -106,7 +106,9 @@ static void g2h_fence_cancel(struct g2h_fence *g2h_fence)
 {
        g2h_fence->cancel = true;
        g2h_fence->fail = true;
-       g2h_fence->done = true;
+
+       /* WRITE_ONCE pairs with READ_ONCEs in guc_ct_send_recv. */
+       WRITE_ONCE(g2h_fence->done, true);
 }
 
 static bool g2h_fence_needs_alloc(struct g2h_fence *g2h_fence)
@@ -1128,10 +1130,13 @@ retry_same_fence:
                return ret;
        }
 
-       ret = wait_event_timeout(ct->g2h_fence_wq, g2h_fence.done, HZ);
+       /* READ_ONCEs pairs with WRITE_ONCEs in parse_g2h_response
+        * and g2h_fence_cancel.
+        */
+       ret = wait_event_timeout(ct->g2h_fence_wq, READ_ONCE(g2h_fence.done), HZ);
        if (!ret) {
                LNL_FLUSH_WORK(&ct->g2h_worker);
-               if (g2h_fence.done) {
+               if (READ_ONCE(g2h_fence.done)) {
                        xe_gt_warn(gt, "G2H fence %u, action %04x, done\n",
                                   g2h_fence.seqno, action[0]);
                        ret = 1;
@@ -1375,7 +1380,8 @@ static int parse_g2h_response(struct xe_guc_ct *ct, u32 *msg, u32 len)
 
        g2h_release_space(ct, GUC_CTB_HXG_MSG_MAX_LEN);
 
-       g2h_fence->done = true;
+       /* WRITE_ONCE pairs with READ_ONCEs in guc_ct_send_recv. */
+       WRITE_ONCE(g2h_fence->done, true);
        smp_mb();
 
        wake_up_all(&ct->g2h_fence_wq);