hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/gpu/drm/i915/i915_gem.c
....@@ -355,15 +355,22 @@
355355 char __user *user_data, int length)
356356 {
357357 void __iomem *vaddr;
358
- bool fail = false;
358
+ unsigned long unwritten;
359359
360360 /* We can use the cpu mem copy function because this is X86. */
361
- vaddr = io_mapping_map_local_wc(mapping, base);
362
- if (copy_to_user(user_data, (void __force *)vaddr + offset, length))
363
- fail = true;
364
- io_mapping_unmap_local(vaddr);
365
-
366
- return fail;
361
+ vaddr = io_mapping_map_atomic_wc(mapping, base);
362
+ unwritten = __copy_to_user_inatomic(user_data,
363
+ (void __force *)vaddr + offset,
364
+ length);
365
+ io_mapping_unmap_atomic(vaddr);
366
+ if (unwritten) {
367
+ vaddr = io_mapping_map_wc(mapping, base, PAGE_SIZE);
368
+ unwritten = copy_to_user(user_data,
369
+ (void __force *)vaddr + offset,
370
+ length);
371
+ io_mapping_unmap(vaddr);
372
+ }
373
+ return unwritten;
367374 }
368375
369376 static int
....@@ -532,14 +539,21 @@
532539 char __user *user_data, int length)
533540 {
534541 void __iomem *vaddr;
535
- bool fail = false;
542
+ unsigned long unwritten;
536543
537544 /* We can use the cpu mem copy function because this is X86. */
538
- vaddr = io_mapping_map_local_wc(mapping, base);
539
- if (copy_from_user((void __force *)vaddr + offset, user_data, length))
540
- fail = true;
541
- io_mapping_unmap_local(vaddr);
542
- return fail;
545
+ vaddr = io_mapping_map_atomic_wc(mapping, base);
546
+ unwritten = __copy_from_user_inatomic_nocache((void __force *)vaddr + offset,
547
+ user_data, length);
548
+ io_mapping_unmap_atomic(vaddr);
549
+ if (unwritten) {
550
+ vaddr = io_mapping_map_wc(mapping, base, PAGE_SIZE);
551
+ unwritten = copy_from_user((void __force *)vaddr + offset,
552
+ user_data, length);
553
+ io_mapping_unmap(vaddr);
554
+ }
555
+
556
+ return unwritten;
543557 }
544558
545559 /**