]> 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)
committerThomas Hellström <thomas.hellstrom@linux.intel.com>
Mon, 29 Dec 2025 09:49:23 +0000 (10:49 +0100)
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>
drivers/gpu/drm/xe/xe_guc_ct.c

index 4ac434ad216f932c5b672b5056ee7f9bc0a6a2e7..a5019d1e741b3bf709c2424d8035a681ceec0285 100644 (file)
@@ -104,7 +104,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)
@@ -1203,10 +1205,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;
@@ -1454,7 +1459,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);