hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c
....@@ -375,12 +375,12 @@
375375 copy_size = min_t(u32, copy_size, PAGE_SIZE - src_page_offset);
376376
377377 if (unmap_src) {
378
- kunmap_local(d->src_addr);
378
+ kunmap_atomic(d->src_addr);
379379 d->src_addr = NULL;
380380 }
381381
382382 if (unmap_dst) {
383
- kunmap_local(d->dst_addr);
383
+ kunmap_atomic(d->dst_addr);
384384 d->dst_addr = NULL;
385385 }
386386
....@@ -388,8 +388,12 @@
388388 if (WARN_ON_ONCE(dst_page >= d->dst_num_pages))
389389 return -EINVAL;
390390
391
- d->dst_addr = kmap_local_page_prot(d->dst_pages[dst_page],
392
- d->dst_prot);
391
+ d->dst_addr =
392
+ kmap_atomic_prot(d->dst_pages[dst_page],
393
+ d->dst_prot);
394
+ if (!d->dst_addr)
395
+ return -ENOMEM;
396
+
393397 d->mapped_dst = dst_page;
394398 }
395399
....@@ -397,8 +401,12 @@
397401 if (WARN_ON_ONCE(src_page >= d->src_num_pages))
398402 return -EINVAL;
399403
400
- d->src_addr = kmap_local_page_prot(d->src_pages[src_page],
401
- d->src_prot);
404
+ d->src_addr =
405
+ kmap_atomic_prot(d->src_pages[src_page],
406
+ d->src_prot);
407
+ if (!d->src_addr)
408
+ return -ENOMEM;
409
+
402410 d->mapped_src = src_page;
403411 }
404412 diff->do_cpy(diff, d->dst_addr + dst_page_offset,
....@@ -428,10 +436,8 @@
428436 *
429437 * Performs a CPU blit from one buffer object to another avoiding a full
430438 * bo vmap which may exhaust- or fragment vmalloc space.
431
- *
432
- * On supported architectures (x86), we're using kmap_local_prot() which
433
- * avoids cross-processor TLB- and cache flushes. kmap_local_prot() will
434
- * either map a highmem page with the proper pgprot on HIGHMEM=y systems or
439
+ * On supported architectures (x86), we're using kmap_atomic which avoids
440
+ * cross-processor TLB- and cache flushes and may, on non-HIGHMEM systems
435441 * reference already set-up mappings.
436442 *
437443 * Neither of the buffer objects may be placed in PCI memory
....@@ -494,9 +500,9 @@
494500 }
495501 out:
496502 if (d.src_addr)
497
- kunmap_local(d.src_addr);
503
+ kunmap_atomic(d.src_addr);
498504 if (d.dst_addr)
499
- kunmap_local(d.dst_addr);
505
+ kunmap_atomic(d.dst_addr);
500506
501507 return ret;
502508 }