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:
parent
7028c31d21
commit
baaa79699a
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user