Page MenuHomeFreeBSD

D13595.id36935.diff
No OneTemporary

D13595.id36935.diff

Index: sys/fs/procfs/procfs_map.c
===================================================================
--- sys/fs/procfs/procfs_map.c
+++ sys/fs/procfs/procfs_map.c
@@ -84,12 +84,17 @@
vm_map_t map;
vm_map_entry_t entry, tmp_entry;
struct vnode *vp;
- char *fullpath, *freepath;
+ char *fullpath, *freepath, *type;
struct ucred *cred;
- int error;
+ vm_object_t obj, tobj, lobj;
+ int error, privateresident, ref_count, resident, shadow_count, flags;
+ vm_offset_t e_start, e_end;
+ vm_eflags_t e_eflags;
+ vm_prot_t e_prot;
unsigned int last_timestamp;
+ bool super;
#ifdef COMPAT_FREEBSD32
- int wrap32 = 0;
+ bool wrap32;
#endif
PROC_LOCK(p);
@@ -102,10 +107,11 @@
return (EOPNOTSUPP);
#ifdef COMPAT_FREEBSD32
+ wrap32 = false;
if (SV_CURPROC_FLAG(SV_ILP32)) {
if (!(SV_PROC_FLAG(p, SV_ILP32)))
return (EOPNOTSUPP);
- wrap32 = 1;
+ wrap32 = true;
}
#endif
@@ -116,14 +122,6 @@
vm_map_lock_read(map);
for (entry = map->header.next; entry != &map->header;
entry = entry->next) {
- vm_object_t obj, tobj, lobj;
- int ref_count, shadow_count, flags;
- vm_offset_t e_start, e_end, addr;
- int resident, privateresident;
- char *type;
- vm_eflags_t e_eflags;
- vm_prot_t e_prot;
-
if (entry->eflags & MAP_ENTRY_IS_SUB_MAP)
continue;
@@ -132,6 +130,7 @@
e_start = entry->start;
e_end = entry->end;
privateresident = 0;
+ resident = 0;
obj = entry->object.vm_object;
if (obj != NULL) {
VM_OBJECT_RLOCK(obj);
@@ -140,21 +139,18 @@
}
cred = (entry->cred) ? entry->cred : (obj ? obj->cred : NULL);
- resident = 0;
- addr = entry->start;
- while (addr < entry->end) {
- if (pmap_extract(map->pmap, addr))
- resident++;
- addr += PAGE_SIZE;
- }
-
- for (lobj = tobj = obj; tobj; tobj = tobj->backing_object) {
+ for (lobj = tobj = obj; tobj != NULL;
+ tobj = tobj->backing_object) {
if (tobj != obj)
VM_OBJECT_RLOCK(tobj);
- if (lobj != obj)
- VM_OBJECT_RUNLOCK(lobj);
lobj = tobj;
}
+ if (obj != NULL)
+ kern_proc_vmmap_resident(map, entry, &resident, &super);
+ for (tobj = obj; tobj != NULL; tobj = tobj->backing_object) {
+ if (tobj != obj && tobj != lobj)
+ VM_OBJECT_RUNLOCK(tobj);
+ }
last_timestamp = map->timestamp;
vm_map_unlock_read(map);
Index: sys/kern/kern_proc.c
===================================================================
--- sys/kern/kern_proc.c
+++ sys/kern/kern_proc.c
@@ -2280,9 +2280,9 @@
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 @@
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 @@
(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 @@
*/
pi_adv = 1;
}
- kve->kve_resident += pi_adv;
+ *resident_count += pi_adv;
next:;
}
PA_UNLOCK_COND(locked_pa);
@@ -2358,6 +2363,7 @@
vm_offset_t addr;
unsigned int last_timestamp;
int error;
+ bool super;
PROC_LOCK_ASSERT(p, MA_OWNED);
@@ -2390,8 +2396,12 @@
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);
+ if (!vmmap_skip_res_cnt) {
+ 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)
Index: sys/sys/proc.h
===================================================================
--- sys/sys/proc.h
+++ sys/sys/proc.h
@@ -184,6 +184,8 @@
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 @@
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);

File Metadata

Mime Type
text/plain
Expires
Tue, Aug 18, 5:55 PM (3 h, 38 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
36867391
Default Alt Text
D13595.id36935.diff (4 KB)

Event Timeline