[PATCH 5/7] hyperv: fix domainSuspend and domainResume on Hyper-V V2

Daniel P. Berrangé berrange at redhat.com
Fri Oct 9 08:43:46 UTC 2020


On Fri, Oct 09, 2020 at 04:31:54AM -0400, Matt Coleman wrote:
> Signed-off-by: Matt Coleman <matt at datto.com>
> ---
>  src/hyperv/hyperv_driver.c      | 15 +++++++++++----
>  src/hyperv/hyperv_wmi_classes.h |  1 +
>  2 files changed, 12 insertions(+), 4 deletions(-)
> 
> diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c
> index 0b28c1e94b..89840f7ac4 100644
> --- a/src/hyperv/hyperv_driver.c
> +++ b/src/hyperv/hyperv_driver.c
> @@ -867,6 +867,10 @@ hypervDomainSuspend(virDomainPtr domain)
>      int result = -1;
>      hypervPrivate *priv = domain->conn->privateData;
>      Msvm_ComputerSystem *computerSystem = NULL;
> +    int requestedState = MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_PAUSED;
> +
> +    if (priv->wmiVersion == HYPERV_WMI_VERSION_V2)
> +        requestedState = MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_QUIESCE;

Is quiesce really what we want here ?

The libvirt  Suspend/Resume APIs are specifically about pausing
execution of the guest CPUs.

IIUC, quiesce usually just refers to suspending I/O processing,
in order to allow snapshots to be taken, but CPUs stay running.

>  
>      if (hypervMsvmComputerSystemFromDomain(domain, &computerSystem) < 0)
>          goto cleanup;
> @@ -878,8 +882,8 @@ hypervDomainSuspend(virDomainPtr domain)
>          goto cleanup;
>      }
>  
> -    result = hypervInvokeMsvmComputerSystemRequestStateChange
> -               (domain, MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_PAUSED);
> +    result = hypervInvokeMsvmComputerSystemRequestStateChange(domain,
> +                                                              requestedState);
>  
>   cleanup:
>      hypervFreeObject(priv, (hypervObject *)computerSystem);
> @@ -895,12 +899,15 @@ hypervDomainResume(virDomainPtr domain)
>      int result = -1;
>      hypervPrivate *priv = domain->conn->privateData;
>      Msvm_ComputerSystem *computerSystem = NULL;
> +    int expectedState = MSVM_COMPUTERSYSTEM_ENABLEDSTATE_PAUSED;
> +
> +    if (priv->wmiVersion == HYPERV_WMI_VERSION_V2)
> +        expectedState = MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_QUIESCE;
>  
>      if (hypervMsvmComputerSystemFromDomain(domain, &computerSystem) < 0)
>          goto cleanup;
>  
> -    if (computerSystem->data.common->EnabledState !=
> -        MSVM_COMPUTERSYSTEM_ENABLEDSTATE_PAUSED) {
> +    if (computerSystem->data.common->EnabledState != expectedState) {
>          virReportError(VIR_ERR_OPERATION_INVALID, "%s",
>                         _("Domain is not paused"));
>          goto cleanup;
> diff --git a/src/hyperv/hyperv_wmi_classes.h b/src/hyperv/hyperv_wmi_classes.h
> index 7f4159dd8e..0074d8889e 100644
> --- a/src/hyperv/hyperv_wmi_classes.h
> +++ b/src/hyperv/hyperv_wmi_classes.h
> @@ -73,6 +73,7 @@ enum _Msvm_ComputerSystem_EnabledState {
>  enum _Msvm_ComputerSystem_RequestedState {
>      MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_ENABLED = 2,
>      MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_DISABLED = 3,
> +    MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_QUIESCE = 9,
>      MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_REBOOT = 10,
>      MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_RESET = 11,
>      MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_PAUSED = 32768,
> -- 
> 2.27.0
> 
> 

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|




More information about the libvir-list mailing list