[PATCH] drm/i915/guc: Add synchronization on interrupt enable flag
Zhanjun Dong
zhanjun.dong at intel.com
Tue Aug 19 16:00:10 UTC 2025
Boolean flag access from interrupt context might have synchronous issue on
multiple processor platform, flage modified by one core might be read as an
old value by another core. This issue on interrupt enable flag might causes
interrupt missing or leakage.
Fixed by change the data type as automic to add memory synchronization.
Fixes: a187f13d51fa0 ("drm/i915/guc: handle interrupts from media GuC")
Signed-off-by: Zhanjun Dong <zhanjun.dong at intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
---
drivers/gpu/drm/i915/gt/intel_gt_irq.c | 2 +-
drivers/gpu/drm/i915/gt/uc/intel_guc.c | 8 ++++----
drivers/gpu/drm/i915/gt/uc/intel_guc.h | 4 ++--
drivers/gpu/drm/i915/gt/uc/intel_uc.c | 4 ++--
4 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/i915/gt/intel_gt_irq.c b/drivers/gpu/drm/i915/gt/intel_gt_irq.c
index 75e802e10be2..21804eec8320 100644
--- a/drivers/gpu/drm/i915/gt/intel_gt_irq.c
+++ b/drivers/gpu/drm/i915/gt/intel_gt_irq.c
@@ -20,7 +20,7 @@
static void guc_irq_handler(struct intel_guc *guc, u16 iir)
{
- if (unlikely(!guc->interrupts.enabled))
+ if (unlikely(!atomic_read(&guc->interrupts.enabled)))
return;
if (iir & GUC_INTR_GUC2HOST)
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc.c b/drivers/gpu/drm/i915/gt/uc/intel_guc.c
index f360f020d8f1..398651b1ba60 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc.c
@@ -101,7 +101,7 @@ static void gen9_enable_guc_interrupts(struct intel_guc *guc)
gen6_gt_pm_enable_irq(gt, gt->pm_guc_events);
spin_unlock_irq(gt->irq_lock);
- guc->interrupts.enabled = true;
+ atomic_set(&guc->interrupts.enabled, true);
}
static void gen9_disable_guc_interrupts(struct intel_guc *guc)
@@ -109,7 +109,7 @@ static void gen9_disable_guc_interrupts(struct intel_guc *guc)
struct intel_gt *gt = guc_to_gt(guc);
assert_rpm_wakelock_held(>->i915->runtime_pm);
- guc->interrupts.enabled = false;
+ atomic_set(&guc->interrupts.enabled, false);
spin_lock_irq(gt->irq_lock);
@@ -146,14 +146,14 @@ static void gen11_enable_guc_interrupts(struct intel_guc *guc)
__gen11_reset_guc_interrupts(gt);
spin_unlock_irq(gt->irq_lock);
- guc->interrupts.enabled = true;
+ atomic_set(&guc->interrupts.enabled, true);
}
static void gen11_disable_guc_interrupts(struct intel_guc *guc)
{
struct intel_gt *gt = guc_to_gt(guc);
- guc->interrupts.enabled = false;
+ atomic_set(&guc->interrupts.enabled, false);
intel_synchronize_irq(gt->i915);
gen11_reset_guc_interrupts(guc);
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc.h b/drivers/gpu/drm/i915/gt/uc/intel_guc.h
index 053780f562c1..40242bbb166e 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc.h
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc.h
@@ -93,7 +93,7 @@ struct intel_guc {
/** @interrupts: pointers to GuC interrupt-managing functions. */
struct {
- bool enabled;
+ atomic_t enabled;
void (*reset)(struct intel_guc *guc);
void (*enable)(struct intel_guc *guc);
void (*disable)(struct intel_guc *guc);
@@ -393,7 +393,7 @@ static inline int intel_guc_send_busy_loop(struct intel_guc *guc,
/* Only call this from the interrupt handler code */
static inline void intel_guc_to_host_event_handler(struct intel_guc *guc)
{
- if (guc->interrupts.enabled)
+ if (atomic_read(&guc->interrupts.enabled))
intel_guc_ct_event_handler(&guc->ct);
}
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_uc.c b/drivers/gpu/drm/i915/gt/uc/intel_uc.c
index 4a3493e8d433..964917387c08 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_uc.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_uc.c
@@ -659,7 +659,7 @@ void intel_uc_runtime_suspend(struct intel_uc *uc)
struct intel_guc *guc = &uc->guc;
if (!intel_guc_is_ready(guc)) {
- guc->interrupts.enabled = false;
+ atomic_set(&guc->interrupts.enabled, false);
return;
}
@@ -687,7 +687,7 @@ void intel_uc_suspend(struct intel_uc *uc)
wake_up_all_tlb_invalidate(guc);
if (!intel_guc_is_ready(guc)) {
- guc->interrupts.enabled = false;
+ atomic_set(&guc->interrupts.enabled, false);
return;
}
--
2.34.1
More information about the Intel-gfx
mailing list