Align the offset in vn_rdwr_inchunks() so that at most the first and

the last chunk are misaligned relative to a MAXBSIZE byte boundary.
vn_rdwr_inchunks() is used mainly for elf core dumps, and elf sections
are usually perfectly misaligned relative to MAXBSIZE, and chunking
prevents the file system from doing much realigning.

This gives a surprisingly large speedup for core dumps -- from 50 to
13 seconds for a 512MB core dump here.  The pessimization was mostly
from an interaction of the misalignment with IO_DIRECT.  It increased
the number of i/o's for each chunk by a factor of 5 (3 writes and 2
read-before-writes instead of 1 write).
This commit is contained in:
Bruce Evans 2004-03-13 02:56:27 +00:00
parent bc1470f1f1
commit 0249823ecb

View File

@ -476,8 +476,18 @@ vn_rdwr_inchunks(rw, vp, base, len, offset, segflg, ioflg, active_cred,
int error = 0; int error = 0;
do { do {
int chunk = (len > MAXBSIZE) ? MAXBSIZE : len; int chunk;
/*
* Force `offset' to a multiple of MAXBSIZE except possibly
* for the first chunk, so that filesystems only need to
* write full blocks except possibly for the first and last
* chunks.
*/
chunk = MAXBSIZE - (uoff_t)offset % MAXBSIZE;
if (chunk > len)
chunk = len;
if (rw != UIO_READ && vp->v_type == VREG) if (rw != UIO_READ && vp->v_type == VREG)
bwillwrite(); bwillwrite();
error = vn_rdwr(rw, vp, base, chunk, offset, segflg, error = vn_rdwr(rw, vp, base, chunk, offset, segflg,