oops, sorry, I blew that patch. exitingcnt would have to be incremented
unconditionally.
-Matt
Index: kern/kern_exit.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_exit.c,v
retrieving revision 1.187
diff -u -r1.187 kern_exit.c
--- kern/kern_exit.c 10 Dec 2002 02:33:44 -0000 1.187
+++ kern/kern_exit.c 15 Dec 2002 01:42:12 -0000
@@ -288,6 +288,7 @@
* Can't free the entire vmspace as the kernel stack
* may be mapped within that space also.
*/
+ ++vm->vm_exitingcnt;
if (--vm->vm_refcnt == 0) {
if (vm->vm_shm)
shmexit(p);
@@ -297,7 +298,6 @@
vm_page_unlock_queues();
(void) vm_map_remove(&vm->vm_map, vm_map_min(&vm->vm_map),
vm_map_max(&vm->vm_map));
- vm->vm_freer = p;
}
sx_xlock(&proctree_lock);
Index: vm/vm_map.c
===================================================================
RCS file: /home/ncvs/src/sys/vm/vm_map.c,v
retrieving revision 1.273
diff -u -r1.273 vm_map.c
--- vm/vm_map.c 1 Dec 2002 18:57:56 -0000 1.273
+++ vm/vm_map.c 15 Dec 2002 01:40:39 -0000
@@ -258,7 +258,7 @@
vm->vm_map.pmap = vmspace_pmap(vm); /* XXX */
vm->vm_refcnt = 1;
vm->vm_shm = NULL;
- vm->vm_freer = NULL;
+ vm->vm_exitingcount = 0;
return (vm);
}
@@ -304,7 +304,7 @@
if (vm->vm_refcnt == 0)
panic("vmspace_free: attempt to free already freed vmspace");
- if (--vm->vm_refcnt == 0)
+ if (--vm->vm_refcnt == 0 && vm->vm_exitingcount == 0)
vmspace_dofree(vm);
}
@@ -314,9 +314,10 @@
struct vmspace *vm;
GIANT_REQUIRED;
- if (p == p->p_vmspace->vm_freer) {
- vm = p->p_vmspace;
- p->p_vmspace = NULL;
+ vm = p->p_vmspace;
+ p->p_vmspace = NULL;
+ if (--vm->vm_exitingcount == 0) {
+ KASSERT(vm->vm_refcnt == 0, ("vm_refcnt was not 0"));
vmspace_dofree(vm);
}
}
Index: vm/vm_map.h
===================================================================
RCS file: /home/ncvs/src/sys/vm/vm_map.h,v
retrieving revision 1.92
diff -u -r1.92 vm_map.h
--- vm/vm_map.h 22 Sep 2002 04:33:43 -0000 1.92
+++ vm/vm_map.h 15 Dec 2002 01:38:29 -0000
@@ -219,7 +219,7 @@
caddr_t vm_daddr; /* (c) user virtual address of data */
caddr_t vm_maxsaddr; /* user VA at max stack growth */
#define vm_endcopy vm_freer
- struct proc *vm_freer; /* vm freed on whose behalf */
+ int vm_exitingcnt; /* several processes zombied in exit1 */
};
#ifdef _KERNEL
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message