Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 Jun 2012 17:21:47 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r237806 - stable/8/sys/vm
Message-ID:  <201206291721.q5THLlG6058974@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Fri Jun 29 17:21:46 2012
New Revision: 237806
URL: http://svn.freebsd.org/changeset/base/237806

Log:
  MFC 233191:
  Fix madvise(MADV_WILLNEED) to properly handle individual mappings larger
  than 4GB.  Specifically, the inlined version of 'ptoa' of the the 'int'
  count of pages overflowed on 64-bit platforms.  While here, change
  vm_object_madvise() to accept two vm_pindex_t parameters (start and end)
  rather than a (start, count) tuple to match other VM APIs as suggested
  by alc@.

Modified:
  stable/8/sys/vm/vm_map.c
  stable/8/sys/vm/vm_object.c
  stable/8/sys/vm/vm_object.h
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/boot/   (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)
  stable/8/sys/dev/e1000/   (props changed)

Modified: stable/8/sys/vm/vm_map.c
==============================================================================
--- stable/8/sys/vm/vm_map.c	Fri Jun 29 17:21:19 2012	(r237805)
+++ stable/8/sys/vm/vm_map.c	Fri Jun 29 17:21:46 2012	(r237806)
@@ -2085,8 +2085,7 @@ vm_map_madvise(
 		}
 		vm_map_unlock(map);
 	} else {
-		vm_pindex_t pindex;
-		int count;
+		vm_pindex_t pstart, pend;
 
 		/*
 		 * madvise behaviors that are implemented in the underlying
@@ -2104,30 +2103,29 @@ vm_map_madvise(
 			if (current->eflags & MAP_ENTRY_IS_SUB_MAP)
 				continue;
 
-			pindex = OFF_TO_IDX(current->offset);
-			count = atop(current->end - current->start);
+			pstart = OFF_TO_IDX(current->offset);
+			pend = pstart + atop(current->end - current->start);
 			useStart = current->start;
 
 			if (current->start < start) {
-				pindex += atop(start - current->start);
-				count -= atop(start - current->start);
+				pstart += atop(start - current->start);
 				useStart = start;
 			}
 			if (current->end > end)
-				count -= atop(current->end - end);
+				pend -= atop(current->end - end);
 
-			if (count <= 0)
+			if (pstart >= pend)
 				continue;
 
-			vm_object_madvise(current->object.vm_object,
-					  pindex, count, behav);
+			vm_object_madvise(current->object.vm_object, pstart,
+			    pend, behav);
 			if (behav == MADV_WILLNEED) {
 				vm_map_pmap_enter(map,
 				    useStart,
 				    current->protection,
 				    current->object.vm_object,
-				    pindex,
-				    (count << PAGE_SHIFT),
+				    pstart,
+				    ptoa(pend - pstart),
 				    MAP_PREFAULT_MADVISE
 				);
 			}

Modified: stable/8/sys/vm/vm_object.c
==============================================================================
--- stable/8/sys/vm/vm_object.c	Fri Jun 29 17:21:19 2012	(r237805)
+++ stable/8/sys/vm/vm_object.c	Fri Jun 29 17:21:46 2012	(r237806)
@@ -1056,16 +1056,16 @@ vm_object_sync(vm_object_t object, vm_oo
  *	    without I/O.
  */
 void
-vm_object_madvise(vm_object_t object, vm_pindex_t pindex, int count, int advise)
+vm_object_madvise(vm_object_t object, vm_pindex_t pindex, vm_pindex_t end,
+    int advise)
 {
-	vm_pindex_t end, tpindex;
+	vm_pindex_t tpindex;
 	vm_object_t backing_object, tobject;
 	vm_page_t m;
 
 	if (object == NULL)
 		return;
 	VM_OBJECT_LOCK(object);
-	end = pindex + count;
 	/*
 	 * Locate and adjust resident pages
 	 */

Modified: stable/8/sys/vm/vm_object.h
==============================================================================
--- stable/8/sys/vm/vm_object.h	Fri Jun 29 17:21:19 2012	(r237805)
+++ stable/8/sys/vm/vm_object.h	Fri Jun 29 17:21:46 2012	(r237806)
@@ -218,6 +218,7 @@ void vm_object_destroy (vm_object_t);
 void vm_object_terminate (vm_object_t);
 void vm_object_set_writeable_dirty (vm_object_t);
 void vm_object_init (void);
+void vm_object_madvise(vm_object_t, vm_pindex_t, vm_pindex_t, int);
 void vm_object_page_cache(vm_object_t object, vm_pindex_t start,
     vm_pindex_t end);
 boolean_t vm_object_page_clean(vm_object_t, vm_pindex_t, vm_pindex_t, boolean_t);
@@ -230,7 +231,6 @@ void vm_object_shadow (vm_object_t *, vm
 void vm_object_split(vm_map_entry_t);
 boolean_t vm_object_sync(vm_object_t, vm_ooffset_t, vm_size_t, boolean_t,
     boolean_t);
-void vm_object_madvise (vm_object_t, vm_pindex_t, int, int);
 #endif				/* _KERNEL */
 
 #endif				/* _VM_OBJECT_ */



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