intel_guc_send_busy_loop() looks at in_atomic() and irqs_disabled() to
decide if it should busy-spin while waiting or if it may sleep.
Both checks will report false on PREEMPT_RT if sleeping spinlocks are
acquired leading to RCU splats while the function sleeps.

Check also if RCU has been disabled.

Reported-by: "John B. Wyatt IV" <jwy...@redhat.com>
Signed-off-by: Sebastian Andrzej Siewior <bige...@linutronix.de>
---
 drivers/gpu/drm/i915/gt/uc/intel_guc.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc.h 
b/drivers/gpu/drm/i915/gt/uc/intel_guc.h
index be70c46604b49..387cc1911302f 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc.h
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc.h
@@ -360,7 +360,7 @@ static inline int intel_guc_send_busy_loop(struct intel_guc 
*guc,
 {
        int err;
        unsigned int sleep_period_ms = 1;
-       bool not_atomic = !in_atomic() && !irqs_disabled();
+       bool not_atomic = !in_atomic() && !irqs_disabled() && 
!rcu_preempt_depth();
 
        /*
         * FIXME: Have caller pass in if we are in an atomic context to avoid
-- 
2.43.0

Reply via email to