MCPcopy Create free account
hub / github.com/F-Stack/f-stack / pmap_enter_quick_locked

Function pmap_enter_quick_locked

freebsd/arm64/arm64/pmap.c:4432–4560  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

4430}
4431
4432static vm_page_t
4433pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
4434 vm_prot_t prot, vm_page_t mpte, struct rwlock **lockp)
4435{
4436 pd_entry_t *pde;
4437 pt_entry_t *l2, *l3, l3_val;
4438 vm_paddr_t pa;
4439 int lvl;
4440
4441 KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
4442 (m->oflags & VPO_UNMANAGED) != 0,
4443 ("pmap_enter_quick_locked: managed mapping within the clean submap"));
4444 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
4445 PMAP_ASSERT_STAGE1(pmap);
4446
4447 CTR2(KTR_PMAP, "pmap_enter_quick_locked: %p %lx", pmap, va);
4448 /*
4449 * In the case that a page table page is not
4450 * resident, we are creating it here.
4451 */
4452 if (va < VM_MAXUSER_ADDRESS) {
4453 vm_pindex_t l2pindex;
4454
4455 /*
4456 * Calculate pagetable page index
4457 */
4458 l2pindex = pmap_l2_pindex(va);
4459 if (mpte && (mpte->pindex == l2pindex)) {
4460 mpte->ref_count++;
4461 } else {
4462 /*
4463 * Get the l2 entry
4464 */
4465 pde = pmap_pde(pmap, va, &lvl);
4466
4467 /*
4468 * If the page table page is mapped, we just increment
4469 * the hold count, and activate it. Otherwise, we
4470 * attempt to allocate a page table page. If this
4471 * attempt fails, we don't retry. Instead, we give up.
4472 */
4473 if (lvl == 1) {
4474 l2 = pmap_l1_to_l2(pde, va);
4475 if ((pmap_load(l2) & ATTR_DESCR_MASK) ==
4476 L2_BLOCK)
4477 return (NULL);
4478 }
4479 if (lvl == 2 && pmap_load(pde) != 0) {
4480 mpte =
4481 PHYS_TO_VM_PAGE(pmap_load(pde) & ~ATTR_MASK);
4482 mpte->ref_count++;
4483 } else {
4484 /*
4485 * Pass NULL instead of the PV list lock
4486 * pointer, because we don't intend to sleep.
4487 */
4488 mpte = _pmap_alloc_l3(pmap, l2pindex, NULL);
4489 if (mpte == NULL)

Callers 2

pmap_enter_objectFunction · 0.70
pmap_enter_quickFunction · 0.70

Calls 8

pmap_l1_to_l2Function · 0.85
PHYS_TO_VM_PAGEFunction · 0.85
_pmap_alloc_l3Function · 0.85
pmap_l2_to_l3Function · 0.85
pmap_pdeFunction · 0.70
pmap_try_insert_pv_entryFunction · 0.70
pmap_abort_ptpFunction · 0.70
pmap_resident_count_incFunction · 0.70

Tested by

no test coverage detected