svn commit: r233191 - head/sys/vm
John Baldwin
jhb at FreeBSD.org
Mon Mar 19 18:47:35 UTC 2012
Author: jhb
Date: Mon Mar 19 18:47:34 2012
New Revision: 233191
URL: http://svn.freebsd.org/changeset/base/233191
Log:
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:
head/sys/vm/vm_map.c
head/sys/vm/vm_object.c
head/sys/vm/vm_object.h
Modified: head/sys/vm/vm_map.c
==============================================================================
--- head/sys/vm/vm_map.c Mon Mar 19 18:43:44 2012 (r233190)
+++ head/sys/vm/vm_map.c Mon Mar 19 18:47:34 2012 (r233191)
@@ -2100,8 +2100,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
@@ -2119,30 +2118,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: head/sys/vm/vm_object.c
==============================================================================
--- head/sys/vm/vm_object.c Mon Mar 19 18:43:44 2012 (r233190)
+++ head/sys/vm/vm_object.c Mon Mar 19 18:47:34 2012 (r233191)
@@ -1065,16 +1065,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: head/sys/vm/vm_object.h
==============================================================================
--- head/sys/vm/vm_object.h Mon Mar 19 18:43:44 2012 (r233190)
+++ head/sys/vm/vm_object.h Mon Mar 19 18:47:34 2012 (r233191)
@@ -225,6 +225,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 object, vm_ooffset_t start,
@@ -240,7 +241,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-head
mailing list