From 1dc23c4753f0d9705f845cc64139b6aa3b476809 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Wed, 29 Mar 2023 09:49:36 +0100 Subject: [PATCH 704/726] fbdev: Don't cancel deferred work if pagelist empty Since [1], the fbdev deferred IO framework is careful to cancel pending updates on close to prevent dirty pages being accessed after they may have been reused. However, this is not necessary in the case that the pagelist is empty, and drivers that don't make use of the pagelist may have wanted updates cancelled for no good reason. Avoid penalising fbdev drivers that don't make use of the pagelist by making the cancelling of deferred IO on close conditional on there being a non-empty pagelist. See: https://github.com/raspberrypi/linux/issues/5398 Signed-off-by: Phil Elwell [1] 3efc61d95259 ("fbdev: Fix invalid page access after closing deferred I/O devices") --- drivers/video/fbdev/core/fb_defio.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/video/fbdev/core/fb_defio.c b/drivers/video/fbdev/core/fb_defio.c index a3cf1f764f29..85da3a21bab2 100644 --- a/drivers/video/fbdev/core/fb_defio.c +++ b/drivers/video/fbdev/core/fb_defio.c @@ -321,7 +321,8 @@ static void fb_deferred_io_lastclose(struct fb_info *info) struct page *page; int i; - cancel_delayed_work_sync(&info->deferred_work); + if (!list_empty(&info->fbdefio->pagereflist)) + cancel_delayed_work_sync(&info->deferred_work); /* clear out the mapping that we setup */ for (i = 0 ; i < info->fix.smem_len; i += PAGE_SIZE) { -- 2.33.1