From 6778948f9de86c3cfaf36725a7c87dcff9ba247f Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 11 Dec 2023 08:20:59 +0000
Subject: [PATCH] kernel_5.10 no rt

---
 kernel/drivers/gpu/drm/i915/i915_gem.c |   40 +++++++++++++++++++++++++++-------------
 1 files changed, 27 insertions(+), 13 deletions(-)

diff --git a/kernel/drivers/gpu/drm/i915/i915_gem.c b/kernel/drivers/gpu/drm/i915/i915_gem.c
index 88944c3..5827669 100644
--- a/kernel/drivers/gpu/drm/i915/i915_gem.c
+++ b/kernel/drivers/gpu/drm/i915/i915_gem.c
@@ -355,15 +355,22 @@
 	      char __user *user_data, int length)
 {
 	void __iomem *vaddr;
-	bool fail = false;
+	unsigned long unwritten;
 
 	/* We can use the cpu mem copy function because this is X86. */
-	vaddr = io_mapping_map_local_wc(mapping, base);
-	if (copy_to_user(user_data, (void __force *)vaddr + offset, length))
-		fail = true;
-	io_mapping_unmap_local(vaddr);
-
-	return fail;
+	vaddr = io_mapping_map_atomic_wc(mapping, base);
+	unwritten = __copy_to_user_inatomic(user_data,
+					    (void __force *)vaddr + offset,
+					    length);
+	io_mapping_unmap_atomic(vaddr);
+	if (unwritten) {
+		vaddr = io_mapping_map_wc(mapping, base, PAGE_SIZE);
+		unwritten = copy_to_user(user_data,
+					 (void __force *)vaddr + offset,
+					 length);
+		io_mapping_unmap(vaddr);
+	}
+	return unwritten;
 }
 
 static int
@@ -532,14 +539,21 @@
 	   char __user *user_data, int length)
 {
 	void __iomem *vaddr;
-	bool fail = false;
+	unsigned long unwritten;
 
 	/* We can use the cpu mem copy function because this is X86. */
-	vaddr = io_mapping_map_local_wc(mapping, base);
-	if (copy_from_user((void __force *)vaddr + offset, user_data, length))
-		fail = true;
-	io_mapping_unmap_local(vaddr);
-	return fail;
+	vaddr = io_mapping_map_atomic_wc(mapping, base);
+	unwritten = __copy_from_user_inatomic_nocache((void __force *)vaddr + offset,
+						      user_data, length);
+	io_mapping_unmap_atomic(vaddr);
+	if (unwritten) {
+		vaddr = io_mapping_map_wc(mapping, base, PAGE_SIZE);
+		unwritten = copy_from_user((void __force *)vaddr + offset,
+					   user_data, length);
+		io_mapping_unmap(vaddr);
+	}
+
+	return unwritten;
 }
 
 /**

--
Gitblit v1.6.2