Fixed bmap run-length brokeness.

Use bmap run-length extension when doing clustered paging.

Submitted by:	John Dyson
This commit is contained in:
David Greenman 1995-02-03 06:46:28 +00:00
parent 2700d33c07
commit efc68ce10f
10 changed files with 80 additions and 71 deletions

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)fifo_vnops.c 8.2 (Berkeley) 1/4/94 * @(#)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> #include <sys/param.h>
@ -356,6 +356,8 @@ fifo_bmap(ap)
*ap->a_vpp = ap->a_vp; *ap->a_vpp = ap->a_vp;
if (ap->a_bnp != NULL) if (ap->a_bnp != NULL)
*ap->a_bnp = ap->a_bn; *ap->a_bnp = ap->a_bn;
if (ap->a_runp != NULL)
*ap->a_runp = 0;
return (0); return (0);
} }

View File

@ -36,7 +36,7 @@
* *
* @(#)procfs_vnops.c 8.6 (Berkeley) 2/7/94 * @(#)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; *ap->a_vpp = ap->a_vp;
if (ap->a_bnp != NULL) if (ap->a_bnp != NULL)
*ap->a_bnp = ap->a_bn; *ap->a_bnp = ap->a_bn;
if (ap->a_runp != NULL)
*ap->a_runp = 0;
return (0); return (0);
} }

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)spec_vnops.c 8.6 (Berkeley) 4/9/94 * @(#)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> #include <sys/param.h>
@ -512,6 +512,8 @@ spec_bmap(ap)
*ap->a_vpp = ap->a_vp; *ap->a_vpp = ap->a_vp;
if (ap->a_bnp != NULL) if (ap->a_bnp != NULL)
*ap->a_bnp = ap->a_bn; *ap->a_bnp = ap->a_bn;
if (ap->a_runp != NULL)
*ap->a_runp = 0;
return (0); return (0);
} }

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)fifo_vnops.c 8.2 (Berkeley) 1/4/94 * @(#)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> #include <sys/param.h>
@ -356,6 +356,8 @@ fifo_bmap(ap)
*ap->a_vpp = ap->a_vp; *ap->a_vpp = ap->a_vp;
if (ap->a_bnp != NULL) if (ap->a_bnp != NULL)
*ap->a_bnp = ap->a_bn; *ap->a_bnp = ap->a_bn;
if (ap->a_runp != NULL)
*ap->a_runp = 0;
return (0); return (0);
} }

View File

@ -36,7 +36,7 @@
* *
* @(#)procfs_vnops.c 8.6 (Berkeley) 2/7/94 * @(#)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; *ap->a_vpp = ap->a_vp;
if (ap->a_bnp != NULL) if (ap->a_bnp != NULL)
*ap->a_bnp = ap->a_bn; *ap->a_bnp = ap->a_bn;
if (ap->a_runp != NULL)
*ap->a_runp = 0;
return (0); return (0);
} }

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)spec_vnops.c 8.6 (Berkeley) 4/9/94 * @(#)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> #include <sys/param.h>
@ -512,6 +512,8 @@ spec_bmap(ap)
*ap->a_vpp = ap->a_vp; *ap->a_vpp = ap->a_vp;
if (ap->a_bnp != NULL) if (ap->a_bnp != NULL)
*ap->a_bnp = ap->a_bn; *ap->a_bnp = ap->a_bn;
if (ap->a_runp != NULL)
*ap->a_runp = 0;
return (0); return (0);
} }

View File

@ -34,7 +34,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)nfs_vnops.c 8.5 (Berkeley) 2/13/94 * @(#)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; *ap->a_vpp = vp;
if (ap->a_bnp != NULL) if (ap->a_bnp != NULL)
*ap->a_bnp = ap->a_bn * btodb(vp->v_mount->mnt_stat.f_iosize); *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); return (0);
} }

View File

@ -34,7 +34,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)nfs_vnops.c 8.5 (Berkeley) 2/13/94 * @(#)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; *ap->a_vpp = vp;
if (ap->a_bnp != NULL) if (ap->a_bnp != NULL)
*ap->a_bnp = ap->a_bn * btodb(vp->v_mount->mnt_stat.f_iosize); *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); return (0);
} }

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)mfs_vnops.c 8.3 (Berkeley) 9/21/93 * @(#)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> #include <sys/param.h>
@ -230,6 +230,8 @@ mfs_bmap(ap)
*ap->a_vpp = ap->a_vp; *ap->a_vpp = ap->a_vp;
if (ap->a_bnp != NULL) if (ap->a_bnp != NULL)
*ap->a_bnp = ap->a_bn; *ap->a_bnp = ap->a_bn;
if (ap->a_runp != NULL)
*ap->a_runp = 0;
return (0); return (0);
} }

View File

@ -37,7 +37,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* from: @(#)vnode_pager.c 7.5 (Berkeley) 4/20/91 * 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 * file address
*/ */
vm_offset_t vm_offset_t
vnode_pager_addr(vp, address) vnode_pager_addr(vp, address, run)
struct vnode *vp; struct vnode *vp;
vm_offset_t address; vm_offset_t address;
int *run;
{ {
int rtaddress; int rtaddress;
int bsize; int bsize;
@ -509,12 +510,18 @@ vnode_pager_addr(vp, address)
vblock = address / bsize; vblock = address / bsize;
voffset = 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; rtaddress = -1;
else else {
rtaddress = block * DEV_BSIZE + voffset; rtaddress = block * DEV_BSIZE + voffset;
if( run) {
*run += 1;
*run *= bsize/PAGE_SIZE;
*run -= voffset/PAGE_SIZE;
}
}
return rtaddress; return rtaddress;
} }
@ -596,7 +603,7 @@ vnode_pager_input_smlfs(vnp, m)
if ((vm_page_bits(m->offset + i * bsize, bsize) & m->valid)) if ((vm_page_bits(m->offset + i * bsize, bsize) & m->valid))
continue; continue;
fileaddr = vnode_pager_addr(vp, m->offset + i * bsize); fileaddr = vnode_pager_addr(vp, m->offset + i * bsize, (int *)0);
if (fileaddr != -1) { if (fileaddr != -1) {
bp = getpbuf(); bp = getpbuf();
@ -727,8 +734,10 @@ vnode_pager_input(vnp, m, count, reqpage)
int bsize; int bsize;
int first, last; int first, last;
int reqaddr, firstaddr; int firstaddr;
int block, offset; int block, offset;
int runpg;
int runend;
struct buf *bp, *bpa; struct buf *bp, *bpa;
int counta; int counta;
@ -797,55 +806,45 @@ vnode_pager_input(vnp, m, count, reqpage)
* here on direct device I/O * 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 * calculate the run that includes the required page
* stop for the first discontiguous entry or stop for a page being in
* buffer cache.
*/ */
failflag = 0; for(first = 0, i = 0; i < count; i = runend) {
first = reqpage; firstaddr = vnode_pager_addr(vp, m[i]->offset, &runpg);
for (i = reqpage - 1; i >= 0; --i) { if (firstaddr == -1) {
if (failflag || if( i == reqpage && foff < vnp->vnp_size) {
(vnode_pager_addr(vp, m[i]->offset)) printf("vnode_pager_input: unexpected missing page: firstaddr: %d, foff: %d, vnp_size: %d\n",
!= reqaddr + (i - reqpage) * PAGE_SIZE) { firstaddr, foff, vnp->vnp_size);
panic("vnode_pager_input:...");
}
vnode_pager_freepage(m[i]); vnode_pager_freepage(m[i]);
failflag = 1; runend = i + 1;
first = runend;
continue;
}
runend = i + runpg;
if( runend <= reqpage) {
int j;
for(j = i; j < runend; j++) {
vnode_pager_freepage(m[j]);
}
} else { } else {
first = i; if( runpg < (count - first)) {
} for(i=first + runpg; i < count; i++)
}
/*
* 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]); vnode_pager_freepage(m[i]);
failflag = 1; count = first + runpg;
} else {
last = i + 1;
} }
break;
}
first = runend;
} }
splx(s);
/* /*
* the first and last page have been calculated now, move input pages * the first and last page have been calculated now, move input pages
* to be zero based... * to be zero based...
*/ */
count = last;
if (first != 0) { if (first != 0) {
for (i = first; i < count; i++) { for (i = first; i < count; i++) {
m[i - first] = m[i]; m[i - first] = m[i];
@ -853,15 +852,16 @@ vnode_pager_input(vnp, m, count, reqpage)
count -= first; count -= first;
reqpage -= first; reqpage -= first;
} }
/* /*
* calculate the file virtual address for the transfer * calculate the file virtual address for the transfer
*/ */
foff = m[0]->offset; foff = m[0]->offset;
#if 0
/* printf("foff: 0x%lx, firstaddr: 0x%lx\n",
* and get the disk physical address (in bytes) foff, firstaddr);
*/ DELAY(6000000);
firstaddr = vnode_pager_addr(vp, foff); #endif
/* /*
* calculate the size of the transfer * calculate the size of the transfer
@ -1085,7 +1085,7 @@ vnode_pager_output_smlfs(vnp, m)
/* /*
* calculate logical block and offset * 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) { if (fileaddr != -1) {
bp = getpbuf(); bp = getpbuf();
@ -1158,6 +1158,7 @@ vnode_pager_output(vnp, m, count, rtvals)
int s; int s;
daddr_t block; daddr_t block;
struct timeval tv; struct timeval tv;
int runpg;
int error = 0; int error = 0;
@ -1229,19 +1230,9 @@ retryoutput:
return rtvals[0]; return rtvals[0];
} }
foff = m[0]->offset; foff = m[0]->offset;
reqaddr = vnode_pager_addr(vp, foff); reqaddr = vnode_pager_addr(vp, foff, &runpg);
if( runpg < count)
/* count = runpg;
* 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;
}
}
/* /*
* calculate the size of the transfer * calculate the size of the transfer