svn commit: r237806 - stable/8/sys/vm
John Baldwin
jhb at FreeBSD.org
Fri Jun 29 17:21:47 UTC 2012
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 at .
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_ */
More information about the svn-src-stable
mailing list