Make kern_proc_vmmap_resident() externally accesible, and move the

vmmap_skip_res_cnt control check inside it.

Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D13595
This commit is contained in:
Konstantin Belousov 2017-12-28 13:16:32 +00:00
parent 7028c31d21
commit baaa79699a
2 changed files with 25 additions and 6 deletions

View File

@ -2280,9 +2280,9 @@ sysctl_kern_proc_ovmmap(SYSCTL_HANDLER_ARGS)
CTASSERT(sizeof(struct kinfo_vmentry) == KINFO_VMENTRY_SIZE);
#endif
static void
void
kern_proc_vmmap_resident(vm_map_t map, vm_map_entry_t entry,
struct kinfo_vmentry *kve)
int *resident_count, bool *super)
{
vm_object_t obj, tobj;
vm_page_t m, m_adv;
@ -2290,6 +2290,11 @@ kern_proc_vmmap_resident(vm_map_t map, vm_map_entry_t entry,
vm_paddr_t locked_pa;
vm_pindex_t pi, pi_adv, pindex;
*super = false;
*resident_count = 0;
if (vmmap_skip_res_cnt)
return;
locked_pa = 0;
obj = entry->object.vm_object;
addr = entry->start;
@ -2322,7 +2327,7 @@ kern_proc_vmmap_resident(vm_map_t map, vm_map_entry_t entry,
(addr & (pagesizes[1] - 1)) == 0 &&
(pmap_mincore(map->pmap, addr, &locked_pa) &
MINCORE_SUPER) != 0) {
kve->kve_flags |= KVME_FLAG_SUPER;
*super = true;
pi_adv = atop(pagesizes[1]);
} else {
/*
@ -2334,7 +2339,7 @@ kern_proc_vmmap_resident(vm_map_t map, vm_map_entry_t entry,
*/
pi_adv = 1;
}
kve->kve_resident += pi_adv;
*resident_count += pi_adv;
next:;
}
PA_UNLOCK_COND(locked_pa);
@ -2358,6 +2363,7 @@ kern_proc_vmmap_out(struct proc *p, struct sbuf *sb, ssize_t maxlen, int flags)
vm_offset_t addr;
unsigned int last_timestamp;
int error;
bool super;
PROC_LOCK_ASSERT(p, MA_OWNED);
@ -2390,8 +2396,10 @@ kern_proc_vmmap_out(struct proc *p, struct sbuf *sb, ssize_t maxlen, int flags)
if (obj->backing_object == NULL)
kve->kve_private_resident =
obj->resident_page_count;
if (!vmmap_skip_res_cnt)
kern_proc_vmmap_resident(map, entry, kve);
kern_proc_vmmap_resident(map, entry,
&kve->kve_resident, &super);
if (super)
kve->kve_flags |= KVME_FLAG_SUPER;
for (tobj = obj; tobj != NULL;
tobj = tobj->backing_object) {
if (tobj != obj && tobj != lobj)
@ -3112,6 +3120,7 @@ resume_all_proc(void)
cp = curproc;
sx_xlock(&allproc_lock);
again:
LIST_REMOVE(cp, p_list);
LIST_INSERT_HEAD(&allproc, cp, p_list);
for (;;) {
@ -3132,6 +3141,12 @@ resume_all_proc(void)
PROC_UNLOCK(p);
}
}
/* Did the loop above missed any stopped process ? */
LIST_FOREACH(p, &allproc, p_list) {
/* No need for proc lock. */
if ((p->p_flag & P_TOTAL_STOP) != 0)
goto again;
}
sx_xunlock(&allproc_lock);
}

View File

@ -184,6 +184,8 @@ struct td_sched;
struct thread;
struct trapframe;
struct turnstile;
struct vm_map;
struct vm_map_entry;
/*
* XXX: Does this belong in resource.h or resourcevar.h instead?
@ -1004,6 +1006,8 @@ void fork_exit(void (*)(void *, struct trapframe *), void *,
struct trapframe *);
void fork_return(struct thread *, struct trapframe *);
int inferior(struct proc *p);
void kern_proc_vmmap_resident(struct vm_map *map, struct vm_map_entry *entry,
int *resident_count, bool *super);
void kern_yield(int);
void kick_proc0(void);
void killjobc(void);