[libvirt] [PATCH 4/4] qemu: add plumbing for persistent device changes

Wen Congyang wency at cn.fujitsu.com
Mon Apr 18 04:59:56 UTC 2011


At 04/16/2011 11:28 PM, Eric Blake Write:
> There's still work to add persistent callback functions, and to
> make sure this all works, but this demonstrates how having a
> single function makes it easy to support flags for all three
> types of device modifications.
> 
> * src/qemu/qemu_driver.c (qemuDomainModifyDeviceFlags): Add
> parameter, and support VIR_DOMAIN_DEVICE_MODIFY_CURRENT.
> (qemuDomainAttachDeviceFlags, qemuDomainUpdateDeviceFlags)
> (qemuDomainDetachDeviceFlags): Update callers.
> ---
> 
> After this point, we can use Kame's patch 1/4 to add in the
> persistent function callbacks (with slight tweaks to their
> signatures), and 2/4 to make it easier to to temporary
> modifications to a config:
> 
> if (flags & CONFIG) {
>    create temporary def
>    call persistent callback
> }
> if (flags & LIVE) {
>    call live callback
> }
> if (no errors)
>    commit temporary def and live state changes, as needed
> 
> But with the benefit that CURRENT support is now provided.
> 
>  src/qemu/qemu_driver.c |   47 +++++++++++++++++++++++++++++++++++------------
>  1 files changed, 35 insertions(+), 12 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 4f0a057..8c978be 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -4031,7 +4031,8 @@ cleanup:
>  static int
>  qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml,
>                              unsigned int flags,
> -                            qemuDomainModifyDeviceCallback cb)
> +                            qemuDomainModifyDeviceCallback live,
> +                            qemuDomainModifyDeviceCallback persistent)
>  {
>      struct qemud_driver *driver = dom->conn->privateData;
>      virDomainObjPtr vm;
> @@ -4039,12 +4040,7 @@ qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml,
>      virBitmapPtr qemuCaps = NULL;
>      int ret = -1;
>      bool force = (flags & VIR_DOMAIN_DEVICE_MODIFY_FORCE) != 0;
> -
> -    if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
> -        qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
> -                        _("cannot modify domain persistent configuration"));
> -        return -1;
> -    }
> +    bool active;
> 
>      qemuDriverLock(driver);
>      vm = virDomainFindByUUID(&driver->domains, dom->uuid);
> @@ -4059,12 +4055,32 @@ qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml,
>      if (qemuDomainObjBeginJobWithDriver(driver, vm) < 0)
>          goto cleanup;
> 
> -    if (!virDomainObjIsActive(vm)) {
> +    active = virDomainObjIsActive(vm);
> +
> +    if ((flags & (VIR_DOMAIN_DEVICE_MODIFY_LIVE
> +                  | VIR_DOMAIN_DEVICE_MODIFY_CONFIG)) == 0)
> +        flags |= (active ? VIR_DOMAIN_DEVICE_MODIFY_LIVE
> +                  : VIR_DOMAIN_DEVICE_MODIFY_CONFIG);
> +
> +    if ((flags & VIR_DOMAIN_DEVICE_MODIFY_LIVE) && !active) {
>          qemuReportError(VIR_ERR_OPERATION_INVALID,
>                          "%s", _("cannot modify device on inactive domain"));
>          goto endjob;
>      }
> 
> +    if ((flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) && !vm->persistent) {
> +        qemuReportError(VIR_ERR_OPERATION_INVALID,
> +                        "%s", _("cannot modify device on transient domain"));
> +        goto endjob;
> +    }
> +
> +    /* XXX add persistent support */
> +    if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {

kamezawa-san is writing patch to support persistent device modification(attach/detach)
and Hu Tao is writing patch to support persistent device modification(update).

We can detect whether persistent device modification is supported like this:
if ((flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG)  && !persistent) {

So the caller can pass NULL when persistent device modification is not supported safely.

> +        qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
> +                        _("cannot modify domain persistent configuration"));
> +        return -1;

We should goto endjob to do some cleanup.

> +    }
> +
>      dev = virDomainDeviceDefParse(driver->caps, vm->def, xml,
>                                    VIR_DOMAIN_XML_INACTIVE);
>      if (dev == NULL)
> @@ -4075,7 +4091,11 @@ qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml,
>                                     &qemuCaps) < 0)
>          goto endjob;
> 
> -    ret = (cb)(dom, driver, vm, dev, qemuCaps, force);
> +    ret = 0;
> +    if (flags & VIR_DOMAIN_DEVICE_MODIFY_LIVE)
> +        ret = (live)(dom, driver, vm, dev, qemuCaps, force);
> +    if (ret == 0 && (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG))
> +        ret = (persistent)(dom, driver, vm, dev, qemuCaps, force);
> 
>      /* update domain status forcibly because the domain status may be changed
>       * even if we attach the device failed. For example, a new controller may
> @@ -4105,7 +4125,8 @@ qemuDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
>      virCheckFlags(VIR_DOMAIN_DEVICE_MODIFY_LIVE |
>                    VIR_DOMAIN_DEVICE_MODIFY_CONFIG, -1);
>      return qemuDomainModifyDeviceFlags(dom, xml, flags,
> -                                       qemuDomainAttachDeviceLive);
> +                                       qemuDomainAttachDeviceLive,
> +                                       NULL);
>  }
> 
>  static int
> @@ -4124,7 +4145,8 @@ qemuDomainUpdateDeviceFlags(virDomainPtr dom, const char *xml,
>                    VIR_DOMAIN_DEVICE_MODIFY_CONFIG |
>                    VIR_DOMAIN_DEVICE_MODIFY_FORCE, -1);
>      return qemuDomainModifyDeviceFlags(dom, xml, flags,
> -                                       qemuDomainUpdateDeviceLive);
> +                                       qemuDomainUpdateDeviceLive,
> +                                       NULL);
>  }
> 
> 
> @@ -4135,7 +4157,8 @@ qemuDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,
>      virCheckFlags(VIR_DOMAIN_DEVICE_MODIFY_LIVE |
>                    VIR_DOMAIN_DEVICE_MODIFY_CONFIG, -1);
>      return qemuDomainModifyDeviceFlags(dom, xml, flags,
> -                                       qemuDomainDetachDeviceLive);
> +                                       qemuDomainDetachDeviceLive,
> +                                       NULL);
>  }
> 
>  static int

The other modification and the other 3 patches look good to me.




More information about the libvir-list mailing list