[libvirt] [PATCH 7/8] Set qemu migration speed unlimited when migrating to file
Daniel P. Berrange
berrange at redhat.com
Thu Sep 1 12:42:05 UTC 2011
On Fri, Aug 26, 2011 at 12:10:26PM -0600, Jim Fehlig wrote:
> The qemu migration speed default is 32MiB/s as defined in migration.c
>
> /* Migration speed throttling */
> static int64_t max_throttle = (32 << 20);
>
> The only reason to throttle migration when targeting a file is user
> request. If user has not changed the qemu default, set migration speed
> to unlimited prior to migration, and restore to qemu default value after
> migration.
>
> Default units is MB for migrate_set_speed monitor command, so
> (INT64_MAX / (1024 * 1024)) is used for unlimited migration speed.
>
> Tested with both json and text monitors.
> ---
> src/qemu/qemu_migration.c | 22 ++++++++++++++++++++++
> src/qemu/qemu_migration.h | 3 +++
> 2 files changed, 25 insertions(+), 0 deletions(-)
>
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index a2dc97c..910cd8d 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -2699,6 +2699,18 @@ qemuMigrationToFile(struct qemud_driver *driver, virDomainObjPtr vm,
> bool restoreLabel = false;
> virCommandPtr cmd = NULL;
> int pipeFD[2] = { -1, -1 };
> + unsigned long initMigBandwidth = vm->def->migration_max_bandwidth;
> +
> + /* If no user-defined migration speed is set, increase qemu default
> + * (32MiB/s) to unlimited since target is a file.
> + * Failure to change migration speed is not fatal. */
> + if (initMigBandwidth == 0) {
> + if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) == 0) {
> + qemuMonitorSetMigrationSpeed(priv->mon, QEMU_FILE_MIGRATION_SPEED_MAX);
> + vm->def->migration_max_bandwidth = QEMU_FILE_MIGRATION_SPEED_MAX;
> + qemuDomainObjExitMonitorWithDriver(driver, vm);
> + }
> + }
>
> if (qemuCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATE_QEMU_FD) &&
> (!compressor || pipe(pipeFD) == 0)) {
> @@ -2807,6 +2819,16 @@ qemuMigrationToFile(struct qemud_driver *driver, virDomainObjPtr vm,
> ret = 0;
>
> cleanup:
> + /* If migration speed was changed from default, restore it. */
> + if (initMigBandwidth == 0) {
> + if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) == 0) {
> + qemuMonitorSetMigrationSpeed(priv->mon,
> + QEMU_DEFAULT_MIGRATION_SPEED_MAX);
> + vm->def->migration_max_bandwidth = 0;
> + qemuDomainObjExitMonitorWithDriver(driver, vm);
> + }
> + }
IMHO, we should just unconditionally set & reset the migration bandwidth
in QEMU here, and when doing a real migration, also unconditionally
set the bandwidth there, so we remove QEMU's internal default setting
from the equation & get predictable behaviour with all QEMUs.
> +
> VIR_FORCE_CLOSE(pipeFD[0]);
> VIR_FORCE_CLOSE(pipeFD[1]);
> virCommandFree(cmd);
> diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
> index 5c6921d..e49505e 100644
> --- a/src/qemu/qemu_migration.h
> +++ b/src/qemu/qemu_migration.h
> @@ -53,6 +53,9 @@ enum qemuMigrationJobPhase {
> };
> VIR_ENUM_DECL(qemuMigrationJobPhase)
>
> +# define QEMU_DEFAULT_MIGRATION_SPEED_MAX (32 << 20)
> +# define QEMU_FILE_MIGRATION_SPEED_MAX (INT64_MAX / (1024 * 1024))
> +
> int qemuMigrationJobStart(struct qemud_driver *driver,
> virDomainObjPtr vm,
> enum qemuDomainAsyncJob job)
> --
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list