drm_crtc_accurate_vblank_count takes a spinlock, which we should avoid
in tracepoints and debug functions.

This also prevents taking the spinlock 2x during the critical
section of pipe updates for DSI updates.

Acked-by: Ville Syrjälä <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Maarten Lankhorst <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_crtc.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_crtc.c 
b/drivers/gpu/drm/i915/display/intel_crtc.c
index a187db6df2d36..c0329e1324626 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc.c
@@ -84,8 +84,13 @@ u32 intel_crtc_get_vblank_counter(struct intel_crtc *crtc)
        if (!crtc->active)
                return 0;
 
-       if (!vblank->max_vblank_count)
-               return (u32)drm_crtc_accurate_vblank_count(&crtc->base);
+       if (!vblank->max_vblank_count) {
+               /* On preempt-rt we cannot take the vblank spinlock since this 
function is called from tracepoints */
+               if (IS_ENABLED(CONFIG_PREEMPT_RT))
+                       return (u32)drm_crtc_vblank_count(&crtc->base);
+               else
+                       return (u32)drm_crtc_accurate_vblank_count(&crtc->base);
+       }
 
        return crtc->base.funcs->get_vblank_counter(&crtc->base);
 }
-- 
2.51.0

Reply via email to