[libvirt] [PATCH v2 5/9] qemu: Use domain iothreadids to populate iothreadpids

Peter Krempa pkrempa at redhat.com
Mon Apr 13 13:02:44 UTC 2015


On Fri, Apr 10, 2015 at 17:36:23 -0400, John Ferlan wrote:
> Rather than use the default numbering scheme of 1..number of iothreads
> defined for the domain, use the iothreadid's list for the iothread_id and
> possibly augmenting the alias using the iothreadsid name.
> 
> This also requires adjusting the iothreadpids structure to include room for
> the iothread_id and name (if found in the alias, thus iothreadids entry).
> 
> The iothreadpids will keep track of the live system, while iothreadids will
> be used for the configuration.
> 
> Now that the iothreadpids list keeps track of the iothread_id's, these
> can be used in place of the many places where a for loop would "know"
> that the ID was "+ 1" from the array element.
> 
> The new tests ensure usage of the <iothreadid> values for an exact number
> of iothreads, the usage of a smaller number of <iothreadid> values than
> iothreads that exist (and usage of the default numbering scheme), and the
> usage of the optional name value to provide the alias for the IOThread.
> 
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
>  src/qemu/qemu_cgroup.c                             |  13 ++-
>  src/qemu/qemu_command.c                            | 104 ++++++++++++++++++---
>  src/qemu/qemu_command.h                            |   4 +
>  src/qemu/qemu_domain.c                             |  40 +++++++-
>  src/qemu/qemu_domain.h                             |   2 +
>  src/qemu/qemu_driver.c                             |  35 ++++---
>  src/qemu/qemu_process.c                            |  29 +++++-
>  .../qemuxml2argv-iothreads-ids-partial.args        |  10 ++
>  .../qemuxml2argv-iothreads-ids-partial.xml         |  33 +++++++
>  .../qemuxml2argv-iothreads-ids.args                |   8 ++
>  .../qemuxml2argv-iothreads-ids.xml                 |  33 +++++++
>  .../qemuxml2argv-iothreads-name.args               |  17 ++++
>  .../qemuxml2argv-iothreads-name.xml                |  44 +++++++++
>  tests/qemuxml2argvtest.c                           |   4 +
>  tests/qemuxml2xmltest.c                            |   3 +
>  15 files changed, 339 insertions(+), 40 deletions(-)
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-iothreads-ids-partial.args
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-iothreads-ids-partial.xml
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-iothreads-ids.args
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-iothreads-ids.xml
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-iothreads-name.args
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-iothreads-name.xml
> 

...

> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index e7e0937..68c85e2 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -678,6 +678,57 @@ qemuOpenVhostNet(virDomainDefPtr def,
>  }
>  
>  int
> +qemuDomainParseIOThreadAlias(char *alias,
> +                             unsigned int *iothread_id,
> +                             char **name)
> +{
> +    unsigned int idval;
> +    char *idname = NULL;
> +
> +    /* IOThread's alias is either "iothread#" or "name_iothread#", where

I don't really think we should put any user-configurable stuff into the
alias. We can keep the name internally and use it for lookup but using
it in the alias can be tricky.

If it would be part of the alias, the name definitely should not start
with the user configurable part.

> +     * name is a user definable prefix for the alias and the # is the
> +     * iothreadids iothread_id provided in XML or generated during
> +     * post parse processing
> +     */
> +    if (STRPREFIX(alias, "iothread")) {
> +        if (virStrToLong_ui(alias + strlen("iothread"),
> +                            NULL, 10, &idval) < 0) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("failed to find iothread id for '%s'"),
> +                           alias);
> +            return -1;
> +        }
> +        /* Default - no need to do anything with name */
> +    } else {
> +        char *spot = strstr(alias, "_iothread");
> +
> +        if (!spot) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("Malformed IOThreads alias '%s'"),
> +                           alias);
> +            return -1;
> +        }
> +
> +        /* Pick off the user defined name from the front */
> +        if (VIR_STRNDUP(idname, alias, spot - alias) < 0)
> +            return -1;
> +
> +        if (virStrToLong_ui(alias + strlen(idname) + strlen("_iothread"),
> +                            NULL, 10, &idval) < 0) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("failed to find iothread id for '%s'"),
> +                           alias);
> +            VIR_FREE(idname);
> +            return -1;
> +        }
> +    }
> +
> +    *iothread_id = idval;
> +    *name = idname;
> +    return 0;
> +}
> +
> +int
>  qemuNetworkPrepareDevices(virDomainDefPtr def)
>  {
>      int ret = -1;
> @@ -3985,11 +4036,11 @@ qemuCheckIOThreads(virDomainDefPtr def,
>          return false;
>      }
>  
> -    /* Value larger than iothreads available? */
> -    if (disk->iothread > def->iothreads) {
> +    /* Can we find the disk iothread in the iothreadid list? */

Comment is not necessary.

> +    if (!virDomainIOThreadIDFind(def, disk->iothread)) {
>          virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> -                       _("Disk iothread '%u' invalid only %u IOThreads"),
> -                       disk->iothread, def->iothreads);
> +                       _("Disk iothread '%u' not defined"),
> +                       disk->iothread);
>          return false;
>      }
>  
> @@ -4005,6 +4056,8 @@ qemuBuildDriveDevStr(virDomainDefPtr def,
>  {
>      virBuffer opt = VIR_BUFFER_INITIALIZER;
>      const char *bus = virDomainDiskQEMUBusTypeToString(disk->bus);
> +    virDomainIOThreadIDDefPtr iothrid = NULL;
> +    char *disk_iothr_alias = NULL;
>      int controllerModel;
>  
>      if (virDomainDiskDefDstDuplicates(def))
> @@ -4194,10 +4247,27 @@ qemuBuildDriveDevStr(virDomainDefPtr def,
>          }
>          break;
>      case VIR_DOMAIN_DISK_BUS_VIRTIO:
> +        if (disk->iothread) {
> +            if (!(iothrid = virDomainIOThreadIDFind(def, disk->iothread))) {
> +                virReportError(VIR_ERR_XML_ERROR,
> +                               _("cannot find iothread '%u' in iothreadids"),
> +                               disk->iothread);
> +                goto error;
> +            }
> +            if (iothrid->name) {
> +                if (virAsprintf(&disk_iothr_alias, "%s_iothread%u",
> +                                iothrid->name, iothrid->iothread_id) < 0)

As said, we should not put the strings into qemu... or definitely not at
the beginning.

> +                    goto error;
> +            } else {
> +                if (virAsprintf(&disk_iothr_alias, "iothread%u",
> +                                iothrid->iothread_id) < 0)
> +                    goto error;
> +            }
> +        }
>          if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) {
>              virBufferAddLit(&opt, "virtio-blk-ccw");
> -            if (disk->iothread)
> -                virBufferAsprintf(&opt, ",iothread=iothread%u", disk->iothread);
> +            if (disk_iothr_alias)
> +                virBufferAsprintf(&opt, ",iothread=%s", disk_iothr_alias);
>          } else if (disk->info.type ==
>                     VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390) {
>              virBufferAddLit(&opt, "virtio-blk-s390");

Peter
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150413/74786b41/attachment-0001.sig>


More information about the libvir-list mailing list