FreeBSD Bugzilla – Attachment 173037 Details for
Bug 204764
Filesystem deadlock, process in vodead state
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
patch to apply r302063 on FreeBSD-10
patch-10.3-pr204764.diff (text/plain), 3.80 KB, created by
Robert Schulze
on 2016-07-27 12:45:32 UTC
(
hide
)
Description:
patch to apply r302063 on FreeBSD-10
Filename:
MIME Type:
Creator:
Robert Schulze
Created:
2016-07-27 12:45:32 UTC
Size:
3.80 KB
patch
obsolete
>diff -Naur sys/vm/vm_meter.c sys/vm-neu/vm_meter.c >--- sys/vm/vm_meter.c 2016-07-27 13:32:11.673661000 +0200 >+++ sys/vm-neu/vm_meter.c 2016-07-27 13:31:44.627701000 +0200 >@@ -93,29 +89,31 @@ > CTLFLAG_MPSAFE, NULL, 0, sysctl_vm_loadavg, "S,loadavg", > "Machine loadaverage history"); > >+/* >+ * This function aims to determine if the object is mapped, >+ * specifically, if it is referenced by a vm_map_entry. Because >+ * objects occasionally acquire transient references that do not >+ * represent a mapping, the method used here is inexact. However, it >+ * has very low overhead and is good enough for the advisory >+ * vm.vmtotal sysctl. >+ */ >+static bool >+is_object_active(vm_object_t obj) >+{ >+ >+ return (obj->ref_count > obj->shadow_count); >+} >+ > static int > vmtotal(SYSCTL_HANDLER_ARGS) > { >- struct proc *p; > struct vmtotal total; >- vm_map_entry_t entry; > vm_object_t object; >- vm_map_t map; >- int paging; >+ struct proc *p; > struct thread *td; >- struct vmspace *vm; > > bzero(&total, sizeof(total)); >- /* >- * Mark all objects as inactive. >- */ >- mtx_lock(&vm_object_list_mtx); >- TAILQ_FOREACH(object, &vm_object_list, object_list) { >- VM_OBJECT_WLOCK(object); >- vm_object_clear_flag(object, OBJ_ACTIVE); >- VM_OBJECT_WUNLOCK(object); >- } >- mtx_unlock(&vm_object_list_mtx); >+ > /* > * Calculate process statistics. > */ >@@ -136,11 +134,15 @@ > case TDS_INHIBITED: > if (TD_IS_SWAPPED(td)) > total.t_sw++; >- else if (TD_IS_SLEEPING(td) && >- td->td_priority <= PZERO) >- total.t_dw++; >- else >- total.t_sl++; >+ else if (TD_IS_SLEEPING(td)) { >+ if (td->td_priority <= PZERO) >+ total.t_dw++; >+ else >+ total.t_sl++; >+ if (td->td_wchan == >+ &cnt.v_free_count) >+ total.t_pw++; >+ } > break; > > case TDS_CAN_RUN: >@@ -158,29 +160,6 @@ > } > } > PROC_UNLOCK(p); >- /* >- * Note active objects. >- */ >- paging = 0; >- vm = vmspace_acquire_ref(p); >- if (vm == NULL) >- continue; >- map = &vm->vm_map; >- vm_map_lock_read(map); >- for (entry = map->header.next; >- entry != &map->header; entry = entry->next) { >- if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) || >- (object = entry->object.vm_object) == NULL) >- continue; >- VM_OBJECT_WLOCK(object); >- vm_object_set_flag(object, OBJ_ACTIVE); >- paging |= object->paging_in_progress; >- VM_OBJECT_WUNLOCK(object); >- } >- vm_map_unlock_read(map); >- vmspace_free(vm); >- if (paging) >- total.t_pw++; > } > sx_sunlock(&allproc_lock); > /* >@@ -206,9 +185,18 @@ > */ > continue; > } >+ if (object->ref_count == 1 && >+ (object->flags & OBJ_NOSPLIT) != 0) { >+ /* >+ * Also skip otherwise unreferenced swap >+ * objects backing tmpfs vnodes, and POSIX or >+ * SysV shared memory. >+ */ >+ continue; >+ } > total.t_vm += object->size; > total.t_rm += object->resident_page_count; >- if (object->flags & OBJ_ACTIVE) { >+ if (is_object_active(object)) { > total.t_avm += object->size; > total.t_arm += object->resident_page_count; > } >@@ -216,7 +204,7 @@ > /* shared object */ > total.t_vmshr += object->size; > total.t_rmshr += object->resident_page_count; >- if (object->flags & OBJ_ACTIVE) { >+ if (is_object_active(object)) { > total.t_avmshr += object->size; > total.t_armshr += object->resident_page_count; > } >diff -Naur sys/vm/vm_object.h sys/vm-neu/vm_object.h >--- sys/vm/vm_object.h 2016-07-27 13:32:11.713659000 +0200 >+++ sys/vm-neu/vm_object.h 2016-07-27 13:31:44.627112000 +0200 >@@ -181,7 +181,6 @@ > */ > #define OBJ_FICTITIOUS 0x0001 /* (c) contains fictitious pages */ > #define OBJ_UNMANAGED 0x0002 /* (c) contains unmanaged pages */ >-#define OBJ_ACTIVE 0x0004 /* active objects */ > #define OBJ_DEAD 0x0008 /* dead objects (during rundown) */ > #define OBJ_NOSPLIT 0x0010 /* dont split this object */ > #define OBJ_PIPWNT 0x0040 /* paging in progress wanted */
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 204764
:
163453
|
166244
|
166295
| 173037