Re: [RESEND RFC PATCH 1/1] drm: ensure that vblank diff is never negative

From: Jani Nikula
Date: Fri Jan 09 2026 - 03:18:22 EST


On Thu, 08 Jan 2026, Aaron Erhardt <aer@xxxxxxxxxxxxxxxxxxx> wrote:
> Handle cases, where drivers report incorrect timestamps and negative
> time differences are calculated. If the negative difference is large
> enough, negative missed vblanks are reported, but stored in an unsigned
> integer which can causes freezes. This patch prevents this case.
>
> This fix has been verified to fix problems with the i915 driver on
> modern Intel CPUs (e.g. Intel Core Ultra 7 155H).

Is there a reported bug about this, preferrably with logs? If not,
please file one as instructed at [1], and reference the patch.


BR,
Jani.


[1] https://drm.pages.freedesktop.org/intel-docs/how-to-file-i915-bugs.html


>
> Signed-off-by: Aaron Erhardt <aer@xxxxxxxxxxxxxxxxxxx>
> ---
> drivers/gpu/drm/drm_vblank.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
> index 94e45ed6869d..1022b6d61e4e 100644
> --- a/drivers/gpu/drm/drm_vblank.c
> +++ b/drivers/gpu/drm/drm_vblank.c
> @@ -1563,7 +1563,14 @@ static void drm_vblank_restore(struct drm_device *dev, unsigned int pipe)
> } while (cur_vblank != __get_vblank_counter(dev, pipe) && --count > 0);
>
> diff_ns = ktime_to_ns(ktime_sub(t_vblank, vblank->time));
> - if (framedur_ns)
> +
> + /*
> + * Make sure no bogus diffs result from negative differences
> + * when incorrect timestamps are reported by a driver.
> + */
> + if (drm_WARN_ON_ONCE(dev, t_vblank < vblank->time))
> + diff = 0;
> + else if (framedur_ns)
> diff = DIV_ROUND_CLOSEST_ULL(diff_ns, framedur_ns);

--
Jani Nikula, Intel