[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <686ae9c3d4697956d16eff0b6f2e6e43cb25ba90@intel.com>
Date: Fri, 09 Jan 2026 10:18:08 +0200
From: Jani Nikula <jani.nikula@...ux.intel.com>
To: Aaron Erhardt <aer@...edocomputers.com>, Maarten Lankhorst
<maarten.lankhorst@...ux.intel.com>, Maxime Ripard <mripard@...nel.org>,
Thomas Zimmermann <tzimmermann@...e.de>, David Airlie <airlied@...il.com>,
Simona Vetter <simona@...ll.ch>
Cc: Aaron Erhardt <aer@...edocomputers.com>,
dri-devel@...ts.freedesktop.org, linux-kernel@...r.kernel.org
Subject: Re: [RESEND RFC PATCH 1/1] drm: ensure that vblank diff is never
negative
On Thu, 08 Jan 2026, Aaron Erhardt <aer@...edocomputers.com> 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@...edocomputers.com>
> ---
> 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
Powered by blists - more mailing lists