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@.
This commit is contained in:
John Baldwin 2012-03-19 18:47:34 +00:00
parent 8407f69657
commit 92a5994685
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=233191
3 changed files with 14 additions and 16 deletions

View File

@ -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
);
}

View File

@ -1065,16 +1065,16 @@ vm_object_sync(vm_object_t object, vm_ooffset_t offset, vm_size_t size,
* 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
*/

View File

@ -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_ooffset_t *, vm_size_t);
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_ */