Two changes to vm_fault_additional_pages():
1. Rewrite the backward scan. Specifically, reverse the order in which pages are allocated so that upon failure it is never necessary to free pages that were just allocated. Moreover, any allocated pages can be put to use. This makes the backward scan behave just like the forward scan. 2. Eliminate an explicit, unsynchronized check for low memory before calling vm_page_alloc(). It serves no useful purpose. It is, in effect, optimizing the uncommon case at the expense of the common case. Approved by: re (hrs) MFC after: 3 weeks
This commit is contained in:
parent
b0f99fbdbc
commit
806453645a
@ -1254,17 +1254,6 @@ vm_fault_additional_pages(m, rbehind, rahead, marray, reqpage)
|
||||
rbehind = cbehind;
|
||||
}
|
||||
|
||||
/*
|
||||
* try to do any readahead that we might have free pages for.
|
||||
*/
|
||||
if ((rahead + rbehind) >
|
||||
((cnt.v_free_count + cnt.v_cache_count) - cnt.v_free_reserved)) {
|
||||
pagedaemon_wakeup();
|
||||
marray[0] = m;
|
||||
*reqpage = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* scan backward for the read behind pages -- in memory
|
||||
*/
|
||||
@ -1280,21 +1269,24 @@ vm_fault_additional_pages(m, rbehind, rahead, marray, reqpage)
|
||||
rtm->pindex >= startpindex)
|
||||
startpindex = rtm->pindex + 1;
|
||||
|
||||
for (i = 0, tpindex = startpindex; tpindex < pindex; i++, tpindex++) {
|
||||
/* tpindex is unsigned; beware of numeric underflow. */
|
||||
for (i = 0, tpindex = pindex - 1; tpindex >= startpindex &&
|
||||
tpindex < pindex; i++, tpindex--) {
|
||||
|
||||
rtm = vm_page_alloc(object, tpindex, VM_ALLOC_NORMAL);
|
||||
if (rtm == NULL) {
|
||||
vm_page_lock_queues();
|
||||
/*
|
||||
* Shift the allocated pages to the
|
||||
* beginning of the array.
|
||||
*/
|
||||
for (j = 0; j < i; j++) {
|
||||
vm_page_free(marray[j]);
|
||||
marray[j] = marray[j + tpindex + 1 -
|
||||
startpindex];
|
||||
}
|
||||
vm_page_unlock_queues();
|
||||
marray[0] = m;
|
||||
*reqpage = 0;
|
||||
return 1;
|
||||
break;
|
||||
}
|
||||
|
||||
marray[i] = rtm;
|
||||
marray[tpindex - startpindex] = rtm;
|
||||
}
|
||||
} else {
|
||||
startpindex = 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user