From: sashiko-bot@kernel.org
To: "Nicolas Frattaroli" <nicolas.frattaroli@collabora.com>
Cc: dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v2 06/27] drm/crtc-helper: Add VRR helper functions
Date: Thu, 05 Nov 2026 16:49:41 +0000 [thread overview]
Message-ID: <sashiko-outbox-199534@kernel.org> (raw)
In-Reply-To: <20261105-vrr-limiter-uapi-v2-6-55f4215be2c2@collabora.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] drm/crtc-helper: unsynchronized crtc_state mutation in VRR helpers
- [Medium] drm/crtc-helper: vrr->dynamic set and left true when VRR is disabled
--
commit 2e8aace704ca21ab8efb4aacd3b771407706ec16
Author: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
drm/crtc-helper: Add VRR helper functions
This commit adds drm_crtc_helper_vrr_flush() and drm_crtc_helper_vrr_vsync()
to update the internal VRR state in struct drm_crtc_state when a new frame is
ready or when a vertical blank ends, returning whether cur_vtotal changed.
> diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
> index 4a8cfe046e4ab..4ffb3b0b78780 100644
> --- a/drivers/gpu/drm/drm_crtc_helper.c
> +++ b/drivers/gpu/drm/drm_crtc_helper.c
> @@ -838,6 +838,69 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set,
> }
> EXPORT_SYMBOL(drm_crtc_helper_set_config);
>
> +/**
> + * drm_crtc_helper_vrr_flush - Update VRR state on frame ready
> + * @crtc_state: pointer to &struct drm_crtc_state of CRTC that has a new frame ready
> + *
> + * Update the VRR state by communicating that a frame is ready on
> + * @crtc_state.crtc.
> + *
> + * Should be called from the @crtc_state.crtc &drm_crtc_helper_funcs.atomic_flush
> + * hook.
> + *
> + * Returns:
> + * - %true if @crtc_state.vrr_state.cur_vtotal changed
> + * - %false otherwise
> + */
> +bool drm_crtc_helper_vrr_flush(struct drm_crtc_state *crtc_state)
> +{
> + struct drm_crtc_vrr_state *vrr = &crtc_state->vrr_state;
> +
> + if (!crtc_state->vrr_enabled) {
> + if (vrr->cur_vtotal) {
> + vrr->cur_vtotal = 0;
> + return true;
> + }
> + return false;
> + }
> +
> + if (vrr->cur_vtotal == vrr->base_vtotal)
> + return false;
> +
> + vrr->cur_vtotal = vrr->base_vtotal;
> +
> + return true;
> +}
> +EXPORT_SYMBOL(drm_crtc_helper_vrr_flush);
[Severity: High]
As reported by Sashiko on RFC [1], is it safe for drm_crtc_helper_vrr_vsync()
and drm_crtc_helper_vrr_flush() to mutate crtc_state->vrr_state in place
across commits and from the vblank interrupt handler?
Consider a sequence of two atomic commits when VRR is enabled:
1. Commit 1 runs atomic_flush and calls drm_crtc_helper_vrr_flush(state_1),
which sets state_1->vrr_state.cur_vtotal = base_vtotal and programs the
hardware vtotal to base_vtotal.
2. Commit 2 starts and calls drm_atomic_get_crtc_state() ->
__drm_atomic_helper_crtc_duplicate_state(), which copies crtc->state
(state_1) into state_2 via memcpy(), snapshotting
state_2->vrr_state.cur_vtotal = base_vtotal.
3. Before commit 2 calls drm_atomic_helper_swap_state() (or while waiting on
fences / hw_done), a vblank interrupt fires and the driver's vblank
handler calls drm_crtc_helper_vrr_vsync(crtc->state) on state_1, setting
state_1->vrr_state.cur_vtotal = max_vtotal and programming the hardware
vtotal to max_vtotal.
4. Commit 2 runs drm_atomic_helper_swap_state(), replacing crtc->state with
state_2, which still holds the stale vrr_state.cur_vtotal == base_vtotal
copied in step 2.
5. When commit 2 reaches atomic_flush and calls
drm_crtc_helper_vrr_flush(state_2), vrr->cur_vtotal == vrr->base_vtotal
evaluates to true and the helper returns false, causing the driver to skip
reprogramming the hardware vtotal back from max_vtotal to base_vtotal for
the new frame.
In addition, drm_crtc_helper_vrr_vsync() mutates crtc->state->vrr_state from
hardirq context without synchronization against
__drm_atomic_helper_crtc_duplicate_state(), drm_atomic_helper_swap_state(),
drm_crtc_helper_vrr_flush(), or state destruction after
drm_atomic_helper_commit_hw_done(). Should the mutable runtime VRR state live
on struct drm_crtc protected by an irq-safe spinlock rather than in
struct drm_crtc_state?
> +
> +/**
> + * drm_crtc_helper_vrr_vsync - Update VRR state on vblank end
> + * @crtc_state: pointer to &struct drm_crtc_state of CRTC the vblank occurred on
> + *
> + * Update the VRR state by communicating that a vertical blank has ended and a
> + * new frame is about to start.
> + *
> + * Returns:
> + * - %true if @crtc_state.vrr_state.cur_vtotal changed
> + * - %false otherwise
> + */
> +bool drm_crtc_helper_vrr_vsync(struct drm_crtc_state *crtc_state)
> +{
> + struct drm_crtc_vrr_state *vrr = &crtc_state->vrr_state;
> + u16 old_vtotal = vrr->cur_vtotal;
> +
> + if (!crtc_state->vrr_enabled)
> + vrr->cur_vtotal = 0;
> + else
> + vrr->cur_vtotal = vrr->max_vtotal;
> +
> + if (abs_diff(vrr->cur_vtotal, old_vtotal) > 1)
> + vrr->dynamic = true;
> +
> + return old_vtotal != vrr->cur_vtotal;
> +}
[Severity: Medium]
When crtc_state->vrr_enabled is false, drm_crtc_helper_vrr_vsync() sets
vrr->cur_vtotal = 0 and then checks:
if (abs_diff(vrr->cur_vtotal, old_vtotal) > 1)
vrr->dynamic = true;
If VRR was previously enabled so old_vtotal > 1 (including fixed-rate VRR
where vrr->dynamic was false), doesn't abs_diff(0, old_vtotal) > 1 evaluate
to true and set vrr->dynamic = true when VRR is disabled?
Neither drm_crtc_helper_vrr_vsync() nor drm_crtc_helper_vrr_flush() resets
vrr->dynamic to false in the !crtc_state->vrr_enabled path either, leaving
vrr->dynamic stuck at true after VRR is turned off. Should both helpers clear
vrr->dynamic = false when !crtc_state->vrr_enabled?
[1] https://lore.kernel.org/r/20260921-vrr-limiter-uapi-v1-7-2fcd7d011646@collabora.com
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261105-vrr-limiter-uapi-v2-0-55f4215be2c2@collabora.com?part=6
next prev parent reply other threads:[~2026-11-05 16:49 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-05 15:51 [PATCH v2 00/27] VRR Target Rate Limiter KMS uAPI and Implementation Nicolas Frattaroli
2026-11-05 15:51 ` Nicolas Frattaroli
2026-11-05 15:51 ` [PATCH v2 01/27] drm: Add VRR state Nicolas Frattaroli
2026-11-05 15:51 ` Nicolas Frattaroli
2026-11-05 16:44 ` sashiko-bot
2026-11-05 15:51 ` [PATCH v2 02/27] drm/connector: add vrr_display_mode connector property Nicolas Frattaroli
2026-11-05 15:51 ` Nicolas Frattaroli
2026-11-05 16:27 ` sashiko-bot
2026-11-05 15:51 ` [PATCH v2 03/27] video/hdmi: Add VTEM EMP packing Nicolas Frattaroli
2026-11-05 15:51 ` Nicolas Frattaroli
2026-11-05 16:29 ` sashiko-bot
2026-11-05 15:51 ` [PATCH v2 04/27] drm/bridge: Add VTEM EMP support Nicolas Frattaroli
2026-11-05 15:51 ` Nicolas Frattaroli
2026-11-05 16:33 ` sashiko-bot
2026-11-05 15:51 ` [PATCH v2 05/27] drm/connector: hdmi: Add VTEM EMP generation Nicolas Frattaroli
2026-11-05 15:51 ` Nicolas Frattaroli
2026-11-05 16:53 ` sashiko-bot
2026-11-05 15:51 ` [PATCH v2 06/27] drm/crtc-helper: Add VRR helper functions Nicolas Frattaroli
2026-11-05 15:51 ` Nicolas Frattaroli
2026-11-05 16:49 ` sashiko-bot [this message]
2026-11-05 15:51 ` [PATCH v2 07/27] drm/bridge: synopsys: Add VTEM EMP support Nicolas Frattaroli
2026-11-05 15:51 ` Nicolas Frattaroli
2026-11-05 15:51 ` [PATCH v2 08/27] drm/connector: Add drm_display_info_is_vrr_capable Nicolas Frattaroli
2026-11-05 15:51 ` Nicolas Frattaroli
2026-11-05 16:58 ` sashiko-bot
2026-11-05 15:52 ` [PATCH v2 09/27] drm: Add VRR target frame rate properties Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 17:07 ` sashiko-bot
2026-11-05 15:52 ` [PATCH v2 10/27] drm/connector: Add vrr_display_{min,max} connector properties Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 17:08 ` sashiko-bot
2026-11-05 15:52 ` [PATCH v2 11/27] drm: Implement VRR rate limiting Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 17:17 ` sashiko-bot
2026-11-05 15:52 ` [PATCH v2 12/27] drm/rockchip: dw_hdmi_qp: Add VRR support Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 17:30 ` sashiko-bot
2026-11-05 15:52 ` [PATCH v2 13/27] drm/rockchip: Set mode_changed on vrr_enabled change Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 14/27] drm/rockchip: vop2: Enable VRR Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 17:40 ` sashiko-bot
2026-11-05 15:52 ` [PATCH v2 15/27] drm/edid: Parse QMS flag from HDMI SCDS Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 16/27] drm/edid: Parse QMS TFR min/max flags " Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 17/27] drm/connector: Add "Media" VRR display mode for QMS Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 18/27] video/hdmi: Add support for QMS in VTEM EMP packing Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 19/27] drm/connector: hdmi: Add QMS to VTEM EMP generation Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 17:45 ` sashiko-bot
2026-11-05 15:52 ` [PATCH v2 20/27] drm/connector: hdmi: Add QMS state validation and computation Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 17:53 ` sashiko-bot
2026-11-05 15:52 ` [PATCH v2 21/27] drm/rockchip: dw_hdmi_qp: Add QMS support Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 18:01 ` sashiko-bot
2026-11-05 15:52 ` [PATCH v2 22/27] drm/tests: hdmi: Add "Game Mode" VRR tests Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 23/27] drm/tests: hdmi: Add Fixed/Constrained rate " Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 17:57 ` sashiko-bot
2026-11-05 15:52 ` [PATCH v2 24/27] drm/tests: hdmi: Add Quick Media Switching tests Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 25/27] drm/connector: Fix docs for cnmvrr and cinemavrr members Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 15:52 ` [PATCH v2 26/27] drm/debugfs: Expose HDMI VRR in vrr_range debugfs Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 18:05 ` sashiko-bot
2026-11-05 15:52 ` [PATCH v2 27/27] drm/tests: hdmi: Add tests for vrr_display_{min,max} properties Nicolas Frattaroli
2026-11-05 15:52 ` Nicolas Frattaroli
2026-11-05 18:03 ` sashiko-bot
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=sashiko-outbox-199534@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=nicolas.frattaroli@collabora.com \
--cc=sashiko-reviews@lists.linux.dev \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.