From: Maarten Lankhorst <dev@lankhorst.se>
To: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
Maarten Lankhorst <dev@lankhorst.se>
Subject: [PATCH 2/2] drm/i915/display: Make tracepoints work correctly on xe with PREEMPT_RT
Date: Thu, 28 Aug 2025 11:09:44 +0200 [thread overview]
Message-ID: <20250828090944.101069-2-dev@lankhorst.se> (raw)
In-Reply-To: <20250828090944.101069-1-dev@lankhorst.se>
The display tracepoints will work, but drm_crtc_accurate_vblank_count()
takes an irq lock. Use the less accurate drm_crtc_vblank_count() on
affected platforms, which is simply an atomic_read64();
Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
drivers/gpu/drm/i915/display/intel_crtc.c | 9 ++--
drivers/gpu/drm/i915/display/intel_crtc.h | 2 +-
.../drm/i915/display/intel_display_trace.h | 48 ++++++++++---------
3 files changed, 31 insertions(+), 28 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_crtc.c b/drivers/gpu/drm/i915/display/intel_crtc.c
index a187db6df2d36..5c8ce35d21ca3 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc.c
@@ -77,7 +77,7 @@ void intel_wait_for_vblank_if_active(struct intel_display *display,
intel_crtc_wait_for_next_vblank(crtc);
}
-u32 intel_crtc_get_vblank_counter(struct intel_crtc *crtc)
+u32 intel_crtc_get_vblank_counter(struct intel_crtc *crtc, bool update_vblank)
{
struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(&crtc->base);
@@ -85,7 +85,8 @@ u32 intel_crtc_get_vblank_counter(struct intel_crtc *crtc)
return 0;
if (!vblank->max_vblank_count)
- return (u32)drm_crtc_accurate_vblank_count(&crtc->base);
+ return (u32)(update_vblank ? drm_crtc_accurate_vblank_count(&crtc->base) :
+ drm_crtc_vblank_count(&crtc->base));
return crtc->base.funcs->get_vblank_counter(&crtc->base);
}
@@ -574,7 +575,7 @@ void intel_pipe_update_start(struct intel_atomic_state *state,
crtc->debug.scanline_start = scanline;
crtc->debug.start_vbl_time = ktime_get();
- crtc->debug.start_vbl_count = intel_crtc_get_vblank_counter(crtc);
+ crtc->debug.start_vbl_count = intel_crtc_get_vblank_counter(crtc, true);
trace_intel_pipe_update_vblank_evaded(crtc);
return;
@@ -660,7 +661,7 @@ void intel_pipe_update_end(struct intel_atomic_state *state,
intel_atomic_get_new_crtc_state(state, crtc);
enum pipe pipe = crtc->pipe;
int scanline_end = intel_get_crtc_scanline(crtc);
- u32 end_vbl_count = intel_crtc_get_vblank_counter(crtc);
+ u32 end_vbl_count = intel_crtc_get_vblank_counter(crtc, true);
ktime_t end_vbl_time = ktime_get();
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
diff --git a/drivers/gpu/drm/i915/display/intel_crtc.h b/drivers/gpu/drm/i915/display/intel_crtc.h
index 8c14ff8b391ea..9826d800f3bb9 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc.h
+++ b/drivers/gpu/drm/i915/display/intel_crtc.h
@@ -43,7 +43,7 @@ int intel_crtc_get_pipe_from_crtc_id_ioctl(struct drm_device *dev, void *data,
struct intel_crtc_state *intel_crtc_state_alloc(struct intel_crtc *crtc);
void intel_crtc_state_reset(struct intel_crtc_state *crtc_state,
struct intel_crtc *crtc);
-u32 intel_crtc_get_vblank_counter(struct intel_crtc *crtc);
+u32 intel_crtc_get_vblank_counter(struct intel_crtc *crtc, bool update_vblank);
void intel_crtc_vblank_on(const struct intel_crtc_state *crtc_state);
void intel_crtc_vblank_off(const struct intel_crtc_state *crtc_state);
void intel_pipe_update_start(struct intel_atomic_state *state,
diff --git a/drivers/gpu/drm/i915/display/intel_display_trace.h b/drivers/gpu/drm/i915/display/intel_display_trace.h
index 27ebc32cb61a5..4e9bea671effe 100644
--- a/drivers/gpu/drm/i915/display/intel_display_trace.h
+++ b/drivers/gpu/drm/i915/display/intel_display_trace.h
@@ -10,6 +10,8 @@
#define TRACE_SYSTEM xe
#endif
+#define UPDATE_VBLANK (!IS_ENABLED(CONFIG_PREEMPT_RT))
+
#if !defined(__INTEL_DISPLAY_TRACE_H__) || defined(TRACE_HEADER_MULTI_READ)
#define __INTEL_DISPLAY_TRACE_H__
@@ -85,7 +87,7 @@ TRACE_EVENT(intel_pipe_enable,
memset(__entry->scanline, 0,
sizeof(__entry->scanline[0]) * I915_MAX_PIPES);
for_each_intel_crtc(display->drm, it__) {
- __entry->frame[it__->pipe] = intel_crtc_get_vblank_counter(it__);
+ __entry->frame[it__->pipe] = intel_crtc_get_vblank_counter(it__, UPDATE_VBLANK);
__entry->scanline[it__->pipe] = intel_get_crtc_scanline(it__);
}
__entry->pipe_name = pipe_name(crtc->pipe);
@@ -115,7 +117,7 @@ TRACE_EVENT(intel_pipe_disable,
memset(__entry->scanline, 0,
sizeof(__entry->scanline[0]) * I915_MAX_PIPES);
for_each_intel_crtc(display->drm, it__) {
- __entry->frame[it__->pipe] = intel_crtc_get_vblank_counter(it__);
+ __entry->frame[it__->pipe] = intel_crtc_get_vblank_counter(it__, UPDATE_VBLANK);
__entry->scanline[it__->pipe] = intel_get_crtc_scanline(it__);
}
__entry->pipe_name = pipe_name(crtc->pipe);
@@ -139,7 +141,7 @@ TRACE_EVENT(intel_crtc_flip_done,
TP_fast_assign(
__assign_str(dev);
__entry->pipe_name = pipe_name(crtc->pipe);
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
),
@@ -163,7 +165,7 @@ TRACE_EVENT(intel_pipe_crc,
TP_fast_assign(
__assign_str(dev);
__entry->pipe_name = pipe_name(crtc->pipe);
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
memcpy(__entry->crcs, crcs, sizeof(__entry->crcs));
),
@@ -191,7 +193,7 @@ TRACE_EVENT(intel_cpu_fifo_underrun,
struct intel_crtc *crtc = intel_crtc_for_pipe(display, pipe);
__assign_str(dev);
__entry->pipe_name = pipe_name(pipe);
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
),
@@ -216,7 +218,7 @@ TRACE_EVENT(intel_pch_fifo_underrun,
struct intel_crtc *crtc = intel_crtc_for_pipe(display, pipe);
__assign_str(dev);
__entry->pipe_name = pipe_name(pipe);
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
),
@@ -245,7 +247,7 @@ TRACE_EVENT(intel_memory_cxsr,
memset(__entry->scanline, 0,
sizeof(__entry->scanline[0]) * I915_MAX_PIPES);
for_each_intel_crtc(display->drm, crtc) {
- __entry->frame[crtc->pipe] = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame[crtc->pipe] = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline[crtc->pipe] = intel_get_crtc_scanline(crtc);
}
__entry->old = old;
@@ -283,7 +285,7 @@ TRACE_EVENT(g4x_wm,
TP_fast_assign(
__assign_str(dev);
__entry->pipe_name = pipe_name(crtc->pipe);
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
__entry->primary = wm->pipe[crtc->pipe].plane[PLANE_PRIMARY];
__entry->sprite = wm->pipe[crtc->pipe].plane[PLANE_SPRITE0];
@@ -330,7 +332,7 @@ TRACE_EVENT(vlv_wm,
TP_fast_assign(
__assign_str(dev);
__entry->pipe_name = pipe_name(crtc->pipe);
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
__entry->level = wm->level;
__entry->cxsr = wm->cxsr;
@@ -367,7 +369,7 @@ TRACE_EVENT(vlv_fifo_size,
TP_fast_assign(
__assign_str(dev);
__entry->pipe_name = pipe_name(crtc->pipe);
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
__entry->sprite0_start = sprite0_start;
__entry->sprite1_start = sprite1_start;
@@ -397,7 +399,7 @@ TRACE_EVENT(intel_plane_async_flip,
__assign_str(dev);
__assign_str(name);
__entry->pipe_name = pipe_name(crtc->pipe);
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
__entry->async_flip = async_flip;
),
@@ -426,7 +428,7 @@ TRACE_EVENT(intel_plane_update_noarm,
__assign_str(dev);
__assign_str(name);
__entry->pipe_name = pipe_name(crtc->pipe);
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
__entry->format = plane_state->hw.fb->format->format;
memcpy(__entry->src, &plane_state->uapi.src, sizeof(__entry->src));
@@ -459,7 +461,7 @@ TRACE_EVENT(intel_plane_update_arm,
__assign_str(dev);
__assign_str(name);
__entry->pipe_name = pipe_name(crtc->pipe);
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
__entry->format = plane_state->hw.fb->format->format;
memcpy(__entry->src, &plane_state->uapi.src, sizeof(__entry->src));
@@ -489,7 +491,7 @@ TRACE_EVENT(intel_plane_disable_arm,
__assign_str(dev);
__assign_str(name);
__entry->pipe_name = pipe_name(crtc->pipe);
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
),
@@ -523,7 +525,7 @@ TRACE_EVENT(intel_plane_scaler_update_arm,
__assign_str(name);
__entry->pipe_name = pipe_name(crtc->pipe);
__entry->scaler_id = scaler_id;
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
__entry->x = x;
__entry->y = y;
@@ -558,7 +560,7 @@ TRACE_EVENT(intel_pipe_scaler_update_arm,
__assign_str(dev);
__entry->pipe_name = pipe_name(crtc->pipe);
__entry->scaler_id = scaler_id;
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
__entry->x = x;
__entry->y = y;
@@ -588,7 +590,7 @@ TRACE_EVENT(intel_scaler_disable_arm,
__assign_str(dev);
__entry->pipe_name = pipe_name(crtc->pipe);
__entry->scaler_id = scaler_id;
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
),
@@ -616,7 +618,7 @@ TRACE_EVENT(intel_fbc_activate,
__assign_str(dev);
__assign_str(name);
__entry->pipe_name = pipe_name(crtc->pipe);
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
),
@@ -644,7 +646,7 @@ TRACE_EVENT(intel_fbc_deactivate,
__assign_str(dev);
__assign_str(name);
__entry->pipe_name = pipe_name(crtc->pipe);
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
),
@@ -672,7 +674,7 @@ TRACE_EVENT(intel_fbc_nuke,
__assign_str(dev);
__assign_str(name);
__entry->pipe_name = pipe_name(crtc->pipe);
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
),
@@ -695,7 +697,7 @@ TRACE_EVENT(intel_crtc_vblank_work_start,
TP_fast_assign(
__assign_str(dev);
__entry->pipe_name = pipe_name(crtc->pipe);
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
),
@@ -718,7 +720,7 @@ TRACE_EVENT(intel_crtc_vblank_work_end,
TP_fast_assign(
__assign_str(dev);
__entry->pipe_name = pipe_name(crtc->pipe);
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
),
@@ -743,7 +745,7 @@ TRACE_EVENT(intel_pipe_update_start,
TP_fast_assign(
__assign_str(dev);
__entry->pipe_name = pipe_name(crtc->pipe);
- __entry->frame = intel_crtc_get_vblank_counter(crtc);
+ __entry->frame = intel_crtc_get_vblank_counter(crtc, UPDATE_VBLANK);
__entry->scanline = intel_get_crtc_scanline(crtc);
__entry->min = crtc->debug.min_vbl;
__entry->max = crtc->debug.max_vbl;
--
2.50.1
next prev parent reply other threads:[~2025-08-28 9:09 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-28 9:09 [PATCH 1/2] drm/i915: Disable tracepoints for PREEMPT_RT Maarten Lankhorst
2025-08-28 9:09 ` Maarten Lankhorst [this message]
2025-08-29 11:14 ` [PATCH 2/2] drm/i915/display: Make tracepoints work correctly on xe with PREEMPT_RT Jani Nikula
2025-08-29 11:55 ` Maarten Lankhorst
2025-08-29 12:32 ` Jani Nikula
2025-08-29 13:18 ` Maarten Lankhorst
2025-08-29 12:08 ` Sebastian Andrzej Siewior
2025-08-29 12:37 ` Maarten Lankhorst
2025-08-29 13:11 ` Sebastian Andrzej Siewior
2025-08-28 16:19 ` ✓ i915.CI.BAT: success for series starting with [1/2] drm/i915: Disable tracepoints for PREEMPT_RT Patchwork
2025-08-28 21:46 ` ✗ i915.CI.Full: failure " Patchwork
2025-08-29 11:15 ` [PATCH 1/2] " Jani Nikula
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250828090944.101069-2-dev@lankhorst.se \
--to=dev@lankhorst.se \
--cc=bigeasy@linutronix.de \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).