]> git.ipfire.org Git - thirdparty/kernel/linux.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)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Tue, 23 Dec 2025 21:43:49 +0000 (16:43 -0500)
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>
drivers/gpu/drm/xe/xe_guc_ct.c

index c3df9b3f1b4de5f462dd61c0d4c9c9487204b13f..f2148a8bf208daec8056ba5a60badb1c505d0143 100644 (file)
@@ -206,7 +206,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)
@@ -1294,10 +1296,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;
@@ -1498,7 +1503,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);