svn commit: r217835 - stable/8/sys/vm
John Baldwin
jhb at FreeBSD.org
Tue Jan 25 19:44:42 UTC 2011
Author: jhb
Date: Tue Jan 25 19:44:42 2011
New Revision: 217835
URL: http://svn.freebsd.org/changeset/base/217835
Log:
MFC 214144:
- Make 'vm_refcnt' volatile so that compilers won't be tempted to treat
its value as a loop invariant. Currently this is a no-op because
'atomic_cmpset_int()' clobbers all memory on current architectures.
- Use atomic_fetchadd_int() instead of an atomic_cmpset_int() loop to drop
a reference in vmspace_free().
Modified:
stable/8/sys/vm/vm_map.c
stable/8/sys/vm/vm_map.h
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
Modified: stable/8/sys/vm/vm_map.c
==============================================================================
--- stable/8/sys/vm/vm_map.c Tue Jan 25 19:27:05 2011 (r217834)
+++ stable/8/sys/vm/vm_map.c Tue Jan 25 19:44:42 2011 (r217835)
@@ -344,15 +344,11 @@ vmspace_dofree(struct vmspace *vm)
void
vmspace_free(struct vmspace *vm)
{
- int refcnt;
if (vm->vm_refcnt == 0)
panic("vmspace_free: attempt to free already freed vmspace");
- do
- refcnt = vm->vm_refcnt;
- while (!atomic_cmpset_int(&vm->vm_refcnt, refcnt, refcnt - 1));
- if (refcnt == 1)
+ if (atomic_fetchadd_int(&vm->vm_refcnt, -1) == 1)
vmspace_dofree(vm);
}
Modified: stable/8/sys/vm/vm_map.h
==============================================================================
--- stable/8/sys/vm/vm_map.h Tue Jan 25 19:27:05 2011 (r217834)
+++ stable/8/sys/vm/vm_map.h Tue Jan 25 19:44:42 2011 (r217835)
@@ -238,7 +238,7 @@ struct vmspace {
caddr_t vm_taddr; /* (c) user virtual address of text */
caddr_t vm_daddr; /* (c) user virtual address of data */
caddr_t vm_maxsaddr; /* user VA at max stack growth */
- int vm_refcnt; /* number of references */
+ volatile int vm_refcnt; /* number of references */
/*
* Keep the PMAP last, so that CPU-specific variations of that
* structure on a single architecture don't result in offset
More information about the svn-src-all
mailing list