[libvirt] [PATCH 4/4] xen: Fix virDomain{At,De}tachDevice

Jim Fehlig jfehlig at novell.com
Tue Oct 5 22:22:50 UTC 2010


Jiri Denemark wrote:
> According to API documentation virDomain{At,De}tachDevice calls are
> supposed to only work on active guests for device hotplug. For anything
> beyond that, their *Flags variants have to be used.
>
> Despite the variant which was acked on libvirt mailing list
> (https://www.redhat.com/archives/libvir-list/2010-January/msg00385.html)
> commit ed9c14a7ef86d7a45a6d57cbfee5410fca428633 (by Jim Fehlig)
> introduced automagic behavior of these API calls for xen driver. Since
> January, these calls always change persistent configuration of a guest
> and if the guest is currently active, they also hot(un)plug the device.
>
> That change didn't follow API documentation and also broke device
> hot(un)plug for older xend implementations which do not support changing
> persistent configuration of a guest and hot(un)plugging in one step.
>   

I only tested as far back as Xen 3.2.1, which is unfortunately still
xendConfigVersion 4.  This (nearly useless) version value was last
bumped by danpb  over 3 years ago -
http://xenbits.xensource.com/xen-unstable.hg?rev/887fa548f650 :-(.

> This patch should not break anything for active guests. On the other
> hand, changing inactive guests is not supported any more.
> ---
>  src/xen/xen_driver.c |   24 ++++++++++++++++++------
>  1 files changed, 18 insertions(+), 6 deletions(-)
>
> diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
> index 56ba41b..e9eeab9 100644
> --- a/src/xen/xen_driver.c
> +++ b/src/xen/xen_driver.c
> @@ -1437,10 +1437,16 @@ xenUnifiedDomainAttachDevice (virDomainPtr dom, const char *xml)
>  {
>      GET_PRIVATE(dom->conn);
>      int i;
> -    unsigned int flags = VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
> +    unsigned int flags = VIR_DOMAIN_DEVICE_MODIFY_LIVE;
>  
> -    if (dom->id >= 0)
> -        flags |= VIR_DOMAIN_DEVICE_MODIFY_LIVE;
> +    /*
> +     * HACK: xend with xendConfigVersion >= 3 does not support changing live
> +     * config without touching persistent config, we add the extra flag here
> +     * to make this API work
> +     */
> +    if (priv->opened[XEN_UNIFIED_XEND_OFFSET] &&
> +        priv->xendConfigVersion >= 3)
> +        flags |= VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
>  
>      for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
>          if (priv->opened[i] && drivers[i]->domainAttachDeviceFlags &&
> @@ -1470,10 +1476,16 @@ xenUnifiedDomainDetachDevice (virDomainPtr dom, const char *xml)
>  {
>      GET_PRIVATE(dom->conn);
>      int i;
> -    unsigned int flags = VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
> +    unsigned int flags = VIR_DOMAIN_DEVICE_MODIFY_LIVE;
>  
> -    if (dom->id >= 0)
> -        flags |= VIR_DOMAIN_DEVICE_MODIFY_LIVE;
> +    /*
> +     * HACK: xend with xendConfigVersion >= 3 does not support changing live
> +     * config without touching persistent config, we add the extra flag here
> +     * to make this API work
> +     */
> +    if (priv->opened[XEN_UNIFIED_XEND_OFFSET] &&
> +        priv->xendConfigVersion >= 3)
> +        flags |= VIR_DOMAIN_DEVICE_MODIFY_CONFIG;
>  
>      for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
>          if (priv->opened[i] && drivers[i]->domainDetachDeviceFlags &&
>   

ACK.  I have tested this on Xen 4.0.0 setup, both active and inactive pv
and hvm domUs.

Regards,
Jim




More information about the libvir-list mailing list