[libvirt] [PATCH v2 04/14] libxl: support backend domain setting for disk and net devices

Jim Fehlig jfehlig at suse.com
Fri Jun 14 20:45:47 UTC 2013


Marek Marczykowski-Górecki wrote:
> This implement handling of <domain name=''/> parameter introduced in
> previous patch.
>
> Lookup on domain name (to get domain ID) requires libxlDriverPrivate
> object, so it must be passed down to libxlMakeDisk and libxlMakeNet from
> top level callers.
>
> Changes in v2:
>  - rebase on 1.0.6+
>  - fix indentation
>  - make libxl_name_to_domid switch more defensive
>
> Signed-off-by: Marek Marczykowski-Górecki <marmarek at invisiblethingslab.com>
> ---
>  src/libxl/libxl_conf.c   | 76 +++++++++++++++++++++++++++++++++++++++++++-----
>  src/libxl/libxl_conf.h   |  4 +--
>  src/libxl/libxl_driver.c | 51 +++++++++++++++++++-------------
>  3 files changed, 101 insertions(+), 30 deletions(-)
>
> diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
> index b9cb61e..623956e 100644
> --- a/src/libxl/libxl_conf.c
> +++ b/src/libxl/libxl_conf.c
> @@ -441,7 +441,9 @@ error:
>  }
>  
>  int
> -libxlMakeDisk(virDomainDiskDefPtr l_disk, libxl_device_disk *x_disk)
> +libxlMakeDisk(libxlDriverPrivatePtr driver,
>   

After looking at this again, I wonder if it is better to just pass the
libxl_ctx to libxlMakeDisk and libxlMakeNic.  All the callers already
have a libxl_ctx, making for a much smaller patch.  What do you think?

Regards,
Jim

> +              virDomainDiskDefPtr l_disk,
> +              libxl_device_disk *x_disk)
>  {
>      if (VIR_STRDUP(x_disk->pdev_path, l_disk->src) < 0)
>          return -1;
> @@ -509,11 +511,39 @@ libxlMakeDisk(virDomainDiskDefPtr l_disk, libxl_device_disk *x_disk)
>          return -1;
>      }
>  
> +    if (l_disk->domain_name) {
> +        uint32_t domid;
> +        /* Do not use virDomainObjListFindByName as it causes deadlock here -
> +         * we already have lock on this domain object, but
> +         * virDomainObjListFindByName will try to take it again.
> +         */
> +        switch (libxl_name_to_domid(driver->ctx, l_disk->domain_name, &domid)) {
> +            case 0:
> +                x_disk->backend_domid = domid;
> +                break;
> +            case ERROR_INVAL:
> +                virReportError(VIR_ERR_XML_DETAIL,
> +                        _("Backend domain '%s' does not exists for disk '%s'"),
> +                        l_disk->domain_name, l_disk->dst);
> +                return -1;
> +            case ERROR_NOMEM:
> +                virReportOOMError();
> +                return -1;
> +            default:
> +                virReportError(VIR_ERR_INTERNAL_ERROR,
> +                        _("Failed to get ID of domain '%s'"),
> +                        l_disk->domain_name);
> +                return -1;
> +        }
> +    }
> +
>      return 0;
>  }
>  
>  static int
> -libxlMakeDiskList(virDomainDefPtr def, libxl_domain_config *d_config)
> +libxlMakeDiskList(libxlDriverPrivatePtr driver,
> +                  virDomainDefPtr def,
> +                  libxl_domain_config *d_config)
>  {
>      virDomainDiskDefPtr *l_disks = def->disks;
>      int ndisks = def->ndisks;
> @@ -526,7 +556,7 @@ libxlMakeDiskList(virDomainDefPtr def, libxl_domain_config *d_config)
>      }
>  
>      for (i = 0; i < ndisks; i++) {
> -        if (libxlMakeDisk(l_disks[i], &x_disks[i]) < 0)
> +        if (libxlMakeDisk(driver, l_disks[i], &x_disks[i]) < 0)
>              goto error;
>      }
>  
> @@ -543,7 +573,9 @@ error:
>  }
>  
>  int
> -libxlMakeNic(virDomainNetDefPtr l_nic, libxl_device_nic *x_nic)
> +libxlMakeNic(libxlDriverPrivatePtr driver,
> +             virDomainNetDefPtr l_nic,
> +             libxl_device_nic *x_nic)
>  {
>      /* TODO: Where is mtu stored?
>       *
> @@ -579,11 +611,39 @@ libxlMakeNic(virDomainNetDefPtr l_nic, libxl_device_nic *x_nic)
>              return -1;
>      }
>  
> +    if (l_nic->domain_name) {
> +        uint32_t domid;
> +        /* Do not use virDomainObjListFindByName as it causes deadlock here -
> +         * we already have lock on this domain object, but
> +         * virDomainObjListFindByName will try to take it again.
> +         */
> +        switch (libxl_name_to_domid(driver->ctx, l_nic->domain_name, &domid)) {
> +            case 0:
> +                x_nic->backend_domid = domid;
> +                break;
> +            case ERROR_INVAL:
> +                virReportError(VIR_ERR_XML_DETAIL,
> +                        _("Backend domain '%s' does not exists for nic '%s'"),
> +                        l_nic->domain_name, l_nic->ifname);
> +                return -1;
> +            case ERROR_NOMEM:
> +                virReportOOMError();
> +                return -1;
> +            default:
> +                virReportError(VIR_ERR_INTERNAL_ERROR,
> +                        _("Failed to get ID of domain '%s'"),
> +                        l_nic->domain_name);
> +                return -1;
> +        }
> +    }
> +
>      return 0;
>  }
>  
>  static int
> -libxlMakeNicList(virDomainDefPtr def,  libxl_domain_config *d_config)
> +libxlMakeNicList(libxlDriverPrivatePtr driver,
> +                 virDomainDefPtr def,
> +                 libxl_domain_config *d_config)
>  {
>      virDomainNetDefPtr *l_nics = def->nets;
>      int nnics = def->nnets;
> @@ -598,7 +658,7 @@ libxlMakeNicList(virDomainDefPtr def,  libxl_domain_config *d_config)
>      for (i = 0; i < nnics; i++) {
>          x_nics[i].devid = i;
>  
> -        if (libxlMakeNic(l_nics[i], &x_nics[i]))
> +        if (libxlMakeNic(driver, l_nics[i], &x_nics[i]))
>              goto error;
>      }
>  
> @@ -756,11 +816,11 @@ libxlBuildDomainConfig(libxlDriverPrivatePtr driver,
>          return -1;
>      }
>  
> -    if (libxlMakeDiskList(def, d_config) < 0) {
> +    if (libxlMakeDiskList(driver, def, d_config) < 0) {
>          return -1;
>      }
>  
> -    if (libxlMakeNicList(def, d_config) < 0) {
> +    if (libxlMakeNicList(driver, def, d_config) < 0) {
>          return -1;
>      }
>  
> diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h
> index e8fb9c4..33126f3 100644
> --- a/src/libxl/libxl_conf.h
> +++ b/src/libxl/libxl_conf.h
> @@ -115,9 +115,9 @@ virCapsPtr
>  libxlMakeCapabilities(libxl_ctx *ctx);
>  
>  int
> -libxlMakeDisk(virDomainDiskDefPtr l_dev, libxl_device_disk *x_dev);
> +libxlMakeDisk(libxlDriverPrivatePtr driver, virDomainDiskDefPtr l_dev, libxl_device_disk *x_dev);
>  int
> -libxlMakeNic(virDomainNetDefPtr l_nic, libxl_device_nic *x_nic);
> +libxlMakeNic(libxlDriverPrivatePtr driver, virDomainNetDefPtr l_nic, libxl_device_nic *x_nic);
>  int
>  libxlMakeVfb(libxlDriverPrivatePtr driver,
>               virDomainGraphicsDefPtr l_vfb, libxl_device_vfb *x_vfb);
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index 0a0690d..df31001 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -3233,8 +3233,10 @@ libxlDomainUndefine(virDomainPtr dom)
>  }
>  
>  static int
> -libxlDomainChangeEjectableMedia(libxlDomainObjPrivatePtr priv,
> -                                virDomainObjPtr vm, virDomainDiskDefPtr disk)
> +libxlDomainChangeEjectableMedia(libxlDriverPrivatePtr driver,
> +                                libxlDomainObjPrivatePtr priv,
> +                                virDomainObjPtr vm,
> +                                virDomainDiskDefPtr disk)
>  {
>      virDomainDiskDefPtr origdisk = NULL;
>      libxl_device_disk x_disk;
> @@ -3263,7 +3265,7 @@ libxlDomainChangeEjectableMedia(libxlDomainObjPrivatePtr priv,
>          return -1;
>      }
>  
> -    if (libxlMakeDisk(disk, &x_disk) < 0)
> +    if (libxlMakeDisk(driver, disk, &x_disk) < 0)
>          goto cleanup;
>  
>      if ((ret = libxl_cdrom_insert(priv->ctx, vm->def->id, &x_disk, NULL)) < 0) {
> @@ -3288,8 +3290,10 @@ cleanup:
>  }
>  
>  static int
> -libxlDomainAttachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
> -                                virDomainObjPtr vm, virDomainDeviceDefPtr dev)
> +libxlDomainAttachDeviceDiskLive(libxlDriverPrivatePtr driver,
> +                                libxlDomainObjPrivatePtr priv,
> +                                virDomainObjPtr vm,
> +                                virDomainDeviceDefPtr dev)
>  {
>      virDomainDiskDefPtr l_disk = dev->data.disk;
>      libxl_device_disk x_disk;
> @@ -3297,7 +3301,7 @@ libxlDomainAttachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
>  
>      switch (l_disk->device)  {
>          case VIR_DOMAIN_DISK_DEVICE_CDROM:
> -            ret = libxlDomainChangeEjectableMedia(priv, vm, l_disk);
> +            ret = libxlDomainChangeEjectableMedia(driver, priv, vm, l_disk);
>              break;
>          case VIR_DOMAIN_DISK_DEVICE_DISK:
>              if (l_disk->bus == VIR_DOMAIN_DISK_BUS_XEN) {
> @@ -3318,7 +3322,7 @@ libxlDomainAttachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
>                      goto cleanup;
>                  }
>  
> -                if (libxlMakeDisk(l_disk, &x_disk) < 0)
> +                if (libxlMakeDisk(driver, l_disk, &x_disk) < 0)
>                      goto cleanup;
>  
>                  if ((ret = libxl_device_disk_add(priv->ctx, vm->def->id,
> @@ -3349,8 +3353,10 @@ cleanup:
>  }
>  
>  static int
> -libxlDomainDetachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
> -                                virDomainObjPtr vm, virDomainDeviceDefPtr dev)
> +libxlDomainDetachDeviceDiskLive(libxlDriverPrivatePtr driver,
> +                                libxlDomainObjPrivatePtr priv,
> +                                virDomainObjPtr vm,
> +                                virDomainDeviceDefPtr dev)
>  {
>      virDomainDiskDefPtr l_disk = NULL;
>      libxl_device_disk x_disk;
> @@ -3371,7 +3377,7 @@ libxlDomainDetachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
>  
>                  l_disk = vm->def->disks[i];
>  
> -                if (libxlMakeDisk(l_disk, &x_disk) < 0)
> +                if (libxlMakeDisk(driver, l_disk, &x_disk) < 0)
>                      goto cleanup;
>  
>                  if ((ret = libxl_device_disk_remove(priv->ctx, vm->def->id,
> @@ -3403,14 +3409,15 @@ cleanup:
>  }
>  
>  static int
> -libxlDomainAttachDeviceLive(libxlDomainObjPrivatePtr priv, virDomainObjPtr vm,
> +libxlDomainAttachDeviceLive(libxlDriverPrivatePtr driver,
> +                            libxlDomainObjPrivatePtr priv, virDomainObjPtr vm,
>                              virDomainDeviceDefPtr dev)
>  {
>      int ret = -1;
>  
>      switch (dev->type) {
>          case VIR_DOMAIN_DEVICE_DISK:
> -            ret = libxlDomainAttachDeviceDiskLive(priv, vm, dev);
> +            ret = libxlDomainAttachDeviceDiskLive(driver, priv, vm, dev);
>              if (!ret)
>                  dev->data.disk = NULL;
>              break;
> @@ -3455,14 +3462,16 @@ libxlDomainAttachDeviceConfig(virDomainDefPtr vmdef, virDomainDeviceDefPtr dev)
>  }
>  
>  static int
> -libxlDomainDetachDeviceLive(libxlDomainObjPrivatePtr priv, virDomainObjPtr vm,
> +libxlDomainDetachDeviceLive(libxlDriverPrivatePtr driver,
> +                            libxlDomainObjPrivatePtr priv,
> +                            virDomainObjPtr vm,
>                              virDomainDeviceDefPtr dev)
>  {
>      int ret = -1;
>  
>      switch (dev->type) {
>          case VIR_DOMAIN_DEVICE_DISK:
> -            ret = libxlDomainDetachDeviceDiskLive(priv, vm, dev);
> +            ret = libxlDomainDetachDeviceDiskLive(driver, priv, vm, dev);
>              break;
>  
>          default:
> @@ -3502,8 +3511,10 @@ libxlDomainDetachDeviceConfig(virDomainDefPtr vmdef, virDomainDeviceDefPtr dev)
>  }
>  
>  static int
> -libxlDomainUpdateDeviceLive(libxlDomainObjPrivatePtr priv,
> -                            virDomainObjPtr vm, virDomainDeviceDefPtr dev)
> +libxlDomainUpdateDeviceLive(libxlDriverPrivatePtr driver,
> +                            libxlDomainObjPrivatePtr priv,
> +                            virDomainObjPtr vm,
> +                            virDomainDeviceDefPtr dev)
>  {
>      virDomainDiskDefPtr disk;
>      int ret = -1;
> @@ -3513,7 +3524,7 @@ libxlDomainUpdateDeviceLive(libxlDomainObjPrivatePtr priv,
>              disk = dev->data.disk;
>              switch (disk->device) {
>                  case VIR_DOMAIN_DISK_DEVICE_CDROM:
> -                    ret = libxlDomainChangeEjectableMedia(priv, vm, disk);
> +                    ret = libxlDomainChangeEjectableMedia(driver, priv, vm, disk);
>                      if (ret == 0)
>                          dev->data.disk = NULL;
>                      break;
> @@ -3650,7 +3661,7 @@ libxlDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
>                                              VIR_DOMAIN_XML_INACTIVE)))
>              goto cleanup;
>  
> -        if ((ret = libxlDomainAttachDeviceLive(priv, vm, dev)) < 0)
> +        if ((ret = libxlDomainAttachDeviceLive(driver, priv, vm, dev)) < 0)
>              goto cleanup;
>  
>          /*
> @@ -3755,7 +3766,7 @@ libxlDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,
>                                              VIR_DOMAIN_XML_INACTIVE)))
>              goto cleanup;
>  
> -        if ((ret = libxlDomainDetachDeviceLive(priv, vm, dev)) < 0)
> +        if ((ret = libxlDomainDetachDeviceLive(driver, priv, vm, dev)) < 0)
>              goto cleanup;
>  
>          /*
> @@ -3860,7 +3871,7 @@ libxlDomainUpdateDeviceFlags(virDomainPtr dom, const char *xml,
>                                              VIR_DOMAIN_XML_INACTIVE)))
>              goto cleanup;
>  
> -        if ((ret = libxlDomainUpdateDeviceLive(priv, vm, dev)) < 0)
> +        if ((ret = libxlDomainUpdateDeviceLive(driver, priv, vm, dev)) < 0)
>              goto cleanup;
>  
>          /*
>   




More information about the libvir-list mailing list