[libvirt] [PATCHv2 06/14] Fix vmdef usage while in monitor in qemuDomainHotplugVcpus

John Ferlan jferlan at redhat.com
Mon Jan 12 22:10:17 UTC 2015



On 01/07/2015 10:42 AM, Ján Tomko wrote:
> Exit the monitor right after we've done with it to get
> the virDomainObjPtr lock back, otherwise we might be accessing
> vm->def while it's being cleaned up by qemuProcessStop.
> 
> If the domain crashed while we were in the monitor, exit
> early instead of changing vm->def which is now the persistent
> definition.
> ---
>  src/qemu/qemu_driver.c | 14 ++++++++++----
>  1 file changed, 10 insertions(+), 4 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index f7c9219..1275ba4 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -4367,7 +4367,7 @@ static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
>              if (rc == 0)
>                  goto unsupported;
>              if (rc < 0)
> -                goto cleanup;
> +                goto exit_monitor;
>  
>              vcpus++;
>          }
> @@ -4378,7 +4378,7 @@ static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
>              if (rc == 0)
>                  goto unsupported;
>              if (rc < 0)
> -                goto cleanup;
> +                goto exit_monitor;
>  
>              vcpus--;
>          }
> @@ -4395,6 +4395,10 @@ static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
>       * fatal */
>      if ((ncpupids = qemuMonitorGetCPUInfo(priv->mon, &cpupids)) <= 0) {
>          virResetLastError();
> +        goto exit_monitor;
> +    }
> +    if (qemuDomainObjExitMonitor(driver, vm) < 0) {
> +        ret = -1;
>          goto cleanup;
>      }
>  
> @@ -4515,10 +4519,10 @@ static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
>      cpupids = NULL;
>  
>   cleanup:
> -    qemuDomainObjExitMonitor(driver, vm);
> -    vm->def->vcpus = vcpus;
>      VIR_FREE(cpupids);
>      VIR_FREE(mem_mask);
> +    if (virDomainObjIsActive(vm))
> +        vm->def->vcpus = vcpus;
>      virDomainAuditVcpu(vm, oldvcpus, nvcpus, "update", rc == 1);

NOTE: We'll audit regardless of ExitMonitor status here.

ACK in general, but the Audit stuff needs to be handled in the same
manner as other calls.

John
>      if (cgroup_vcpu)
>          virCgroupFree(&cgroup_vcpu);
> @@ -4527,6 +4531,8 @@ static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
>   unsupported:
>      virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>                     _("cannot change vcpu count of this domain"));
> + exit_monitor:
> +    ignore_value(qemuDomainObjExitMonitor(driver, vm));
>      goto cleanup;
>  }
>  
> 




More information about the libvir-list mailing list