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

Peter Krempa pkrempa at redhat.com
Mon Jan 5 15:54:11 UTC 2015


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?


> +
> +    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

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150105/706a81c3/attachment-0001.sig>


More information about the libvir-list mailing list