.. | .. |
---|
375 | 375 | copy_size = min_t(u32, copy_size, PAGE_SIZE - src_page_offset); |
---|
376 | 376 | |
---|
377 | 377 | if (unmap_src) { |
---|
378 | | - kunmap_local(d->src_addr); |
---|
| 378 | + kunmap_atomic(d->src_addr); |
---|
379 | 379 | d->src_addr = NULL; |
---|
380 | 380 | } |
---|
381 | 381 | |
---|
382 | 382 | if (unmap_dst) { |
---|
383 | | - kunmap_local(d->dst_addr); |
---|
| 383 | + kunmap_atomic(d->dst_addr); |
---|
384 | 384 | d->dst_addr = NULL; |
---|
385 | 385 | } |
---|
386 | 386 | |
---|
.. | .. |
---|
388 | 388 | if (WARN_ON_ONCE(dst_page >= d->dst_num_pages)) |
---|
389 | 389 | return -EINVAL; |
---|
390 | 390 | |
---|
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 | + |
---|
393 | 397 | d->mapped_dst = dst_page; |
---|
394 | 398 | } |
---|
395 | 399 | |
---|
.. | .. |
---|
397 | 401 | if (WARN_ON_ONCE(src_page >= d->src_num_pages)) |
---|
398 | 402 | return -EINVAL; |
---|
399 | 403 | |
---|
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 | + |
---|
402 | 410 | d->mapped_src = src_page; |
---|
403 | 411 | } |
---|
404 | 412 | diff->do_cpy(diff, d->dst_addr + dst_page_offset, |
---|
.. | .. |
---|
428 | 436 | * |
---|
429 | 437 | * Performs a CPU blit from one buffer object to another avoiding a full |
---|
430 | 438 | * 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 |
---|
435 | 441 | * reference already set-up mappings. |
---|
436 | 442 | * |
---|
437 | 443 | * Neither of the buffer objects may be placed in PCI memory |
---|
.. | .. |
---|
494 | 500 | } |
---|
495 | 501 | out: |
---|
496 | 502 | if (d.src_addr) |
---|
497 | | - kunmap_local(d.src_addr); |
---|
| 503 | + kunmap_atomic(d.src_addr); |
---|
498 | 504 | if (d.dst_addr) |
---|
499 | | - kunmap_local(d.dst_addr); |
---|
| 505 | + kunmap_atomic(d.dst_addr); |
---|
500 | 506 | |
---|
501 | 507 | return ret; |
---|
502 | 508 | } |
---|