All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Nicolas Frattaroli" <nicolas.frattaroli@collabora.com>
Cc: dri-devel@lists.freedesktop.org
Subject: Re: [PATCH RFC 14/25] drm: Implement VRR rate limiting
Date: Mon, 21 Sep 2026 16:17:56 +0000	[thread overview]
Message-ID: <20260921161757.442411F000FF@smtp.kernel.org> (raw)
In-Reply-To: <20260921-vrr-limiter-uapi-v1-14-2fcd7d011646@collabora.com>

Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
- [High] drm: integer overflow and implicit sign conversion in VRR vsync pacing
- [Medium] drm: missing initialization of VRR accumulator cur_err on rate transitions
- [Medium] drm: fixed VRR target rates bypass sink's max_vfreq capability check
- [Low] drm: redundant check_mul_overflow and unused limit_d in VRR limits validation
--

commit d061573186c289ab886bdae3285afbec3f7304ae
Author: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>

    drm: Implement VRR rate limiting

    Currently, VRR is allowed to use the entire range advertised by the
    sink's EDID. Userspace may find it desirable, however, to limit this
    range, or set a fixed target rate entirely. The latter is mainly useful
    for multimedia playback applications, where judder can be avoided by
    matching the content's frame rate precisely.

> diff --git a/drivers/gpu/drm/display/drm_hdmi_state_helper.c b/drivers/gpu/drm/display/drm_hdmi_state_helper.c
> index 33d0c94916430..7dbd678cf0612 100644
> --- a/drivers/gpu/drm/display/drm_hdmi_state_helper.c
> +++ b/drivers/gpu/drm/display/drm_hdmi_state_helper.c
[ ... ]
> @@ -1046,6 +1047,39 @@ static int hdmi_calculate_vtotal(const struct drm_display_mode *mode,
>  	return 0;
>  }
>  
> +static int hdmi_validate_vrr_limits(struct drm_crtc_state *crtc_state, u16 vrr_min)
> +{
> +	struct drm_crtc_vrr_state *vrr_state = &crtc_state->vrr_state;
> +	const struct drm_display_mode *mode = &crtc_state->mode;
> +	u32 limit_d;
> +	int ret;
> +
> +	/* No limiter, don't need to validate, but reset the error */
> +	if (!drm_crtc_helper_vrr_is_fixed_rate(vrr_state)) {
> +		vrr_state->per_frame_err = 0;
> +		return 0;
> +	}
> +
> +	/* Don't allow rates equal to or below the minimum VRR rate / 1.001 */
> +	if (cmp_fraction(vrr_state->vrr_min_n, vrr_state->vrr_min_d,
> +			 vrr_min * 1000, 1001) < 0)
> +		return -EINVAL;
> +
> +	if (check_mul_overflow(mode->crtc_htotal, vrr_state->vrr_min_n, &limit_d))
> +		return -ERANGE;

[Severity: Low]
Is the limit_d variable ever used after being assigned in this overflow check?

Also, doesn't hdmi_calculate_vtotal() duplicate the exact same
mode->crtc_htotal * rate_n check immediately below, making this check
redundant?

> +
> +	ret = hdmi_calculate_vtotal(&crtc_state->mode, vrr_state->vrr_min_n,
> +				    vrr_state->vrr_min_d, &vrr_state->base_vtotal,
> +				    &vrr_state->denom, &vrr_state->per_frame_err);

[Severity: Medium]
When userspace changes the fixed VRR target rate or switches from dynamic
to fixed VRR, does this state transition leave the old cur_err
accumulator value intact?

If the new denom is significantly smaller than the old one, could a
disproportionately large carried-over cur_err take thousands of frames
to drain, causing a persistent frame rate artifact (stuck at
base_vtotal + 1) for several seconds?

> +	if (ret)
> +		return ret;
> +
> +	if (vrr_state->base_vtotal < mode->crtc_vtotal)
> +		return -EINVAL;
> +
> +	return 0;
> +}
[ ... ]
> @@ -1112,25 +1151,64 @@ static int hdmi_validate_vrr(struct drm_connector *connector,
>  
>  	vrr_state->vic = drm_match_cea_mode(mode);
>  
> -	if (cmp_fraction(min_vfreq_n, min_vfreq_d, max_vfreq_n, max_vfreq_d) > 0) {
> -		drm_dbg_kms(dev, "Target max (%u/%u) > target min (%u/%u)\n",
> -			    max_vfreq_n, max_vfreq_d, min_vfreq_n, min_vfreq_d);
> -		return -EINVAL;
> -	}
> -
> -	ret = hdmi_calculate_vtotal(mode, max_vfreq_n, max_vfreq_d,
> -				    &vrr_state->base_vtotal, NULL, NULL);
> +	ret = hdmi_validate_vrr_limits(new_crtc_state, min_vfreq_n);
>  	if (ret) {
> -		drm_dbg_kms(dev, "Couldn't calculate base_vtotal: %pe\n", ERR_PTR(ret));
> +		drm_dbg_kms(dev, "Invalid VRR fixed target rate: %pe\n", ERR_PTR(ret));
>  		return ret;
>  	}
>  
> -	/*
> -	 * Even at its fastest, it can't go faster than the mode, so
> -	 * clamp to avoid imprecisely rounded mode_refresh values we
> -	 * can't do anything about from ruining our day.
> -	 */
> -	vrr_state->base_vtotal = max(vrr_state->base_vtotal, mode->crtc_vtotal);
> +	if (!is_fixed) {

[Severity: Medium]
If a userspace DRM client requests a fixed VRR target rate, does wrapping
the capability checks in if (!is_fixed) cause the driver to silently
bypass validating against the monitor's max_vfreq?

If the monitor's EDID advertises a max_vfreq strictly lower than the
mode's refresh rate, couldn't userspace improperly exceed the sink's
hardware capabilities?

> +		vrr_state->dynamic = true;
> +
> +		if (vrr_state->vrr_min_n) {
> +			if (!vrr_state->vrr_min_d)
> +				return -EINVAL;
[ ... ]
> diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
> index 4ffb3b0b78780..c46de778df309 100644
> --- a/drivers/gpu/drm/drm_crtc_helper.c
> +++ b/drivers/gpu/drm/drm_crtc_helper.c
[ ... ]
> @@ -889,10 +908,21 @@ 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)
> +	if (!crtc_state->vrr_enabled) {
>  		vrr->cur_vtotal = 0;
> -	else
> +		vrr->cur_err = 0;
> +	} else if (drm_crtc_helper_vrr_is_fixed_rate(vrr)) {
> +		if (vrr->cur_err * 2 >= vrr->denom) {

[Severity: High]
Since vrr->cur_err is an int and vrr->denom is a u32, can this
cause an implicit sign conversion bug?

When userspace sets a fixed VRR rate where per_frame_err < denom / 2,
cur_err becomes negative after vrr->cur_err -= vrr->denom executes.

Because vrr->denom is a u32, won't C integer promotion rules implicitly
cast the negative int to a massive u32, causing this check to be
unconditionally true every frame thereafter?

> +			vrr->cur_err -= vrr->denom;
> +			vrr->cur_vtotal = vrr->base_vtotal + 1;
> +		} else {
> +			vrr->cur_vtotal = vrr->base_vtotal;
> +		}
> +
> +		vrr->cur_err += vrr->per_frame_err;
> +	} else {
>  		vrr->cur_vtotal = vrr->max_vtotal;
> +	}
[ ... ]
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index df37f4ebb58ed..00e9df02f3d5e 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -71,6 +71,9 @@ struct drm_crtc_vrr_state {
>  	u32 vrr_min_d;
>  	u32 vrr_max_n;
>  	u32 vrr_max_d;
> +	u32 denom;
> +	u32 per_frame_err;
> +	int cur_err;

[Severity: High]
Does declaring cur_err as an int while denom is a u32 cause the
signed/unsigned comparison flaw in drm_crtc_helper_vrr_vsync()?

>  	u16 base_vtotal;
>  	bool dynamic;
>  };

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260921-vrr-limiter-uapi-v1-0-2fcd7d011646@collabora.com?part=14

  reply	other threads:[~2026-09-21 16:17 UTC|newest]

Thread overview: 131+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-21 15:51 [PATCH RFC 00/25] VRR Target Rate Limiter KMS uAPI and Implementation Nicolas Frattaroli
2026-09-21 15:51 ` Nicolas Frattaroli
2026-09-21 15:51 ` [PATCH RFC 01/25] drm/edid: Add a query for vrr range Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:08   ` sashiko-bot
2026-09-21 15:51 ` [PATCH RFC 02/25] drm: Add VRR state Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-24  6:55   ` Vidith Madhu
2026-09-24  6:55     ` Vidith Madhu
2026-09-21 15:51 ` [PATCH RFC 03/25] drm/atomic-helper: Set mode_changed on vrr_enabled change Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:13   ` sashiko-bot
2026-09-21 21:59   ` Leo Li
2026-09-21 21:59     ` Leo Li
2026-09-22 12:53     ` Nicolas Frattaroli
2026-09-22 12:53       ` Nicolas Frattaroli
2026-09-22 13:22       ` Maxime Ripard
2026-09-22 13:22         ` Maxime Ripard
2026-09-24  6:45     ` Vidith Madhu
2026-09-24  6:45       ` Vidith Madhu
2026-09-21 22:01   ` Leo Li
2026-09-21 22:01     ` Leo Li
2026-09-21 15:51 ` [PATCH RFC 04/25] video/hdmi: Add VTEM EMP packing Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:07   ` sashiko-bot
2026-09-21 15:51 ` [PATCH RFC 05/25] drm/bridge: Add VTEM EMP support Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:01   ` sashiko-bot
2026-09-21 15:51 ` [PATCH RFC 06/25] drm/connector: hdmi: Add VTEM EMP generation Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:13   ` sashiko-bot
2026-09-25  3:48   ` Vidith Madhu
2026-09-25  3:48     ` Vidith Madhu
2026-09-25 10:42     ` Daniel Stone
2026-09-25 10:42       ` Daniel Stone
2026-09-25 11:11       ` Jani Nikula
2026-09-25 11:11         ` Jani Nikula
2026-09-26 11:03     ` Nicolas Frattaroli
2026-09-26 11:03       ` Nicolas Frattaroli
2026-09-29 18:55       ` Vidith Madhu
2026-09-29 18:55         ` Vidith Madhu
2026-09-30  7:50         ` Michel Dänzer
2026-09-30  7:50           ` Michel Dänzer
2026-09-21 15:51 ` [PATCH RFC 07/25] drm/crtc-helper: Add VRR helper functions Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:05   ` sashiko-bot
2026-09-21 15:51 ` [PATCH RFC 08/25] drm/bridge: synopsys: Add VTEM EMP support Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:06   ` sashiko-bot
2026-09-21 15:51 ` [PATCH RFC 09/25] drm/connector: Add drm_display_info_is_vrr_capable Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:04   ` sashiko-bot
2026-09-21 15:51 ` [PATCH RFC 10/25] drm/rockchip: dw_hdmi_qp: Add VRR support Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:09   ` sashiko-bot
2026-09-21 15:51 ` [PATCH RFC 11/25] drm/rockchip: vop2: Enable VRR Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:16   ` sashiko-bot
2026-09-21 15:51 ` [PATCH RFC 12/25] drm/edid: Parse CinemaVRR flag from HDMI SCDS Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:13   ` sashiko-bot
2026-09-21 15:51 ` [PATCH RFC 13/25] drm: Add VRR target frame rate properties Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:14   ` sashiko-bot
2026-09-21 22:23   ` Leo Li
2026-09-21 22:23     ` Leo Li
2026-09-22 15:26     ` Nicolas Frattaroli
2026-09-22 15:26       ` Nicolas Frattaroli
2026-09-25 18:42       ` Leo Li
2026-09-25 18:42         ` Leo Li
2026-09-26 12:13         ` Nicolas Frattaroli
2026-09-26 12:13           ` Nicolas Frattaroli
2026-09-28  8:10         ` Michel Dänzer
2026-09-28  8:10           ` Michel Dänzer
2026-09-29 14:34           ` Leo Li
2026-09-29 14:34             ` Leo Li
2026-09-29 16:00             ` Michel Dänzer
2026-09-29 16:00               ` Michel Dänzer
2026-09-29 18:14             ` Nicolas Frattaroli
2026-09-29 18:14               ` Nicolas Frattaroli
2026-09-29 18:24               ` Nicolas Frattaroli
2026-09-29 18:24                 ` Nicolas Frattaroli
2026-09-23  9:51   ` Michel Dänzer
2026-09-23  9:51     ` Michel Dänzer
2026-09-23  9:54     ` Michel Dänzer
2026-09-23  9:54       ` Michel Dänzer
2026-09-23 14:39     ` Nicolas Frattaroli
2026-09-23 14:39       ` Nicolas Frattaroli
2026-09-24  7:01       ` Vidith Madhu
2026-09-24  7:01         ` Vidith Madhu
2026-09-24 12:10         ` Nicolas Frattaroli
2026-09-24 12:10           ` Nicolas Frattaroli
2026-09-29 19:16   ` Vidith Madhu
2026-09-29 19:16     ` Vidith Madhu
2026-09-29 19:55     ` Nicolas Frattaroli
2026-09-29 19:55       ` Nicolas Frattaroli
2026-09-29 21:05       ` Vidith Madhu
2026-09-29 21:05         ` Vidith Madhu
2026-09-29 22:21     ` Xaver Hugl
2026-09-29 22:21       ` Xaver Hugl
2026-09-21 15:51 ` [PATCH RFC 14/25] drm: Implement VRR rate limiting Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:17   ` sashiko-bot [this message]
2026-09-21 15:51 ` [PATCH RFC 15/25] drm/edid: Parse QMS flag from HDMI SCDS Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:18   ` sashiko-bot
2026-09-21 15:51 ` [PATCH RFC 16/25] drm/edid: Parse QMS TFR min/max flags " Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:19   ` sashiko-bot
2026-09-21 15:51 ` [PATCH RFC 17/25] drm/connector: Add "qms_enabled" drm property Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:20   ` sashiko-bot
2026-09-21 15:51 ` [PATCH RFC 18/25] video/hdmi: Add support for QMS in VTEM EMP packing Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 15:51 ` [PATCH RFC 19/25] drm/connector: hdmi: Add QMS to VTEM EMP generation Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 15:51 ` [PATCH RFC 20/25] drm/connector: hdmi: Add QMS state validation and computation Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 15:51 ` [PATCH RFC 21/25] drm/rockchip: dw_hdmi_qp: Add QMS support Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 15:51 ` [PATCH RFC 22/25] drm/tests: hdmi: Add "Game Mode" VRR tests Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:26   ` sashiko-bot
2026-09-21 15:51 ` [PATCH RFC 23/25] drm/tests: hdmi: Add Fixed/Constrained rate " Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 15:51 ` [PATCH RFC 24/25] drm/tests: hdmi: Add Quick Media Switching tests Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:26   ` sashiko-bot
2026-09-21 15:51 ` [PATCH RFC 25/25] drm/atomic: Disable VRR in helper_set_config Nicolas Frattaroli
2026-09-21 15:51   ` Nicolas Frattaroli
2026-09-21 16:26   ` 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=20260921161757.442411F000FF@smtp.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.