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