svn commit: r305367 - head/sys/vm
Mark Johnston
markj at FreeBSD.org
Sun Sep 4 00:25:51 UTC 2016
Author: markj
Date: Sun Sep 4 00:25:49 2016
New Revision: 305367
URL: https://svnweb.freebsd.org/changeset/base/305367
Log:
Respect the caller's hints when performing swap readahead.
The pager getpages interface allows the caller to bound the number of
readahead and readbehind pages, and vm_fault_hold() makes use of this
feature. These bounds were ignored after r305056, causing the swap pager
to potentially page in more than the specified number of pages.
Reported and reviewed by: alc
X-MFC with: r305056
Modified:
head/sys/vm/swap_pager.c
Modified: head/sys/vm/swap_pager.c
==============================================================================
--- head/sys/vm/swap_pager.c Sat Sep 3 23:57:17 2016 (r305366)
+++ head/sys/vm/swap_pager.c Sun Sep 4 00:25:49 2016 (r305367)
@@ -1086,7 +1086,7 @@ swap_pager_getpages(vm_object_t object,
vm_page_t mpred, msucc, p;
vm_pindex_t pindex;
daddr_t blk;
- int i, j, reqcount, shift;
+ int i, j, maxahead, maxbehind, reqcount, shift;
reqcount = count;
@@ -1094,7 +1094,7 @@ swap_pager_getpages(vm_object_t object,
bp = getpbuf(&nsw_rcount);
VM_OBJECT_WLOCK(object);
- if (!swap_pager_haspage(object, m[0]->pindex, rbehind, rahead)) {
+ if (!swap_pager_haspage(object, m[0]->pindex, &maxbehind, &maxahead)) {
relpbuf(bp, &nsw_rcount);
return (VM_PAGER_FAIL);
}
@@ -1103,15 +1103,16 @@ swap_pager_getpages(vm_object_t object,
* Clip the readahead and readbehind ranges to exclude resident pages.
*/
if (rahead != NULL) {
- KASSERT(reqcount - 1 <= *rahead,
+ KASSERT(reqcount - 1 <= maxahead,
("page count %d extends beyond swap block", reqcount));
- *rahead -= reqcount - 1;
+ *rahead = imin(*rahead, maxahead - (reqcount - 1));
pindex = m[reqcount - 1]->pindex;
msucc = TAILQ_NEXT(m[reqcount - 1], listq);
if (msucc != NULL && msucc->pindex - pindex - 1 < *rahead)
*rahead = msucc->pindex - pindex - 1;
}
if (rbehind != NULL) {
+ *rbehind = imin(*rbehind, maxbehind);
pindex = m[0]->pindex;
mpred = TAILQ_PREV(m[0], pglist, listq);
if (mpred != NULL && pindex - mpred->pindex - 1 < *rbehind)
More information about the svn-src-all
mailing list