* kmem_back: * * Allocate physical pages for the specified virtual address range. */
| 513 | * Allocate physical pages for the specified virtual address range. |
| 514 | */ |
| 515 | int |
| 516 | kmem_back(vm_object_t object, vm_offset_t addr, vm_size_t size, int flags) |
| 517 | { |
| 518 | vm_offset_t end, next, start; |
| 519 | int domain, rv; |
| 520 | |
| 521 | KASSERT(object == kernel_object, |
| 522 | ("kmem_back: only supports kernel object.")); |
| 523 | |
| 524 | for (start = addr, end = addr + size; addr < end; addr = next) { |
| 525 | /* |
| 526 | * We must ensure that pages backing a given large virtual page |
| 527 | * all come from the same physical domain. |
| 528 | */ |
| 529 | if (vm_ndomains > 1) { |
| 530 | domain = (addr >> KVA_QUANTUM_SHIFT) % vm_ndomains; |
| 531 | while (VM_DOMAIN_EMPTY(domain)) |
| 532 | domain++; |
| 533 | next = roundup2(addr + 1, KVA_QUANTUM); |
| 534 | if (next > end || next < start) |
| 535 | next = end; |
| 536 | } else { |
| 537 | domain = 0; |
| 538 | next = end; |
| 539 | } |
| 540 | rv = kmem_back_domain(domain, object, addr, next - addr, flags); |
| 541 | if (rv != KERN_SUCCESS) { |
| 542 | kmem_unback(object, start, addr - start); |
| 543 | break; |
| 544 | } |
| 545 | } |
| 546 | return (rv); |
| 547 | } |
| 548 | |
| 549 | /* |
| 550 | * kmem_unback: |
no test coverage detected