|
Lines 93-121
Link Here
|
| 93 |
CTLFLAG_MPSAFE, NULL, 0, sysctl_vm_loadavg, "S,loadavg", |
89 |
CTLFLAG_MPSAFE, NULL, 0, sysctl_vm_loadavg, "S,loadavg", |
| 94 |
"Machine loadaverage history"); |
90 |
"Machine loadaverage history"); |
| 95 |
|
91 |
|
|
|
92 |
/* |
| 93 |
* This function aims to determine if the object is mapped, |
| 94 |
* specifically, if it is referenced by a vm_map_entry. Because |
| 95 |
* objects occasionally acquire transient references that do not |
| 96 |
* represent a mapping, the method used here is inexact. However, it |
| 97 |
* has very low overhead and is good enough for the advisory |
| 98 |
* vm.vmtotal sysctl. |
| 99 |
*/ |
| 100 |
static bool |
| 101 |
is_object_active(vm_object_t obj) |
| 102 |
{ |
| 103 |
|
| 104 |
return (obj->ref_count > obj->shadow_count); |
| 105 |
} |
| 106 |
|
| 96 |
static int |
107 |
static int |
| 97 |
vmtotal(SYSCTL_HANDLER_ARGS) |
108 |
vmtotal(SYSCTL_HANDLER_ARGS) |
| 98 |
{ |
109 |
{ |
| 99 |
struct proc *p; |
|
|
| 100 |
struct vmtotal total; |
110 |
struct vmtotal total; |
| 101 |
vm_map_entry_t entry; |
|
|
| 102 |
vm_object_t object; |
111 |
vm_object_t object; |
| 103 |
vm_map_t map; |
112 |
struct proc *p; |
| 104 |
int paging; |
|
|
| 105 |
struct thread *td; |
113 |
struct thread *td; |
| 106 |
struct vmspace *vm; |
|
|
| 107 |
|
114 |
|
| 108 |
bzero(&total, sizeof(total)); |
115 |
bzero(&total, sizeof(total)); |
| 109 |
/* |
116 |
|
| 110 |
* Mark all objects as inactive. |
|
|
| 111 |
*/ |
| 112 |
mtx_lock(&vm_object_list_mtx); |
| 113 |
TAILQ_FOREACH(object, &vm_object_list, object_list) { |
| 114 |
VM_OBJECT_WLOCK(object); |
| 115 |
vm_object_clear_flag(object, OBJ_ACTIVE); |
| 116 |
VM_OBJECT_WUNLOCK(object); |
| 117 |
} |
| 118 |
mtx_unlock(&vm_object_list_mtx); |
| 119 |
/* |
117 |
/* |
| 120 |
* Calculate process statistics. |
118 |
* Calculate process statistics. |
| 121 |
*/ |
119 |
*/ |
|
Lines 136-146
Link Here
|
| 136 |
case TDS_INHIBITED: |
134 |
case TDS_INHIBITED: |
| 137 |
if (TD_IS_SWAPPED(td)) |
135 |
if (TD_IS_SWAPPED(td)) |
| 138 |
total.t_sw++; |
136 |
total.t_sw++; |
| 139 |
else if (TD_IS_SLEEPING(td) && |
137 |
else if (TD_IS_SLEEPING(td)) { |
| 140 |
td->td_priority <= PZERO) |
138 |
if (td->td_priority <= PZERO) |
| 141 |
total.t_dw++; |
139 |
total.t_dw++; |
| 142 |
else |
140 |
else |
| 143 |
total.t_sl++; |
141 |
total.t_sl++; |
|
|
142 |
if (td->td_wchan == |
| 143 |
&cnt.v_free_count) |
| 144 |
total.t_pw++; |
| 145 |
} |
| 144 |
break; |
146 |
break; |
| 145 |
|
147 |
|
| 146 |
case TDS_CAN_RUN: |
148 |
case TDS_CAN_RUN: |
|
Lines 158-186
Link Here
|
| 158 |
} |
160 |
} |
| 159 |
} |
161 |
} |
| 160 |
PROC_UNLOCK(p); |
162 |
PROC_UNLOCK(p); |
| 161 |
/* |
|
|
| 162 |
* Note active objects. |
| 163 |
*/ |
| 164 |
paging = 0; |
| 165 |
vm = vmspace_acquire_ref(p); |
| 166 |
if (vm == NULL) |
| 167 |
continue; |
| 168 |
map = &vm->vm_map; |
| 169 |
vm_map_lock_read(map); |
| 170 |
for (entry = map->header.next; |
| 171 |
entry != &map->header; entry = entry->next) { |
| 172 |
if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) || |
| 173 |
(object = entry->object.vm_object) == NULL) |
| 174 |
continue; |
| 175 |
VM_OBJECT_WLOCK(object); |
| 176 |
vm_object_set_flag(object, OBJ_ACTIVE); |
| 177 |
paging |= object->paging_in_progress; |
| 178 |
VM_OBJECT_WUNLOCK(object); |
| 179 |
} |
| 180 |
vm_map_unlock_read(map); |
| 181 |
vmspace_free(vm); |
| 182 |
if (paging) |
| 183 |
total.t_pw++; |
| 184 |
} |
163 |
} |
| 185 |
sx_sunlock(&allproc_lock); |
164 |
sx_sunlock(&allproc_lock); |
| 186 |
/* |
165 |
/* |
|
Lines 206-214
Link Here
|
| 206 |
*/ |
185 |
*/ |
| 207 |
continue; |
186 |
continue; |
| 208 |
} |
187 |
} |
|
|
188 |
if (object->ref_count == 1 && |
| 189 |
(object->flags & OBJ_NOSPLIT) != 0) { |
| 190 |
/* |
| 191 |
* Also skip otherwise unreferenced swap |
| 192 |
* objects backing tmpfs vnodes, and POSIX or |
| 193 |
* SysV shared memory. |
| 194 |
*/ |
| 195 |
continue; |
| 196 |
} |
| 209 |
total.t_vm += object->size; |
197 |
total.t_vm += object->size; |
| 210 |
total.t_rm += object->resident_page_count; |
198 |
total.t_rm += object->resident_page_count; |
| 211 |
if (object->flags & OBJ_ACTIVE) { |
199 |
if (is_object_active(object)) { |
| 212 |
total.t_avm += object->size; |
200 |
total.t_avm += object->size; |
| 213 |
total.t_arm += object->resident_page_count; |
201 |
total.t_arm += object->resident_page_count; |
| 214 |
} |
202 |
} |
|
Lines 216-222
Link Here
|
| 216 |
/* shared object */ |
204 |
/* shared object */ |
| 217 |
total.t_vmshr += object->size; |
205 |
total.t_vmshr += object->size; |
| 218 |
total.t_rmshr += object->resident_page_count; |
206 |
total.t_rmshr += object->resident_page_count; |
| 219 |
if (object->flags & OBJ_ACTIVE) { |
207 |
if (is_object_active(object)) { |
| 220 |
total.t_avmshr += object->size; |
208 |
total.t_avmshr += object->size; |
| 221 |
total.t_armshr += object->resident_page_count; |
209 |
total.t_armshr += object->resident_page_count; |
| 222 |
} |
210 |
} |