Block pull request
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJTMZQFAAoJEJykq7OBq3PIf2cH/AyT5qPTISzDNEyAmnPx9Fh0 qQ7ynjYz6j4X1dsPq/A9g7H6098P6Yfm+QloqSir9ugo5ZBGzIoTXp3Jhauoami+ KbOi+0OjV8AKdNEc48/9mELn/nCXoct9BX1WxcUw0n5HYoTDoh7+m2a6LaDgv4mb MfobVBNMqnrur2KhBKJbEGRzot2u1pHfoWnt+vBDPw4lf5RrUYW+uwyPTPRes4KG Qw3pwScW6KZu2EXe20B1L7BLLfP172Y1ONSHvuP/nd1TSMJSA+PUPpks1e1/CJA8 VtaF3ktBjtTUyIIi3nQfR7U6K9PCpsuG9U3xPQiWlRyrS7BYlB60OboUelB4tZI= =5NY6 -----END PGP SIGNATURE----- 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>
This commit is contained in:
commit
d4cc1a213f
@ -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.
|
||||
*
|
||||
|
@ -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;
|
||||
|
@ -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 */
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -565,7 +565,7 @@ static int img_check(int argc, char **argv)
|
||||
static const struct option long_options[] = {
|
||||
{"help", no_argument, 0, 'h'},
|
||||
{"format", required_argument, 0, 'f'},
|
||||
{"repair", no_argument, 0, 'r'},
|
||||
{"repair", required_argument, 0, 'r'},
|
||||
{"output", required_argument, 0, OPTION_OUTPUT},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
@ -279,7 +279,7 @@ static void tftp_handle_rrq(Slirp *slirp, struct tftp_t *tp, int pktlen)
|
||||
|
||||
spt = &slirp->tftp_sessions[s];
|
||||
|
||||
/* unspecifed prefix means service disabled */
|
||||
/* unspecified prefix means service disabled */
|
||||
if (!slirp->tftp_prefix) {
|
||||
tftp_send_error(spt, 2, "Access violation", tp);
|
||||
return;
|
||||
|
@ -82,7 +82,7 @@ mirror_start(void *bs, void *s, void *co, void *opaque) "bs %p s %p co %p opaque
|
||||
mirror_restart_iter(void *s, int64_t cnt) "s %p dirty count %"PRId64
|
||||
mirror_before_flush(void *s) "s %p"
|
||||
mirror_before_drain(void *s, int64_t cnt) "s %p dirty count %"PRId64
|
||||
mirror_before_sleep(void *s, int64_t cnt, int synced) "s %p dirty count %"PRId64" synced %d"
|
||||
mirror_before_sleep(void *s, int64_t cnt, int synced, uint64_t delay_ns) "s %p dirty count %"PRId64" synced %d delay %"PRIu64"ns"
|
||||
mirror_one_iteration(void *s, int64_t sector_num, int nb_sectors) "s %p sector_num %"PRId64" nb_sectors %d"
|
||||
mirror_iteration_done(void *s, int64_t sector_num, int nb_sectors, int ret) "s %p sector_num %"PRId64" nb_sectors %d ret %d"
|
||||
mirror_yield(void *s, int64_t cnt, int buf_free_count, int in_flight) "s %p dirty count %"PRId64" free buffers %d in_flight %d"
|
||||
|
@ -414,15 +414,6 @@ bool trace_backend_init(const char *events, const char *file)
|
||||
{
|
||||
GThread *thread;
|
||||
|
||||
if (!g_thread_supported()) {
|
||||
#if !GLIB_CHECK_VERSION(2, 31, 0)
|
||||
g_thread_init(NULL);
|
||||
#else
|
||||
fprintf(stderr, "glib threading failed to initialize.\n");
|
||||
exit(1);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if !GLIB_CHECK_VERSION(2, 31, 0)
|
||||
trace_available_cond = g_cond_new();
|
||||
trace_empty_cond = g_cond_new();
|
||||
|
18
util/osdep.c
18
util/osdep.c
@ -436,6 +436,24 @@ int socket_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Ensure that glib is running in multi-threaded mode */
|
||||
static void __attribute__((constructor)) thread_init(void)
|
||||
{
|
||||
if (!g_thread_supported()) {
|
||||
#if !GLIB_CHECK_VERSION(2, 31, 0)
|
||||
/* Old versions of glib require explicit initialization. Failure to do
|
||||
* this results in the single-threaded code paths being taken inside
|
||||
* glib. For example, the g_slice allocator will not be thread-safe
|
||||
* and cause crashes.
|
||||
*/
|
||||
g_thread_init(NULL);
|
||||
#else
|
||||
fprintf(stderr, "glib threading failed to initialize.\n");
|
||||
exit(1);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef CONFIG_IOVEC
|
||||
/* helper function for iov_send_recv() */
|
||||
static ssize_t
|
||||
|
8
vl.c
8
vl.c
@ -2970,14 +2970,6 @@ int main(int argc, char **argv, char **envp)
|
||||
qemu_init_exec_dir(argv[0]);
|
||||
|
||||
g_mem_set_vtable(&mem_trace);
|
||||
if (!g_thread_supported()) {
|
||||
#if !GLIB_CHECK_VERSION(2, 31, 0)
|
||||
g_thread_init(NULL);
|
||||
#else
|
||||
fprintf(stderr, "glib threading failed to initialize.\n");
|
||||
exit(1);
|
||||
#endif
|
||||
}
|
||||
|
||||
module_call_init(MODULE_INIT_QOM);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user