Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 21 Oct 2010 17:29:33 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r214144 - head/sys/vm
Message-ID:  <201010211729.o9LHTXEv098032@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Thu Oct 21 17:29:32 2010
New Revision: 214144
URL: http://svn.freebsd.org/changeset/base/214144

Log:
  - 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().
  
  Reviewed by:	alc
  MFC after:	1 month

Modified:
  head/sys/vm/vm_map.c
  head/sys/vm/vm_map.h

Modified: head/sys/vm/vm_map.c
==============================================================================
--- head/sys/vm/vm_map.c	Thu Oct 21 17:29:18 2010	(r214143)
+++ head/sys/vm/vm_map.c	Thu Oct 21 17:29:32 2010	(r214144)
@@ -339,15 +339,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: head/sys/vm/vm_map.h
==============================================================================
--- head/sys/vm/vm_map.h	Thu Oct 21 17:29:18 2010	(r214143)
+++ head/sys/vm/vm_map.h	Thu Oct 21 17:29:32 2010	(r214144)
@@ -236,7 +236,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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201010211729.o9LHTXEv098032>