Revert "drm/fb-helper: Remove damage worker"
authorThomas Zimmermann <tzimmermann@suse.de>
Fri, 18 Nov 2022 13:35:33 +0000 (14:35 +0100)
committerThomas Zimmermann <tzimmermann@suse.de>
Sun, 20 Nov 2022 10:23:12 +0000 (11:23 +0100)
This reverts commit 27c3e9452d552ea86369a94f23287a9675f2d7a1.

Needed to restore the fbdev damage worker. There have been bug reports
about locking order [1] and incorrectly takens branches. [2] Restore
the damage worker until these problems have been resovled.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: https://intel-gfx-ci.01.org/tree/drm-tip/fi-kbl-8809g.html
Link: https://lore.kernel.org/dri-devel/20221115115819.23088-6-tzimmermann@suse.de/T/#m06eedc0a468940e4cbbd14ca026733b639bc445a
Link: https://patchwork.freedesktop.org/patch/msgid/20221118133535.9739-2-tzimmermann@suse.de
drivers/gpu/drm/drm_fb_helper.c
include/drm/drm_fb_helper.h

index a1f86e4..c0e9a97 100644 (file)
@@ -403,6 +403,13 @@ err:
        spin_unlock_irqrestore(&helper->damage_lock, flags);
 }
 
+static void drm_fb_helper_damage_work(struct work_struct *work)
+{
+       struct drm_fb_helper *helper = container_of(work, struct drm_fb_helper, damage_work);
+
+       drm_fb_helper_fb_dirty(helper);
+}
+
 /**
  * drm_fb_helper_prepare - setup a drm_fb_helper structure
  * @dev: DRM device
@@ -418,6 +425,7 @@ void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper,
        INIT_LIST_HEAD(&helper->kernel_fb_list);
        spin_lock_init(&helper->damage_lock);
        INIT_WORK(&helper->resume_work, drm_fb_helper_resume_worker);
+       INIT_WORK(&helper->damage_work, drm_fb_helper_damage_work);
        helper->damage_clip.x1 = helper->damage_clip.y1 = ~0;
        mutex_init(&helper->lock);
        helper->funcs = funcs;
@@ -549,6 +557,7 @@ void drm_fb_helper_fini(struct drm_fb_helper *fb_helper)
                return;
 
        cancel_work_sync(&fb_helper->resume_work);
+       cancel_work_sync(&fb_helper->damage_work);
 
        info = fb_helper->info;
        if (info) {
index 455f6c2..b111dc7 100644 (file)
@@ -116,6 +116,7 @@ struct drm_fb_helper_funcs {
  * @damage_clip: clip rectangle used with deferred_io to accumulate damage to
  *                the screen buffer
  * @damage_lock: spinlock protecting @damage_clip
+ * @damage_work: worker used to flush the framebuffer
  * @resume_work: worker used during resume if the console lock is already taken
  *
  * This is the main structure used by the fbdev helpers. Drivers supporting
@@ -145,6 +146,7 @@ struct drm_fb_helper {
        u32 pseudo_palette[17];
        struct drm_clip_rect damage_clip;
        spinlock_t damage_lock;
+       struct work_struct damage_work;
        struct work_struct resume_work;
 
        /**