Commit bed2a6bd authored by Jonathan Cavitt's avatar Jonathan Cavitt Committed by Thomas Hellström
Browse files

drm/xe/guc: READ/WRITE_ONCE g2h_fence->done



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

Fixes: dd08ebf6 ("drm/xe: Introduce a new DRM driver for Intel GPUs")
Suggested-by: default avatarMatthew Brost <matthew.brost@intel.com>
Signed-off-by: default avatarJonathan Cavitt <jonathan.cavitt@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: default avatarMatthew Brost <matthew.brost@intel.com>
Link: https://patch.msgid.link/20251222201957.63245-5-jonathan.cavitt@intel.com


Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
(cherry picked from commit b5179dbd)
Signed-off-by: default avatarThomas Hellström <thomas.hellstrom@linux.intel.com>
parent 754c2323
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -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 @@ static int guc_ct_send_recv(struct xe_guc_ct *ct, const u32 *action, u32 len,
		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);