[libvirt] [PATCH] qemu: process: Refresh data from qemu monitor after migration

John Ferlan jferlan at redhat.com
Tue Sep 26 20:39:54 UTC 2017



On 09/25/2017 10:25 AM, Peter Krempa wrote:
> Some values we read from the qemu monitor may be changed with the actual
> state by the incomming migration. This means that we should refresh

s/incomming/incoming

> certain things only after the migration has finished.
> 
> This is mostly visible in the cdrom tray state, which is by default
> closed but may be opened by the guest OS. This would be refreshed before
> qemu transferred the actual state and thus libvirt would think that the
> tray is closed.
> 
> Note that this patch moves only a few obvious query commands. Other may
> be moved later after individual assesment.
> 

s/Other/Others
s/assesment/assessment

> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1463168
> ---
>  src/qemu/qemu_process.c | 59 +++++++++++++++++++++++++++++++++++--------------
>  1 file changed, 43 insertions(+), 16 deletions(-)
> 
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index c104985aa..2be82e958 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -5787,14 +5787,6 @@ qemuProcessLaunch(virConnectPtr conn,
>      if (qemuProcessSetLinkStates(driver, vm, asyncJob) < 0)
>          goto cleanup;
> 
> -    VIR_DEBUG("Fetching list of active devices");
> -    if (qemuDomainUpdateDeviceList(driver, vm, asyncJob) < 0)
> -        goto cleanup;
> -
> -    VIR_DEBUG("Updating info of memory devices");
> -    if (qemuDomainUpdateMemoryDeviceInfo(driver, vm, asyncJob) < 0)
> -        goto cleanup;
> -
>      VIR_DEBUG("Setting initial memory amount");
>      if (qemuProcessSetupBalloon(driver, vm, asyncJob) < 0)
>          goto cleanup;
> @@ -5806,14 +5798,6 @@ qemuProcessLaunch(virConnectPtr conn,
>          qemuProcessRefreshBalloonState(driver, vm, asyncJob) < 0)
>          goto cleanup;
> 
> -    VIR_DEBUG("Detecting actual memory size for video device");
> -    if (qemuProcessUpdateVideoRamSize(driver, vm, asyncJob) < 0)
> -        goto cleanup;
> -
> -    VIR_DEBUG("Updating disk data");
> -    if (qemuProcessRefreshDisks(driver, vm, asyncJob) < 0)
> -        goto cleanup;
> -
>      if (flags & VIR_QEMU_PROCESS_START_AUTODESTROY &&
>          qemuProcessAutoDestroyAdd(driver, vm, conn) < 0)
>          goto cleanup;
> @@ -5831,6 +5815,46 @@ qemuProcessLaunch(virConnectPtr conn,
>  }
> 
> 
> +/**
> + * qemuProcessRefreshState:
> + * @driver: qemu driver data
> + * @vm: domain to refresh
> + * @asyncJob: async job type
> + *
> + * This function gathers calls to refresh qemu state after startup. This
> + * function is called after a deferred migration finishes so that we can update
> + * state influenced by the migration stream.

Would it be useful to place a caveat here of things to "consider" before
blindly moving something from Launch to here?  Buyer beware...

Something that perhaps qemuMigrationRunIncoming may assume is already
done... I know it's pretty low level so I cannot think of something
right now, but perhaps while it's fresh in your mind...

> + */
> +static int
> +qemuProcessRefreshState(virQEMUDriverPtr driver,
> +                        virDomainObjPtr vm,
> +                        qemuDomainAsyncJob asyncJob)
> +{
> +    int ret = -1;
> +
> +    VIR_DEBUG("Fetching list of active devices");
> +    if (qemuDomainUpdateDeviceList(driver, vm, asyncJob) < 0)
> +        goto cleanup;
> +
> +    VIR_DEBUG("Updating info of memory devices");
> +    if (qemuDomainUpdateMemoryDeviceInfo(driver, vm, asyncJob) < 0)
> +        goto cleanup;
> +
> +    VIR_DEBUG("Detecting actual memory size for video device");
> +    if (qemuProcessUpdateVideoRamSize(driver, vm, asyncJob) < 0)
> +        goto cleanup;
> +
> +    VIR_DEBUG("Updating disk data");
> +    if (qemuProcessRefreshDisks(driver, vm, asyncJob) < 0)
> +        goto cleanup;
> +
> +    ret = 0;
> +
> + cleanup:
> +    return ret;

Nothing to clean up.... all those goto cleanup's should just be return
-1; instead and the @ret unnecessary.

Reviewed-by: John Ferlan <jferlan at redhat.com>

John

> +}
> +
> +
>  /**
>   * qemuProcessFinishStartup:
>   *
> @@ -5847,6 +5871,9 @@ qemuProcessFinishStartup(virConnectPtr conn,
>      virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
>      int ret = -1;
> 
> +    if (qemuProcessRefreshState(driver, vm, asyncJob) < 0)
> +        goto cleanup;
> +
>      if (startCPUs) {
>          VIR_DEBUG("Starting domain CPUs");
>          if (qemuProcessStartCPUs(driver, vm, conn,
> 




More information about the libvir-list mailing list