diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2014-03-25 15:23:08 +0000 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2014-03-25 15:23:08 +0000 |
commit | d4cc1a213f8cb22fa0861ae2a907c60cf00796ff (patch) | |
tree | 80ea19c13fa7c1cee21854bc1b96fdbf30fd25ac /block | |
parent | 839a5547574e57cce62f49bfc50fe1f04b00589a (diff) | |
parent | 7b770c720b28b8ac5b82ae431f2f354b7f8add91 (diff) | |
download | qemu-d4cc1a213f8cb22fa0861ae2a907c60cf00796ff.zip qemu-d4cc1a213f8cb22fa0861ae2a907c60cf00796ff.tar.gz qemu-d4cc1a213f8cb22fa0861ae2a907c60cf00796ff.tar.bz2 |
Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging
Block pull request
# gpg: Signature made Tue 25 Mar 2014 14:34:45 GMT using RSA key ID 81AB73C8
# gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>"
# gpg: aka "Stefan Hajnoczi <stefanha@gmail.com>"
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg: There is no indication that the signature belongs to the owner.
# Primary key fingerprint: 8695 A8BF D3F9 7CDA AC35 775A 9CA4 ABB3 81AB 73C8
* remotes/stefanha/tags/block-pull-request:
mirror: fix early wake from sleep due to aio
mirror: fix throttling delay calculation
Fixed various typos
qemu-img: mandate argument to 'qemu-img check --repair'
osdep: initialize glib threads in all QEMU tools
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'block')
-rw-r--r-- | block/gluster.c | 2 | ||||
-rw-r--r-- | block/mirror.c | 37 | ||||
-rw-r--r-- | block/qcow.c | 2 | ||||
-rw-r--r-- | block/sheepdog.c | 8 | ||||
-rw-r--r-- | block/vdi.c | 2 | ||||
-rw-r--r-- | block/vhdx-log.c | 2 |
6 files changed, 31 insertions, 22 deletions
diff --git a/block/gluster.c b/block/gluster.c index a44d612..8836085 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -80,7 +80,7 @@ static int parse_volume_options(GlusterConf *gconf, char *path) * 'server' specifies the server where the volume file specification for * the given volume resides. This can be either hostname, ipv4 address * or ipv6 address. ipv6 address needs to be within square brackets [ ]. - * If transport type is 'unix', then 'server' field should not be specifed. + * If transport type is 'unix', then 'server' field should not be specified. * The 'socket' field needs to be populated with the path to unix domain * socket. * diff --git a/block/mirror.c b/block/mirror.c index dd5ee05..0ef41f9 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -98,7 +98,14 @@ static void mirror_iteration_done(MirrorOp *op, int ret) qemu_iovec_destroy(&op->qiov); g_slice_free(MirrorOp, op); - qemu_coroutine_enter(s->common.co, NULL); + + /* Enter coroutine when it is not sleeping. The coroutine sleeps to + * rate-limit itself. The coroutine will eventually resume since there is + * a sleep timeout so don't wake it early. + */ + if (s->common.busy) { + qemu_coroutine_enter(s->common.co, NULL); + } } static void mirror_write_complete(void *opaque, int ret) @@ -139,11 +146,12 @@ static void mirror_read_complete(void *opaque, int ret) mirror_write_complete, op); } -static void coroutine_fn mirror_iteration(MirrorBlockJob *s) +static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s) { BlockDriverState *source = s->common.bs; int nb_sectors, sectors_per_chunk, nb_chunks; int64_t end, sector_num, next_chunk, next_sector, hbitmap_next_sector; + uint64_t delay_ns; MirrorOp *op; s->sector_num = hbitmap_iter_next(&s->hbi); @@ -231,7 +239,12 @@ static void coroutine_fn mirror_iteration(MirrorBlockJob *s) nb_chunks += added_chunks; next_sector += added_sectors; next_chunk += added_chunks; - } while (next_sector < end); + if (!s->synced && s->common.speed) { + delay_ns = ratelimit_calculate_delay(&s->limit, added_sectors); + } else { + delay_ns = 0; + } + } while (delay_ns == 0 && next_sector < end); /* Allocate a MirrorOp that is used as an AIO callback. */ op = g_slice_new(MirrorOp); @@ -268,6 +281,7 @@ static void coroutine_fn mirror_iteration(MirrorBlockJob *s) trace_mirror_one_iteration(s, sector_num, nb_sectors); bdrv_aio_readv(source, sector_num, &op->qiov, nb_sectors, mirror_read_complete, op); + return delay_ns; } static void mirror_free_init(MirrorBlockJob *s) @@ -362,7 +376,7 @@ static void coroutine_fn mirror_run(void *opaque) bdrv_dirty_iter_init(bs, s->dirty_bitmap, &s->hbi); last_pause_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME); for (;;) { - uint64_t delay_ns; + uint64_t delay_ns = 0; int64_t cnt; bool should_complete; @@ -386,8 +400,10 @@ static void coroutine_fn mirror_run(void *opaque) qemu_coroutine_yield(); continue; } else if (cnt != 0) { - mirror_iteration(s); - continue; + delay_ns = mirror_iteration(s); + if (delay_ns == 0) { + continue; + } } } @@ -432,17 +448,10 @@ static void coroutine_fn mirror_run(void *opaque) } ret = 0; - trace_mirror_before_sleep(s, cnt, s->synced); + trace_mirror_before_sleep(s, cnt, s->synced, delay_ns); if (!s->synced) { /* Publish progress */ s->common.offset = (end - cnt) * BDRV_SECTOR_SIZE; - - if (s->common.speed) { - delay_ns = ratelimit_calculate_delay(&s->limit, sectors_per_chunk); - } else { - delay_ns = 0; - } - block_job_sleep_ns(&s->common, QEMU_CLOCK_REALTIME, delay_ns); if (block_job_is_cancelled(&s->common)) { break; diff --git a/block/qcow.c b/block/qcow.c index 1e128be..d5a7d5f 100644 --- a/block/qcow.c +++ b/block/qcow.c @@ -723,7 +723,7 @@ static int qcow_create(const char *filename, QEMUOptionParameter *options, backing_file = NULL; } header.cluster_bits = 9; /* 512 byte cluster to avoid copying - unmodifyed sectors */ + unmodified sectors */ header.l2_bits = 12; /* 32 KB L2 tables */ } else { header.cluster_bits = 12; /* 4 KB clusters */ diff --git a/block/sheepdog.c b/block/sheepdog.c index f7bd024..0eb33ee 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -909,9 +909,9 @@ static void co_write_request(void *opaque) } /* - * Return a socket discriptor to read/write objects. + * Return a socket descriptor to read/write objects. * - * We cannot use this discriptor for other operations because + * We cannot use this descriptor for other operations because * the block driver may be on waiting response from the server. */ static int get_sheep_fd(BDRVSheepdogState *s) @@ -1896,7 +1896,7 @@ static int sd_create_branch(BDRVSheepdogState *s) /* * Even If deletion fails, we will just create extra snapshot based on - * the workding VDI which was supposed to be deleted. So no need to + * the working VDI which was supposed to be deleted. So no need to * false bail out. */ deleted = sd_delete(s); @@ -2194,7 +2194,7 @@ cleanup: * We implement rollback(loadvm) operation to the specified snapshot by * 1) switch to the snapshot * 2) rely on sd_create_branch to delete working VDI and - * 3) create a new working VDI based on the speicified snapshot + * 3) create a new working VDI based on the specified snapshot */ static int sd_snapshot_goto(BlockDriverState *bs, const char *snapshot_id) { diff --git a/block/vdi.c b/block/vdi.c index ae49cd8..ac9a025 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -31,7 +31,7 @@ * Allocation of blocks could be optimized (less writes to block map and * header). * - * Read and write of adjacents blocks could be done in one operation + * Read and write of adjacent blocks could be done in one operation * (current code uses one operation per block (1 MiB). * * The code is not thread safe (missing locks for changes in header and diff --git a/block/vhdx-log.c b/block/vhdx-log.c index 02755b8..a77c040 100644 --- a/block/vhdx-log.c +++ b/block/vhdx-log.c @@ -578,7 +578,7 @@ static int vhdx_validate_log_entry(BlockDriverState *bs, BDRVVHDXState *s, total_sectors = hdr.entry_length / VHDX_LOG_SECTOR_SIZE; - /* read_desc() will incrememnt the read idx */ + /* read_desc() will increment the read idx */ ret = vhdx_log_read_desc(bs, s, log, &desc_buffer); if (ret < 0) { goto free_and_exit; |