On Thu, 08 Jan 2026, Aaron Erhardt <[email protected]> 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 <[email protected]>
> ---
>  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

Reply via email to