[libvirt] [PATCH] Make sure qemudDomainSetVcpus doesn't hang.

Chris Lalancette clalance at redhat.com
Thu Mar 11 17:52:40 UTC 2010


On 03/11/2010 11:31 AM, Daniel Veillard wrote:
> On Thu, Mar 11, 2010 at 10:36:28AM -0500, Chris Lalancette wrote:
>> The code to add job support into libvirtd caused a problem
>> in qemudDomainSetVcpus.  In particular, a qemuDomainObjEndJob()
>> call was added at the end of the function, but a
>> corresponding qemuDomainObjBeginJob() was not.  Additionally,
>> a call to qemuDomainObj{Enter,Exit}Monitor() was also missed
>> in qemudDomainHotplugVcpus().  These missing calls conspired to
>> cause a hang in the libvirtd process after the command was
>> finished.  Fix this by adding the missing calls.
>>
>> Signed-off-by: Chris Lalancette <clalance at redhat.com>
>> ---
>>  src/qemu/qemu_driver.c |   11 +++++++++--
>>  1 files changed, 9 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index 6bfae93..ee3dbd3 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -4515,7 +4515,9 @@ static int qemudDomainHotplugVcpus(virDomainObjPtr vm, unsigned int nvcpus)
>>      if (nvcpus > vm->def->vcpus) {
>>          for (i = vm->def->vcpus ; i < nvcpus ; i++) {
>>              /* Online new CPU */
>> +            qemuDomainObjEnterMonitor(vm);
>>              rc = qemuMonitorSetCPU(priv->mon, i, 1);
>> +            qemuDomainObjExitMonitor(vm);
>>              if (rc == 0)
>>                  goto unsupported;
>>              if (rc < 0)
>> @@ -4526,7 +4528,9 @@ static int qemudDomainHotplugVcpus(virDomainObjPtr vm, unsigned int nvcpus)
>>      } else {
>>          for (i = vm->def->vcpus - 1 ; i >= nvcpus ; i--) {
>>              /* Offline old CPU */
>> +            qemuDomainObjEnterMonitor(vm);
>>              rc = qemuMonitorSetCPU(priv->mon, i, 0);
>> +            qemuDomainObjExitMonitor(vm);
>>              if (rc == 0)
>>                  goto unsupported;
>>              if (rc < 0)
>> @@ -4559,18 +4563,21 @@ static int qemudDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus) {
>>      vm = virDomainFindByUUID(&driver->domains, dom->uuid);
>>      qemuDriverUnlock(driver);
>>  
>> +    if (qemuDomainObjBeginJob(vm) < 0)
>> +        goto cleanup;
>> +
>>      if (!vm) {
>>          char uuidstr[VIR_UUID_STRING_BUFLEN];
>>          virUUIDFormat(dom->uuid, uuidstr);
>>          qemuReportError(VIR_ERR_NO_DOMAIN,
>>                          _("no domain with matching uuid '%s'"), uuidstr);
>> -        goto cleanup;
>> +        goto endjob;
>>      }
>>  
>>      if (!virDomainObjIsActive(vm)) {
>>          qemuReportError(VIR_ERR_OPERATION_INVALID,
>>                           "%s", _("domain is not running"));
>> -        goto cleanup;
>> +        goto endjob;
>>      }
>>  
>>      if (!(type = virDomainVirtTypeToString(vm->def->virtType))) {
> 
>   ACK,
>   I was confused at first looking for a non-existent
> qemuDomainObjEndJob() call in qemudDomainHotplugVcpus() but it's
> actually one layer up in qemudDomainSetVcpus()

Thanks, I've pushed this now.

-- 
Chris Lalancette




More information about the libvir-list mailing list