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:
Alan Cox 2007-07-20 06:55:11 +00:00
parent b0f99fbdbc
commit 806453645a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=171514

View file

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