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:
parent
bc1470f1f1
commit
0249823ecb
@ -476,8 +476,18 @@ vn_rdwr_inchunks(rw, vp, base, len, offset, segflg, ioflg, active_cred,
|
||||
int error = 0;
|
||||
|
||||
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)
|
||||
bwillwrite();
|
||||
error = vn_rdwr(rw, vp, base, chunk, offset, segflg,
|
||||
|
Loading…
Reference in New Issue
Block a user