summaryrefslogtreecommitdiffstats
path: root/sys/vm/swap_pager.c
diff options
context:
space:
mode:
authordg <dg@FreeBSD.org>1995-01-24 10:14:09 +0000
committerdg <dg@FreeBSD.org>1995-01-24 10:14:09 +0000
commita9e08ab1e382c62f084401bff2ad5528a3b71e3e (patch)
treea53b9363f7e1cd0fe0867d24dd5952593915453e /sys/vm/swap_pager.c
parentcba22c2c7d66e22200f82b02a38eb994e4eb64b3 (diff)
downloadFreeBSD-src-a9e08ab1e382c62f084401bff2ad5528a3b71e3e.zip
FreeBSD-src-a9e08ab1e382c62f084401bff2ad5528a3b71e3e.tar.gz
Added ability to detect sequential faults and DTRT. (swap_pager.c)
Added hook for pmap_prefault() and use symbolic constant for new third argument to vm_page_alloc() (vm_fault.c, various) Changed the way that upages and page tables are held. (vm_glue.c) Fixed architectural flaw in allocating pages at interrupt time that was introduced with the merged cache changes. (vm_page.c, various) Adjusted some algorithms to acheive better paging performance and to accomodate the fix for the architectural flaw mentioned above. (vm_pageout.c) Fixed pbuf handling problem, changed policy on handling read-behind page. (vnode_pager.c) Submitted by: John Dyson
Diffstat (limited to 'sys/vm/swap_pager.c')
-rw-r--r--sys/vm/swap_pager.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index 63d49f0..da751f3 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -39,7 +39,7 @@
* from: Utah $Hdr: swap_pager.c 1.4 91/04/30$
*
* @(#)swap_pager.c 8.9 (Berkeley) 3/21/94
- * $Id: swap_pager.c,v 1.22 1995/01/09 16:05:33 davidg Exp $
+ * $Id: swap_pager.c,v 1.23 1995/01/10 07:32:43 davidg Exp $
*/
/*
@@ -894,6 +894,7 @@ swap_pager_input(swp, m, count, reqpage)
vm_offset_t paging_offset;
vm_object_t object;
int reqaddr[count];
+ int sequential;
int first, last;
int failed;
@@ -901,6 +902,7 @@ swap_pager_input(swp, m, count, reqpage)
object = m[reqpage]->object;
paging_offset = object->paging_offset;
+ sequential = (m[reqpage]->offset == (object->last_read + PAGE_SIZE));
/*
* First determine if the page exists in the pager if this is a sync
* read. This quickly handles cases where we are following shadow
@@ -947,7 +949,7 @@ swap_pager_input(swp, m, count, reqpage)
failed = 0;
first = 0;
for (i = reqpage - 1; i >= 0; --i) {
- if (failed || (reqaddr[i] == SWB_EMPTY) ||
+ if (sequential || failed || (reqaddr[i] == SWB_EMPTY) ||
(swb[i]->swb_valid & (1 << off[i])) == 0 ||
(reqaddr[i] != (reqaddr[reqpage] + (i - reqpage) * btodb(PAGE_SIZE))) ||
((reqaddr[i] / dmmax) != reqdskregion)) {
@@ -1105,6 +1107,7 @@ swap_pager_input(swp, m, count, reqpage)
pmap_qremove(kva, count);
if (spc) {
+ m[reqpage]->object->last_read = m[reqpage]->offset;
if (bp->b_flags & B_WANTED)
wakeup((caddr_t) bp);
/*
@@ -1141,9 +1144,11 @@ swap_pager_input(swp, m, count, reqpage)
* results, it is best to deactivate
* the readahead pages.
*/
- if ((i == reqpage - 1) || (i == reqpage + 1))
+/*
+ if (sequential || (i == reqpage - 1) || (i == reqpage + 1))
vm_page_activate(m[i]);
else
+*/
vm_page_deactivate(m[i]);
/*
@@ -1155,6 +1160,9 @@ swap_pager_input(swp, m, count, reqpage)
PAGE_WAKEUP(m[i]);
}
}
+
+ m[reqpage]->object->last_read = m[count-1]->offset;
+
/*
* If we're out of swap space, then attempt to free
* some whenever pages are brought in. We must clear
OpenPOWER on IntegriCloud