summaryrefslogtreecommitdiffstats
path: root/drivers/video
diff options
context:
space:
mode:
authorThomas Zimmermann <tzimmermann@suse.de>2022-11-15 12:58:18 +0100
committerThomas Zimmermann <tzimmermann@suse.de>2022-11-16 13:22:24 +0100
commit7f5cc4a3e5e4c5a38e5748defc952e45278f7a70 (patch)
treeeaf671f7b9458b9410caed437e93115b1bd0003a /drivers/video
parent5fc586a058babc71c82a038477581b7bfe1c6e2a (diff)
downloadlinux-stable-7f5cc4a3e5e4c5a38e5748defc952e45278f7a70.tar.gz
linux-stable-7f5cc4a3e5e4c5a38e5748defc952e45278f7a70.tar.bz2
linux-stable-7f5cc4a3e5e4c5a38e5748defc952e45278f7a70.zip
drm/fb-helper: Schedule deferred-I/O worker after writing to framebuffer
Schedule the deferred-I/O worker instead of the damage worker after writing to the fbdev framebuffer. The deferred-I/O worker then performs the dirty-fb update. The fbdev emulation will initialize deferred I/O for all drivers that require damage updates. It is therefore a valid assumption that the deferred-I/O worker is present. It would be possible to perform the damage handling directly from within the write operation. But doing this could increase the overhead of the write or interfere with a concurrently scheduled deferred-I/O worker. Instead, scheduling the deferred-I/O worker with its regular delay of 50 ms removes load off the write operation and allows the deferred-I/O worker to handle multiple write operations that arrived during the delay time window. v3: * remove unused variable (lkp) v2: * keep drm_fb_helper_damage() (Daniel) * use fb_deferred_io_schedule_flush() (Daniel) * clarify comments (Daniel) Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: https://patchwork.freedesktop.org/patch/msgid/20221115115819.23088-6-tzimmermann@suse.de
Diffstat (limited to 'drivers/video')
-rw-r--r--drivers/video/fbdev/core/fb_defio.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/video/fbdev/core/fb_defio.c b/drivers/video/fbdev/core/fb_defio.c
index c730253ab85c..dec678f72a42 100644
--- a/drivers/video/fbdev/core/fb_defio.c
+++ b/drivers/video/fbdev/core/fb_defio.c
@@ -332,3 +332,19 @@ void fb_deferred_io_cleanup(struct fb_info *info)
mutex_destroy(&fbdefio->lock);
}
EXPORT_SYMBOL_GPL(fb_deferred_io_cleanup);
+
+void fb_deferred_io_schedule_flush(struct fb_info *info)
+{
+ struct fb_deferred_io *fbdefio = info->fbdefio;
+
+ if (WARN_ON_ONCE(!fbdefio))
+ return; /* bug in driver logic */
+
+ /*
+ * There's no requirement from callers to schedule the
+ * flush immediately. Rather schedule the worker with a
+ * delay and let a few more writes pile up.
+ */
+ schedule_delayed_work(&info->deferred_work, fbdefio->delay);
+}
+EXPORT_SYMBOL_GPL(fb_deferred_io_schedule_flush);