summaryrefslogtreecommitdiffstats
path: root/include/video
diff options
context:
space:
mode:
authorMikulas Patocka <mpatocka@redhat.com>2019-04-01 17:46:56 +0200
committerBartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>2019-04-01 17:46:56 +0200
commit6b11f9d8433b471fdd3ebed232b43a4b723be6ff (patch)
tree0ea2723e1a6b691cba78eda2ebe365305c11b59b /include/video
parentbd86b6c5c60711dbd4fa21bdb497a188ecb6cf63 (diff)
downloadlinux-stable-6b11f9d8433b471fdd3ebed232b43a4b723be6ff.tar.gz
linux-stable-6b11f9d8433b471fdd3ebed232b43a4b723be6ff.tar.bz2
linux-stable-6b11f9d8433b471fdd3ebed232b43a4b723be6ff.zip
udlfb: fix sleeping inside spinlock
If a framebuffer device is used as a console, the rendering calls (copyarea, fillrect, imageblit) may be done with the console spinlock held. On udlfb, these function call dlfb_handle_damage that takes a blocking semaphore before acquiring an URB. In order to fix the bug, this patch changes the calls copyarea, fillrect and imageblit to offload USB work to a workqueue. A side effect of this patch is 3x improvement in console scrolling speed because the device doesn't have to be updated after each copyarea call. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Cc: Bernie Thompson <bernie@plugable.com> Cc: Ladislav Michl <ladis@linux-mips.org> Cc: <stable@vger.kernel.org> Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Diffstat (limited to 'include/video')
-rw-r--r--include/video/udlfb.h6
1 files changed, 6 insertions, 0 deletions
diff --git a/include/video/udlfb.h b/include/video/udlfb.h
index 7d09e54ae54e..a3724f1fca1c 100644
--- a/include/video/udlfb.h
+++ b/include/video/udlfb.h
@@ -48,6 +48,12 @@ struct dlfb_data {
int base8;
u32 pseudo_palette[256];
int blank_mode; /*one of FB_BLANK_ */
+ int damage_x;
+ int damage_y;
+ int damage_x2;
+ int damage_y2;
+ spinlock_t damage_lock;
+ struct work_struct damage_work;
struct fb_ops ops;
/* blit-only rendering path metrics, exposed through sysfs */
atomic_t bytes_rendered; /* raw pixel-bytes driver asked to render */