On Mon, Nov 16, 2020 at 09:04:35PM +0100, Thomas Zimmermann wrote: > If the damage handling fails, restore the damage area. The next invocation > of the damage worker will then perform the update. > > Signed-off-by: Thomas Zimmermann <tzimmermann@xxxxxxx> > --- > drivers/gpu/drm/drm_fb_helper.c | 23 ++++++++++++++++++++--- > 1 file changed, 20 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c > index 2e1a335bafd2..13b65dad2ca8 100644 > --- a/drivers/gpu/drm/drm_fb_helper.c > +++ b/drivers/gpu/drm/drm_fb_helper.c > @@ -431,11 +431,28 @@ static void drm_fb_helper_damage_work(struct work_struct *work) > if (helper->buffer) { > ret = drm_fb_helper_damage_blit(helper, &clip_copy); > if (ret) > - return; > + goto err; > } > > - if (helper->fb->funcs->dirty) > - helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, &clip_copy, 1); > + if (helper->fb->funcs->dirty) { > + ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, &clip_copy, 1); > + if (ret) > + goto err; I think this is unexpected enough that we should put some drm error printing here I think. -Daniel > + } > + > + return; > + > +err: > + /* > + * Restore damage clip rectangle on errors. Next instance of damage > + * worker will perform the update. > + */ > + spin_lock_irqsave(&helper->damage_lock, flags); > + clip->x1 = min_t(u32, clip->x1, clip_copy.x1); > + clip->y1 = min_t(u32, clip->y1, clip_copy.y1); > + clip->x2 = max_t(u32, clip->x2, clip_copy.x2); > + clip->y2 = max_t(u32, clip->y2, clip_copy.y2); > + spin_unlock_irqrestore(&helper->damage_lock, flags); > } > > /** > -- > 2.29.2 > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel