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:
parent
8407f69657
commit
92a5994685
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=233191
@ -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
|
||||
);
|
||||
}
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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_ */
|
||||
|
Loading…
Reference in New Issue
Block a user