mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			36 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			36 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 59b457d8a71a3f3591f2c622da9ac5d77d35413f Mon Sep 17 00:00:00 2001
 | 
						|
From: Phil Elwell <phil@raspberrypi.com>
 | 
						|
Date: Wed, 29 Mar 2023 09:49:36 +0100
 | 
						|
Subject: [PATCH] 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 <phil@raspberrypi.com>
 | 
						|
 | 
						|
[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(-)
 | 
						|
 | 
						|
--- 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(str
 | 
						|
 	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) {
 |