Il 26/11/2013 09:56, Peter Lieven ha scritto: > since the convert process is basically a sync operation it might > be benificial in some case to change the hardcoded I/O buffer > size to a greater value. > > This patch increases the I/O buffer size if the output > driver advertises an optimal transfer length or discard alignment > that is greater than the default buffer size of 2M. > > Signed-off-by: Peter Lieven <p...@kamp.de> > --- > qemu-img.c | 18 ++++++++++++++---- > 1 file changed, 14 insertions(+), 4 deletions(-) > > diff --git a/qemu-img.c b/qemu-img.c > index e2d1a0a..b076d44 100644 > --- a/qemu-img.c > +++ b/qemu-img.c > @@ -1135,6 +1135,7 @@ static int img_convert(int argc, char **argv) > sector_num_next_status = 0; > uint64_t bs_sectors; > uint8_t * buf = NULL; > + size_t bufsectors = IO_BUF_SIZE / BDRV_SECTOR_SIZE; > const uint8_t *buf1; > BlockDriverInfo bdi; > QEMUOptionParameter *param = NULL, *create_options = NULL; > @@ -1371,7 +1372,16 @@ static int img_convert(int argc, char **argv) > bs_i = 0; > bs_offset = 0; > bdrv_get_geometry(bs[0], &bs_sectors); > - buf = qemu_blockalign(out_bs, IO_BUF_SIZE); > + > + /* increase bufsectors from the default 4096 (2M) if opt_transfer_length > + * or discard_alignment of the out_bs is greater. Limit to 32768 (16MB) > + * as maximum. */ > + bufsectors = MIN(32768, > + MAX(bufsectors, MAX(out_bs->bl.opt_transfer_length, > + out_bs->bl.discard_alignment)) > + ); > + > + buf = qemu_blockalign(out_bs, bufsectors * BDRV_SECTOR_SIZE); > > if (skip_create) { > int64_t output_length = bdrv_getlength(out_bs); > @@ -1394,7 +1404,7 @@ static int img_convert(int argc, char **argv) > goto out; > } > cluster_size = bdi.cluster_size; > - if (cluster_size <= 0 || cluster_size > IO_BUF_SIZE) { > + if (cluster_size <= 0 || cluster_size > bufsectors * > BDRV_SECTOR_SIZE) { > error_report("invalid cluster size"); > ret = -1; > goto out; > @@ -1531,8 +1541,8 @@ static int img_convert(int argc, char **argv) > sector_num_next_status = sector_num + n1; > } > > - if (nb_sectors >= (IO_BUF_SIZE / 512)) { > - n = (IO_BUF_SIZE / 512); > + if (nb_sectors >= bufsectors) { > + n = bufsectors; > } else { > n = nb_sectors; > } >
Reviewed-by: Paolo Bonzini <pbonz...@redhat.com>