summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordg <dg@FreeBSD.org>1995-02-03 06:46:28 +0000
committerdg <dg@FreeBSD.org>1995-02-03 06:46:28 +0000
commit8bb9dc4a89bd5956706b5498bcf5eb47c44489e5 (patch)
treeaa9412f4cc1636272def26f88ab994f0ed3477d5
parenta029b8cf3812fd5a671ccd0f2d2d60a0d19cda12 (diff)
downloadFreeBSD-src-8bb9dc4a89bd5956706b5498bcf5eb47c44489e5.zip
FreeBSD-src-8bb9dc4a89bd5956706b5498bcf5eb47c44489e5.tar.gz
Fixed bmap run-length brokeness.
Use bmap run-length extension when doing clustered paging. Submitted by: John Dyson
-rw-r--r--sys/fs/fifofs/fifo_vnops.c4
-rw-r--r--sys/fs/procfs/procfs_vnops.c4
-rw-r--r--sys/fs/specfs/spec_vnops.c4
-rw-r--r--sys/miscfs/fifofs/fifo_vnops.c4
-rw-r--r--sys/miscfs/procfs/procfs_vnops.c4
-rw-r--r--sys/miscfs/specfs/spec_vnops.c4
-rw-r--r--sys/nfs/nfs_vnops.c4
-rw-r--r--sys/nfsclient/nfs_vnops.c4
-rw-r--r--sys/ufs/mfs/mfs_vnops.c4
-rw-r--r--sys/vm/vnode_pager.c115
10 files changed, 80 insertions, 71 deletions
diff --git a/sys/fs/fifofs/fifo_vnops.c b/sys/fs/fifofs/fifo_vnops.c
index bd250de..78f6201 100644
--- a/sys/fs/fifofs/fifo_vnops.c
+++ b/sys/fs/fifofs/fifo_vnops.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)fifo_vnops.c 8.2 (Berkeley) 1/4/94
- * $Id: fifo_vnops.c,v 1.5 1994/09/22 19:38:07 wollman Exp $
+ * $Id: fifo_vnops.c,v 1.6 1994/10/02 17:48:00 phk Exp $
*/
#include <sys/param.h>
@@ -356,6 +356,8 @@ fifo_bmap(ap)
*ap->a_vpp = ap->a_vp;
if (ap->a_bnp != NULL)
*ap->a_bnp = ap->a_bn;
+ if (ap->a_runp != NULL)
+ *ap->a_runp = 0;
return (0);
}
diff --git a/sys/fs/procfs/procfs_vnops.c b/sys/fs/procfs/procfs_vnops.c
index 6edfe8f..538f9b0 100644
--- a/sys/fs/procfs/procfs_vnops.c
+++ b/sys/fs/procfs/procfs_vnops.c
@@ -36,7 +36,7 @@
*
* @(#)procfs_vnops.c 8.6 (Berkeley) 2/7/94
*
- * $Id: procfs_vnops.c,v 1.6 1994/09/24 17:01:05 davidg Exp $
+ * $Id: procfs_vnops.c,v 1.7 1994/10/10 07:55:40 phk Exp $
*/
/*
@@ -187,6 +187,8 @@ procfs_bmap(ap)
*ap->a_vpp = ap->a_vp;
if (ap->a_bnp != NULL)
*ap->a_bnp = ap->a_bn;
+ if (ap->a_runp != NULL)
+ *ap->a_runp = 0;
return (0);
}
diff --git a/sys/fs/specfs/spec_vnops.c b/sys/fs/specfs/spec_vnops.c
index fba9392..91b0c64 100644
--- a/sys/fs/specfs/spec_vnops.c
+++ b/sys/fs/specfs/spec_vnops.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)spec_vnops.c 8.6 (Berkeley) 4/9/94
- * $Id: spec_vnops.c,v 1.8 1994/10/28 12:41:59 jkh Exp $
+ * $Id: spec_vnops.c,v 1.9 1994/11/14 13:22:52 bde Exp $
*/
#include <sys/param.h>
@@ -512,6 +512,8 @@ spec_bmap(ap)
*ap->a_vpp = ap->a_vp;
if (ap->a_bnp != NULL)
*ap->a_bnp = ap->a_bn;
+ if (ap->a_runp != NULL)
+ *ap->a_runp = 0;
return (0);
}
diff --git a/sys/miscfs/fifofs/fifo_vnops.c b/sys/miscfs/fifofs/fifo_vnops.c
index bd250de..78f6201 100644
--- a/sys/miscfs/fifofs/fifo_vnops.c
+++ b/sys/miscfs/fifofs/fifo_vnops.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)fifo_vnops.c 8.2 (Berkeley) 1/4/94
- * $Id: fifo_vnops.c,v 1.5 1994/09/22 19:38:07 wollman Exp $
+ * $Id: fifo_vnops.c,v 1.6 1994/10/02 17:48:00 phk Exp $
*/
#include <sys/param.h>
@@ -356,6 +356,8 @@ fifo_bmap(ap)
*ap->a_vpp = ap->a_vp;
if (ap->a_bnp != NULL)
*ap->a_bnp = ap->a_bn;
+ if (ap->a_runp != NULL)
+ *ap->a_runp = 0;
return (0);
}
diff --git a/sys/miscfs/procfs/procfs_vnops.c b/sys/miscfs/procfs/procfs_vnops.c
index 6edfe8f..538f9b0 100644
--- a/sys/miscfs/procfs/procfs_vnops.c
+++ b/sys/miscfs/procfs/procfs_vnops.c
@@ -36,7 +36,7 @@
*
* @(#)procfs_vnops.c 8.6 (Berkeley) 2/7/94
*
- * $Id: procfs_vnops.c,v 1.6 1994/09/24 17:01:05 davidg Exp $
+ * $Id: procfs_vnops.c,v 1.7 1994/10/10 07:55:40 phk Exp $
*/
/*
@@ -187,6 +187,8 @@ procfs_bmap(ap)
*ap->a_vpp = ap->a_vp;
if (ap->a_bnp != NULL)
*ap->a_bnp = ap->a_bn;
+ if (ap->a_runp != NULL)
+ *ap->a_runp = 0;
return (0);
}
diff --git a/sys/miscfs/specfs/spec_vnops.c b/sys/miscfs/specfs/spec_vnops.c
index fba9392..91b0c64 100644
--- a/sys/miscfs/specfs/spec_vnops.c
+++ b/sys/miscfs/specfs/spec_vnops.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)spec_vnops.c 8.6 (Berkeley) 4/9/94
- * $Id: spec_vnops.c,v 1.8 1994/10/28 12:41:59 jkh Exp $
+ * $Id: spec_vnops.c,v 1.9 1994/11/14 13:22:52 bde Exp $
*/
#include <sys/param.h>
@@ -512,6 +512,8 @@ spec_bmap(ap)
*ap->a_vpp = ap->a_vp;
if (ap->a_bnp != NULL)
*ap->a_bnp = ap->a_bn;
+ if (ap->a_runp != NULL)
+ *ap->a_runp = 0;
return (0);
}
diff --git a/sys/nfs/nfs_vnops.c b/sys/nfs/nfs_vnops.c
index d189a18..2986b51 100644
--- a/sys/nfs/nfs_vnops.c
+++ b/sys/nfs/nfs_vnops.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs_vnops.c 8.5 (Berkeley) 2/13/94
- * $Id: nfs_vnops.c,v 1.10 1994/10/17 17:47:41 phk Exp $
+ * $Id: nfs_vnops.c,v 1.11 1995/01/09 16:05:09 davidg Exp $
*/
/*
@@ -2068,6 +2068,8 @@ nfs_bmap(ap)
*ap->a_vpp = vp;
if (ap->a_bnp != NULL)
*ap->a_bnp = ap->a_bn * btodb(vp->v_mount->mnt_stat.f_iosize);
+ if (ap->a_runp != NULL)
+ *ap->a_runp = 0;
return (0);
}
diff --git a/sys/nfsclient/nfs_vnops.c b/sys/nfsclient/nfs_vnops.c
index d189a18..2986b51 100644
--- a/sys/nfsclient/nfs_vnops.c
+++ b/sys/nfsclient/nfs_vnops.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs_vnops.c 8.5 (Berkeley) 2/13/94
- * $Id: nfs_vnops.c,v 1.10 1994/10/17 17:47:41 phk Exp $
+ * $Id: nfs_vnops.c,v 1.11 1995/01/09 16:05:09 davidg Exp $
*/
/*
@@ -2068,6 +2068,8 @@ nfs_bmap(ap)
*ap->a_vpp = vp;
if (ap->a_bnp != NULL)
*ap->a_bnp = ap->a_bn * btodb(vp->v_mount->mnt_stat.f_iosize);
+ if (ap->a_runp != NULL)
+ *ap->a_runp = 0;
return (0);
}
diff --git a/sys/ufs/mfs/mfs_vnops.c b/sys/ufs/mfs/mfs_vnops.c
index ba882d9..2908aff 100644
--- a/sys/ufs/mfs/mfs_vnops.c
+++ b/sys/ufs/mfs/mfs_vnops.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)mfs_vnops.c 8.3 (Berkeley) 9/21/93
- * $Id: mfs_vnops.c,v 1.6 1994/09/25 22:31:08 davidg Exp $
+ * $Id: mfs_vnops.c,v 1.7 1994/10/09 07:35:12 davidg Exp $
*/
#include <sys/param.h>
@@ -230,6 +230,8 @@ mfs_bmap(ap)
*ap->a_vpp = ap->a_vp;
if (ap->a_bnp != NULL)
*ap->a_bnp = ap->a_bn;
+ if (ap->a_runp != NULL)
+ *ap->a_runp = 0;
return (0);
}
diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c
index 6df0f79..f5b4abc 100644
--- a/sys/vm/vnode_pager.c
+++ b/sys/vm/vnode_pager.c
@@ -37,7 +37,7 @@
* SUCH DAMAGE.
*
* from: @(#)vnode_pager.c 7.5 (Berkeley) 4/20/91
- * $Id: vnode_pager.c,v 1.20 1995/01/11 20:00:10 davidg Exp $
+ * $Id: vnode_pager.c,v 1.21 1995/01/24 10:14:09 davidg Exp $
*/
/*
@@ -491,9 +491,10 @@ vnode_pager_freepage(m)
* file address
*/
vm_offset_t
-vnode_pager_addr(vp, address)
+vnode_pager_addr(vp, address, run)
struct vnode *vp;
vm_offset_t address;
+ int *run;
{
int rtaddress;
int bsize;
@@ -509,12 +510,18 @@ vnode_pager_addr(vp, address)
vblock = address / bsize;
voffset = address % bsize;
- err = VOP_BMAP(vp, vblock, &rtvp, &block, 0);
+ err = VOP_BMAP(vp, vblock, &rtvp, &block, run);
- if (err)
+ if (err || (block == -1))
rtaddress = -1;
- else
+ else {
rtaddress = block * DEV_BSIZE + voffset;
+ if( run) {
+ *run += 1;
+ *run *= bsize/PAGE_SIZE;
+ *run -= voffset/PAGE_SIZE;
+ }
+ }
return rtaddress;
}
@@ -596,7 +603,7 @@ vnode_pager_input_smlfs(vnp, m)
if ((vm_page_bits(m->offset + i * bsize, bsize) & m->valid))
continue;
- fileaddr = vnode_pager_addr(vp, m->offset + i * bsize);
+ fileaddr = vnode_pager_addr(vp, m->offset + i * bsize, (int *)0);
if (fileaddr != -1) {
bp = getpbuf();
@@ -727,8 +734,10 @@ vnode_pager_input(vnp, m, count, reqpage)
int bsize;
int first, last;
- int reqaddr, firstaddr;
+ int firstaddr;
int block, offset;
+ int runpg;
+ int runend;
struct buf *bp, *bpa;
int counta;
@@ -797,55 +806,45 @@ vnode_pager_input(vnp, m, count, reqpage)
* here on direct device I/O
*/
- reqaddr = vnode_pager_addr(vp, foff);
- if (reqaddr == -1 && foff < vnp->vnp_size) {
- printf("reqaddr: %d, foff: %d, vnp_size: %d\n",
- reqaddr, foff, vnp->vnp_size);
- Debugger("");
- }
- s = splbio();
+ firstaddr = -1;
/*
- * Make sure that our I/O request is contiguous. Scan backward and
- * stop for the first discontiguous entry or stop for a page being in
- * buffer cache.
+ * calculate the run that includes the required page
*/
- failflag = 0;
- first = reqpage;
- for (i = reqpage - 1; i >= 0; --i) {
- if (failflag ||
- (vnode_pager_addr(vp, m[i]->offset))
- != reqaddr + (i - reqpage) * PAGE_SIZE) {
+ for(first = 0, i = 0; i < count; i = runend) {
+ firstaddr = vnode_pager_addr(vp, m[i]->offset, &runpg);
+ if (firstaddr == -1) {
+ if( i == reqpage && foff < vnp->vnp_size) {
+ printf("vnode_pager_input: unexpected missing page: firstaddr: %d, foff: %d, vnp_size: %d\n",
+ firstaddr, foff, vnp->vnp_size);
+ panic("vnode_pager_input:...");
+ }
vnode_pager_freepage(m[i]);
- failflag = 1;
- } else {
- first = i;
+ runend = i + 1;
+ first = runend;
+ continue;
}
- }
-
- /*
- * Scan forward and stop for the first non-contiguous entry or stop
- * for a page being in buffer cache.
- */
- failflag = 0;
- last = reqpage + 1;
- for (i = reqpage + 1; i < count; i++) {
- if (failflag ||
- (vnode_pager_addr(vp, m[i]->offset))
- != reqaddr + (i - reqpage) * PAGE_SIZE) {
- vnode_pager_freepage(m[i]);
- failflag = 1;
+ runend = i + runpg;
+ if( runend <= reqpage) {
+ int j;
+ for(j = i; j < runend; j++) {
+ vnode_pager_freepage(m[j]);
+ }
} else {
- last = i + 1;
+ if( runpg < (count - first)) {
+ for(i=first + runpg; i < count; i++)
+ vnode_pager_freepage(m[i]);
+ count = first + runpg;
+ }
+ break;
}
+ first = runend;
}
- splx(s);
/*
* the first and last page have been calculated now, move input pages
* to be zero based...
*/
- count = last;
if (first != 0) {
for (i = first; i < count; i++) {
m[i - first] = m[i];
@@ -853,15 +852,16 @@ vnode_pager_input(vnp, m, count, reqpage)
count -= first;
reqpage -= first;
}
+
/*
* calculate the file virtual address for the transfer
*/
foff = m[0]->offset;
-
- /*
- * and get the disk physical address (in bytes)
- */
- firstaddr = vnode_pager_addr(vp, foff);
+#if 0
+ printf("foff: 0x%lx, firstaddr: 0x%lx\n",
+ foff, firstaddr);
+ DELAY(6000000);
+#endif
/*
* calculate the size of the transfer
@@ -1085,7 +1085,7 @@ vnode_pager_output_smlfs(vnp, m)
/*
* calculate logical block and offset
*/
- fileaddr = vnode_pager_addr(vp, m->offset + i * bsize);
+ fileaddr = vnode_pager_addr(vp, m->offset + i * bsize, (int *)0);
if (fileaddr != -1) {
bp = getpbuf();
@@ -1158,6 +1158,7 @@ vnode_pager_output(vnp, m, count, rtvals)
int s;
daddr_t block;
struct timeval tv;
+ int runpg;
int error = 0;
@@ -1229,19 +1230,9 @@ retryoutput:
return rtvals[0];
}
foff = m[0]->offset;
- reqaddr = vnode_pager_addr(vp, foff);
-
- /*
- * Scan forward and stop for the first non-contiguous entry or stop
- * for a page being in buffer cache.
- */
- for (i = 1; i < count; i++) {
- if (vnode_pager_addr(vp, m[i]->offset)
- != reqaddr + i * PAGE_SIZE) {
- count = i;
- break;
- }
- }
+ reqaddr = vnode_pager_addr(vp, foff, &runpg);
+ if( runpg < count)
+ count = runpg;
/*
* calculate the size of the transfer
OpenPOWER on IntegriCloud