* This routine is called if the desired page table page does not exist. * * If page table page allocation fails, this routine may sleep before * returning NULL. It sleeps only if a lock pointer was given. Sleep * occurs right before returning to the caller. This way, we never * drop pmap lock to sleep while a page table page has ref_count == 0, * which prevents the page from being freed un
| 4524 | * which prevents the page from being freed under us. |
| 4525 | */ |
| 4526 | static vm_page_t |
| 4527 | pmap_allocpte_alloc(pmap_t pmap, vm_pindex_t ptepindex, struct rwlock **lockp, |
| 4528 | vm_offset_t va) |
| 4529 | { |
| 4530 | vm_page_t m; |
| 4531 | |
| 4532 | m = pmap_allocpte_nosleep(pmap, ptepindex, lockp, va); |
| 4533 | if (m == NULL && lockp != NULL) { |
| 4534 | RELEASE_PV_LIST_LOCK(lockp); |
| 4535 | PMAP_UNLOCK(pmap); |
| 4536 | PMAP_ASSERT_NOT_IN_DI(); |
| 4537 | vm_wait(NULL); |
| 4538 | PMAP_LOCK(pmap); |
| 4539 | } |
| 4540 | return (m); |
| 4541 | } |
| 4542 | |
| 4543 | static pd_entry_t * |
| 4544 | pmap_alloc_pde(pmap_t pmap, vm_offset_t va, vm_page_t *pdpgp, |
no test coverage detected