Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/kern_proc.c
Show First 20 Lines • Show All 2,357 Lines • ▼ Show 20 Lines | |||||
void | void | ||||
kern_proc_vmmap_resident(vm_map_t map, vm_map_entry_t entry, | kern_proc_vmmap_resident(vm_map_t map, vm_map_entry_t entry, | ||||
int *resident_count, bool *super) | int *resident_count, bool *super) | ||||
{ | { | ||||
vm_object_t obj, tobj; | vm_object_t obj, tobj; | ||||
vm_page_t m, m_adv; | vm_page_t m, m_adv; | ||||
vm_offset_t addr; | vm_offset_t addr; | ||||
vm_paddr_t locked_pa; | vm_paddr_t pa; | ||||
vm_pindex_t pi, pi_adv, pindex; | vm_pindex_t pi, pi_adv, pindex; | ||||
*super = false; | *super = false; | ||||
*resident_count = 0; | *resident_count = 0; | ||||
if (vmmap_skip_res_cnt) | if (vmmap_skip_res_cnt) | ||||
return; | return; | ||||
locked_pa = 0; | pa = 0; | ||||
obj = entry->object.vm_object; | obj = entry->object.vm_object; | ||||
addr = entry->start; | addr = entry->start; | ||||
m_adv = NULL; | m_adv = NULL; | ||||
pi = OFF_TO_IDX(entry->offset); | pi = OFF_TO_IDX(entry->offset); | ||||
for (; addr < entry->end; addr += IDX_TO_OFF(pi_adv), pi += pi_adv) { | for (; addr < entry->end; addr += IDX_TO_OFF(pi_adv), pi += pi_adv) { | ||||
if (m_adv != NULL) { | if (m_adv != NULL) { | ||||
m = m_adv; | m = m_adv; | ||||
} else { | } else { | ||||
Show All 13 Lines | if (m_adv != NULL) { | ||||
goto next; | goto next; | ||||
pindex += OFF_TO_IDX(tobj-> | pindex += OFF_TO_IDX(tobj-> | ||||
backing_object_offset); | backing_object_offset); | ||||
} | } | ||||
} | } | ||||
m_adv = NULL; | m_adv = NULL; | ||||
if (m->psind != 0 && addr + pagesizes[1] <= entry->end && | if (m->psind != 0 && addr + pagesizes[1] <= entry->end && | ||||
(addr & (pagesizes[1] - 1)) == 0 && | (addr & (pagesizes[1] - 1)) == 0 && | ||||
(pmap_mincore(map->pmap, addr, &locked_pa) & | (pmap_mincore(map->pmap, addr, &pa) & MINCORE_SUPER) != 0) { | ||||
MINCORE_SUPER) != 0) { | |||||
*super = true; | *super = true; | ||||
pi_adv = atop(pagesizes[1]); | pi_adv = atop(pagesizes[1]); | ||||
} else { | } else { | ||||
/* | /* | ||||
* We do not test the found page on validity. | * We do not test the found page on validity. | ||||
* Either the page is busy and being paged in, | * Either the page is busy and being paged in, | ||||
* or it was invalidated. The first case | * or it was invalidated. The first case | ||||
* should be counted as resident, the second | * should be counted as resident, the second | ||||
* is not so clear; we do account both. | * is not so clear; we do account both. | ||||
*/ | */ | ||||
pi_adv = 1; | pi_adv = 1; | ||||
} | } | ||||
*resident_count += pi_adv; | *resident_count += pi_adv; | ||||
next:; | next:; | ||||
} | } | ||||
PA_UNLOCK_COND(locked_pa); | |||||
} | } | ||||
/* | /* | ||||
* Must be called with the process locked and will return unlocked. | * Must be called with the process locked and will return unlocked. | ||||
*/ | */ | ||||
int | int | ||||
kern_proc_vmmap_out(struct proc *p, struct sbuf *sb, ssize_t maxlen, int flags) | kern_proc_vmmap_out(struct proc *p, struct sbuf *sb, ssize_t maxlen, int flags) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 796 Lines • Show Last 20 Lines |