[libvirt] [PATCH 12/12] qemu: Implement RNG device hotunplug on live level

lhuang lhuang at redhat.com
Tue Jan 6 06:09:02 UTC 2015


On 01/05/2015 11:54 PM, Peter Krempa wrote:
> On 01/03/15 06:06, Luyao Huang wrote:
>> We have enough patches for hotunplug RNG device, maybe we can
>> implement live hotunplug of a RNG device.
>>
>> Signed-off-by: Luyao Huang <lhuang at redhat.com>
>> ---
>>   src/qemu/qemu_driver.c  |  4 +-
>>   src/qemu/qemu_hotplug.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++-
>>   src/qemu/qemu_hotplug.h |  4 +-
>>   3 files changed, 102 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index 2ad6e01..f7600f3 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -7017,6 +7017,9 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm,
>>       case VIR_DOMAIN_DEVICE_CHR:
>>           ret = qemuDomainDetachChrDevice(driver, vm, dev->data.chr);
>>           break;
>> +    case VIR_DOMAIN_DEVICE_RNG:
>> +        ret = qemuDomainDetachRNGDevice(driver, vm, dev->data.rng);
>> +        break;
>>       case VIR_DOMAIN_DEVICE_FS:
>>       case VIR_DOMAIN_DEVICE_INPUT:
>>       case VIR_DOMAIN_DEVICE_SOUND:
>> @@ -7027,7 +7030,6 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm,
>>       case VIR_DOMAIN_DEVICE_SMARTCARD:
>>       case VIR_DOMAIN_DEVICE_MEMBALLOON:
>>       case VIR_DOMAIN_DEVICE_NVRAM:
>> -    case VIR_DOMAIN_DEVICE_RNG:
>>       case VIR_DOMAIN_DEVICE_SHMEM:
>>       case VIR_DOMAIN_DEVICE_REDIRDEV:
>>       case VIR_DOMAIN_DEVICE_NONE:
>> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
>> index 7f1e612..d61e2a1 100644
>> --- a/src/qemu/qemu_hotplug.c
>> +++ b/src/qemu/qemu_hotplug.c
>> @@ -2921,6 +2921,52 @@ qemuDomainRemoveChrDevice(virQEMUDriverPtr driver,
>>       return ret;
>>   }
>>   
>> +static int
>> +qemuDomainRemoveRNGDevice(virQEMUDriverPtr driver,
>> +                          virDomainObjPtr vm,
>> +                          virDomainRNGDefPtr rng)
>> +{
>> +    virObjectEventPtr event;
>> +    char *charAlias = NULL;
>> +    char *objAlias = NULL;
>> +    qemuDomainObjPrivatePtr priv = vm->privateData;
>> +    int ret = -1;
>> +    int rc;
>> +
>> +    VIR_DEBUG("Removing RNG device %s from domain %p %s",
>> +              rng->info.alias, vm, vm->def->name);
>> +
>> +    if (virAsprintf(&objAlias, "obj%s", rng->info.alias) < 0)
>> +        goto cleanup;
>> +
>> +    if (virAsprintf(&charAlias, "char%s", rng->info.alias) < 0)
>> +        goto cleanup;
>> +
>> +    qemuDomainObjEnterMonitor(driver, vm);
>> +    rc = qemuMonitorDetachRNGDev(priv->mon, objAlias);
>> +    if (rc == 0 && rng->backend == VIR_DOMAIN_RNG_BACKEND_EGD)
>> +        ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias));
>> +    qemuDomainObjExitMonitor(driver, vm);
>> +
>> +    virDomainAuditRNG(vm, rng, NULL, "detach", rc == 0);
>> +
>> +    if (rc < 0)
>> +        goto cleanup;
>> +
>> +    event = virDomainEventDeviceRemovedNewFromObj(vm, rng->info.alias);
>> +    if (event)
>> +        qemuDomainEventQueue(driver, event);
>> +
>> +    qemuDomainRNGRemove(vm->def, rng);
>> +    qemuDomainReleaseDeviceAddress(vm, &rng->info, NULL);
>> +    virDomainRNGDefFree(rng);
>> +    ret = 0;
>> +
>> + cleanup:
>> +    VIR_FREE(charAlias);
>> +    VIR_FREE(objAlias);
>> +    return ret;
>> +}
>>   
>>   void
>>   qemuDomainRemoveDevice(virQEMUDriverPtr driver,
>> @@ -2944,6 +2990,9 @@ qemuDomainRemoveDevice(virQEMUDriverPtr driver,
>>       case VIR_DOMAIN_DEVICE_CHR:
>>           qemuDomainRemoveChrDevice(driver, vm, dev->data.chr);
>>           break;
>> +    case VIR_DOMAIN_DEVICE_RNG:
>> +        qemuDomainRemoveRNGDevice(driver, vm, dev->data.rng);
>> +        break;
>>   
>>       case VIR_DOMAIN_DEVICE_NONE:
>>       case VIR_DOMAIN_DEVICE_LEASE:
>> @@ -2958,7 +3007,6 @@ qemuDomainRemoveDevice(virQEMUDriverPtr driver,
>>       case VIR_DOMAIN_DEVICE_SMARTCARD:
>>       case VIR_DOMAIN_DEVICE_MEMBALLOON:
>>       case VIR_DOMAIN_DEVICE_NVRAM:
>> -    case VIR_DOMAIN_DEVICE_RNG:
>>       case VIR_DOMAIN_DEVICE_SHMEM:
>>       case VIR_DOMAIN_DEVICE_TPM:
>>       case VIR_DOMAIN_DEVICE_PANIC:
>> @@ -3830,3 +3878,50 @@ int qemuDomainDetachChrDevice(virQEMUDriverPtr driver,
>>       VIR_FREE(devstr);
>>       return ret;
>>   }
>> +
>> +int qemuDomainDetachRNGDevice(virQEMUDriverPtr driver,
>> +                              virDomainObjPtr vm,
>> +                              virDomainRNGDefPtr rng)
>> +{
>> +    int ret = -1;
>> +    qemuDomainObjPrivatePtr priv = vm->privateData;
>> +    virDomainDefPtr vmdef = vm->def;
>> +    virDomainRNGDefPtr tmpRNG;
>> +    int rc;
>> +
>> +    if (!(tmpRNG = virDomainRNGFind(vmdef, rng))) {
>> +        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
>> +                       _("device not present in domain configuration"));
>> +        return ret;
>> +    }
>> +
>> +    if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
>> +        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
>> +                       _("qemu does not support -device"));
>> +        return ret;
>> +    }
>> +
>> +    if (!tmpRNG->info.alias && qemuAssignDeviceRNGAlias(vmdef, tmpRNG, -1) < 0)
>> +        return ret;
>> +
>> +    sa_assert(tmpRNG->info.alias);
> Did coverity complain here?
I guess it will, this place just like the scene in commit e7e05801.
but i am not sure (i don't use coverity because the resource is very 
limit),
maybe we can remove it first, then wait for coverity test result.
>> +
>> +    qemuDomainMarkDeviceForRemoval(vm, &tmpRNG->info);
>> +
>> +    qemuDomainObjEnterMonitor(driver, vm);
>> +    if (qemuMonitorDelDevice(priv->mon, tmpRNG->info.alias) < 0) {
>> +        qemuDomainObjExitMonitor(driver, vm);
>> +        goto cleanup;
>> +    }
>> +    qemuDomainObjExitMonitor(driver, vm);
>> +
>> +    rc = qemuDomainWaitForDeviceRemoval(vm);
>> +    if (rc == 0 || rc == 1)
>> +        ret = qemuDomainRemoveRNGDevice(driver, vm, tmpRNG);
>> +    else
>> +        ret = 0;
>> +
>> + cleanup:
>> +    qemuDomainResetDeviceRemoval(vm);
>> +    return ret;
>> +}
>> diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h
>> index fbf009f..4f7756b 100644
>> --- a/src/qemu/qemu_hotplug.h
>> +++ b/src/qemu/qemu_hotplug.h
>> @@ -101,7 +101,9 @@ int qemuDomainDetachChrDevice(virQEMUDriverPtr driver,
>>   int qemuDomainAttachRNGDevice(virQEMUDriverPtr driver,
>>                                 virDomainObjPtr vm,
>>                                 virDomainRNGDefPtr rng);
>> -
>> +int qemuDomainDetachRNGDevice(virQEMUDriverPtr driver,
>> +                              virDomainObjPtr vm,
>> +                              virDomainRNGDefPtr rng);
>>   
>>   int
>>   qemuDomainChrInsert(virDomainDefPtr vmdef,
>>
> Looks good for now.
>
> Peter
>
Luyao
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150106/8b10dbd3/attachment-0001.htm>


More information about the libvir-list mailing list