| .. | .. |
|---|
| 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 | } |
|---|