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
