Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_object.c
Show First 20 Lines • Show All 2,465 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
VM_OBJECT_ASSERT_UNLOCKED(obj); | VM_OBJECT_ASSERT_UNLOCKED(obj); | ||||
(void)blockcount_sleep(&obj->busy, NULL, wmesg, PVM); | (void)blockcount_sleep(&obj->busy, NULL, wmesg, PVM); | ||||
} | } | ||||
static int | static int | ||||
sysctl_vm_object_list(SYSCTL_HANDLER_ARGS) | vm_object_list_handler(struct sysctl_req *req, bool swap_only) | ||||
{ | { | ||||
struct kinfo_vmobject *kvo; | struct kinfo_vmobject *kvo; | ||||
char *fullpath, *freepath; | char *fullpath, *freepath; | ||||
struct vnode *vp; | struct vnode *vp; | ||||
struct vattr va; | struct vattr va; | ||||
vm_object_t obj; | vm_object_t obj; | ||||
vm_page_t m; | vm_page_t m; | ||||
u_long sp; | u_long sp; | ||||
Show All 21 Lines | vm_object_list_handler(struct sysctl_req *req, bool swap_only) | ||||
/* | /* | ||||
* VM objects are type stable and are never removed from the | * VM objects are type stable and are never removed from the | ||||
* list once added. This allows us to safely read obj->object_list | * list once added. This allows us to safely read obj->object_list | ||||
* after reacquiring the VM object lock. | * after reacquiring the VM object lock. | ||||
*/ | */ | ||||
mtx_lock(&vm_object_list_mtx); | mtx_lock(&vm_object_list_mtx); | ||||
TAILQ_FOREACH(obj, &vm_object_list, object_list) { | TAILQ_FOREACH(obj, &vm_object_list, object_list) { | ||||
if (obj->type == OBJT_DEAD) | if (obj->type == OBJT_DEAD || | ||||
(swap_only && (obj->flags & (OBJ_ANON | OBJ_SWAP)) == 0)) | |||||
continue; | continue; | ||||
VM_OBJECT_RLOCK(obj); | VM_OBJECT_RLOCK(obj); | ||||
if (obj->type == OBJT_DEAD) { | if (obj->type == OBJT_DEAD || | ||||
(swap_only && (obj->flags & (OBJ_ANON | OBJ_SWAP)) == 0)) { | |||||
VM_OBJECT_RUNLOCK(obj); | VM_OBJECT_RUNLOCK(obj); | ||||
continue; | continue; | ||||
} | } | ||||
mtx_unlock(&vm_object_list_mtx); | mtx_unlock(&vm_object_list_mtx); | ||||
kvo->kvo_size = ptoa(obj->size); | kvo->kvo_size = ptoa(obj->size); | ||||
kvo->kvo_resident = obj->resident_page_count; | kvo->kvo_resident = obj->resident_page_count; | ||||
kvo->kvo_ref_count = obj->ref_count; | kvo->kvo_ref_count = obj->ref_count; | ||||
kvo->kvo_shadow_count = obj->shadow_count; | kvo->kvo_shadow_count = obj->shadow_count; | ||||
kvo->kvo_memattr = obj->memattr; | kvo->kvo_memattr = obj->memattr; | ||||
kvo->kvo_active = 0; | kvo->kvo_active = 0; | ||||
kvo->kvo_inactive = 0; | kvo->kvo_inactive = 0; | ||||
if (!swap_only) { | |||||
TAILQ_FOREACH(m, &obj->memq, listq) { | TAILQ_FOREACH(m, &obj->memq, listq) { | ||||
/* | /* | ||||
* A page may belong to the object but be | * A page may belong to the object but be | ||||
* dequeued and set to PQ_NONE while the | * dequeued and set to PQ_NONE while the | ||||
* object lock is not held. This makes the | * object lock is not held. This makes the | ||||
* reads of m->queue below racy, and we do not | * reads of m->queue below racy, and we do not | ||||
* count pages set to PQ_NONE. However, this | * count pages set to PQ_NONE. However, this | ||||
* sysctl is only meant to give an | * sysctl is only meant to give an | ||||
* approximation of the system anyway. | * approximation of the system anyway. | ||||
*/ | */ | ||||
if (m->a.queue == PQ_ACTIVE) | if (m->a.queue == PQ_ACTIVE) | ||||
kvo->kvo_active++; | kvo->kvo_active++; | ||||
else if (m->a.queue == PQ_INACTIVE) | else if (m->a.queue == PQ_INACTIVE) | ||||
kvo->kvo_inactive++; | kvo->kvo_inactive++; | ||||
} | } | ||||
} | |||||
kvo->kvo_vn_fileid = 0; | kvo->kvo_vn_fileid = 0; | ||||
kvo->kvo_vn_fsid = 0; | kvo->kvo_vn_fsid = 0; | ||||
kvo->kvo_vn_fsid_freebsd11 = 0; | kvo->kvo_vn_fsid_freebsd11 = 0; | ||||
freepath = NULL; | freepath = NULL; | ||||
fullpath = ""; | fullpath = ""; | ||||
kvo->kvo_type = vm_object_kvme_type(obj, &vp); | kvo->kvo_type = vm_object_kvme_type(obj, &vp); | ||||
if (vp != NULL) { | if (vp != NULL) { | ||||
if (swap_only) | |||||
vp = NULL; | |||||
else | |||||
vref(vp); | vref(vp); | ||||
} else if ((obj->flags & OBJ_ANON) != 0) { | } else if ((obj->flags & OBJ_ANON) != 0) { | ||||
MPASS(kvo->kvo_type == KVME_TYPE_DEFAULT || | MPASS(kvo->kvo_type == KVME_TYPE_DEFAULT || | ||||
kvo->kvo_type == KVME_TYPE_SWAP); | kvo->kvo_type == KVME_TYPE_SWAP); | ||||
kvo->kvo_me = (uintptr_t)obj; | kvo->kvo_me = (uintptr_t)obj; | ||||
/* tmpfs objs are reported as vnodes */ | /* tmpfs objs are reported as vnodes */ | ||||
kvo->kvo_backing_obj = (uintptr_t)obj->backing_object; | kvo->kvo_backing_obj = (uintptr_t)obj->backing_object; | ||||
sp = swap_pager_swapped_pages(obj); | sp = swap_pager_swapped_pages(obj); | ||||
kvo->kvo_swapped = sp > UINT32_MAX ? UINT32_MAX : sp; | kvo->kvo_swapped = sp > UINT32_MAX ? UINT32_MAX : sp; | ||||
Show All 16 Lines | if (freepath != NULL) | ||||
free(freepath, M_TEMP); | free(freepath, M_TEMP); | ||||
/* Pack record size down */ | /* Pack record size down */ | ||||
kvo->kvo_structsize = offsetof(struct kinfo_vmobject, kvo_path) | kvo->kvo_structsize = offsetof(struct kinfo_vmobject, kvo_path) | ||||
+ strlen(kvo->kvo_path) + 1; | + strlen(kvo->kvo_path) + 1; | ||||
kvo->kvo_structsize = roundup(kvo->kvo_structsize, | kvo->kvo_structsize = roundup(kvo->kvo_structsize, | ||||
sizeof(uint64_t)); | sizeof(uint64_t)); | ||||
error = SYSCTL_OUT(req, kvo, kvo->kvo_structsize); | error = SYSCTL_OUT(req, kvo, kvo->kvo_structsize); | ||||
maybe_yield(); | |||||
mtx_lock(&vm_object_list_mtx); | mtx_lock(&vm_object_list_mtx); | ||||
if (error) | if (error) | ||||
break; | break; | ||||
} | } | ||||
mtx_unlock(&vm_object_list_mtx); | mtx_unlock(&vm_object_list_mtx); | ||||
free(kvo, M_TEMP); | free(kvo, M_TEMP); | ||||
return (error); | return (error); | ||||
} | } | ||||
static int | |||||
sysctl_vm_object_list(SYSCTL_HANDLER_ARGS) | |||||
{ | |||||
return (vm_object_list_handler(req, false)); | |||||
} | |||||
SYSCTL_PROC(_vm, OID_AUTO, objects, CTLTYPE_STRUCT | CTLFLAG_RW | CTLFLAG_SKIP | | SYSCTL_PROC(_vm, OID_AUTO, objects, CTLTYPE_STRUCT | CTLFLAG_RW | CTLFLAG_SKIP | | ||||
CTLFLAG_MPSAFE, NULL, 0, sysctl_vm_object_list, "S,kinfo_vmobject", | CTLFLAG_MPSAFE, NULL, 0, sysctl_vm_object_list, "S,kinfo_vmobject", | ||||
"List of VM objects"); | "List of VM objects"); | ||||
static int | |||||
sysctl_vm_object_list_swap(SYSCTL_HANDLER_ARGS) | |||||
{ | |||||
return (vm_object_list_handler(req, true)); | |||||
} | |||||
SYSCTL_PROC(_vm, OID_AUTO, swap_objects, | |||||
CTLTYPE_STRUCT | CTLFLAG_RW | CTLFLAG_SKIP | CTLFLAG_MPSAFE, NULL, 0, | |||||
sysctl_vm_object_list_swap, "S,kinfo_vmobject", | |||||
"List of swap VM objects"); | |||||
#include "opt_ddb.h" | #include "opt_ddb.h" | ||||
#ifdef DDB | #ifdef DDB | ||||
#include <sys/kernel.h> | #include <sys/kernel.h> | ||||
#include <sys/cons.h> | #include <sys/cons.h> | ||||
#include <ddb/ddb.h> | #include <ddb/ddb.h> | ||||
▲ Show 20 Lines • Show All 224 Lines • Show Last 20 Lines |