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

Function pmap_enter_quick_locked

freebsd/i386/i386/pmap.c:4105–4195  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

4103}
4104
4105static vm_page_t
4106pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
4107 vm_prot_t prot, vm_page_t mpte)
4108{
4109 pt_entry_t newpte, *pte;
4110
4111 KASSERT(pmap != kernel_pmap || va < kmi.clean_sva ||
4112 va >= kmi.clean_eva || (m->oflags & VPO_UNMANAGED) != 0,
4113 ("pmap_enter_quick_locked: managed mapping within the clean submap"));
4114 rw_assert(&pvh_global_lock, RA_WLOCKED);
4115 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
4116
4117 /*
4118 * In the case that a page table page is not
4119 * resident, we are creating it here.
4120 */
4121 if (pmap != kernel_pmap) {
4122 u_int ptepindex;
4123 pd_entry_t ptepa;
4124
4125 /*
4126 * Calculate pagetable page index
4127 */
4128 ptepindex = va >> PDRSHIFT;
4129 if (mpte && (mpte->pindex == ptepindex)) {
4130 mpte->ref_count++;
4131 } else {
4132 /*
4133 * Get the page directory entry
4134 */
4135 ptepa = pmap->pm_pdir[ptepindex];
4136
4137 /*
4138 * If the page table page is mapped, we just increment
4139 * the hold count, and activate it.
4140 */
4141 if (ptepa) {
4142 if (ptepa & PG_PS)
4143 return (NULL);
4144 mpte = PHYS_TO_VM_PAGE(ptepa & PG_FRAME);
4145 mpte->ref_count++;
4146 } else {
4147 mpte = _pmap_allocpte(pmap, ptepindex,
4148 PMAP_ENTER_NOSLEEP);
4149 if (mpte == NULL)
4150 return (mpte);
4151 }
4152 }
4153 } else {
4154 mpte = NULL;
4155 }
4156
4157 sched_pin();
4158 pte = pmap_pte_quick(pmap, va);
4159 if (*pte) {
4160 if (mpte != NULL)
4161 mpte->ref_count--;
4162 sched_unpin();

Callers 2

Calls 8

PHYS_TO_VM_PAGEFunction · 0.85
sched_pinFunction · 0.85
pmap_pte_quickFunction · 0.85
sched_unpinFunction · 0.85
_pmap_allocpteFunction · 0.70
pmap_try_insert_pv_entryFunction · 0.70
pmap_abort_ptpFunction · 0.70
pmap_cache_bitsFunction · 0.70

Tested by

no test coverage detected