[libvirt] [PATCH v5 04/10] Move iothreadspin information into iothreadids

Peter Krempa pkrempa at redhat.com
Mon Apr 27 14:20:38 UTC 2015


On Fri, Apr 24, 2015 at 12:05:56 -0400, John Ferlan wrote:
> Remove the iothreadspin array from cputune and replace with a cpumask
> to be stored in the iothreadids list.
> 
> Adjust the test output because our printing goes in order of the iothreadids
> list now.
> 
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
>  docs/formatdomain.html.in                          |  10 +-
>  src/conf/domain_conf.c                             | 112 ++++++++++-----------
>  src/conf/domain_conf.h                             |   3 +-
>  src/qemu/qemu_cgroup.c                             |  16 +--
>  src/qemu/qemu_driver.c                             |  75 ++++----------
>  src/qemu/qemu_process.c                            |  10 +-
>  .../qemuxml2xmlout-cputune-iothreads.xml           |   2 +-
>  7 files changed, 86 insertions(+), 142 deletions(-)
> 

...

> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index ddb0d83..129908d 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c

...

> @@ -20862,16 +20859,19 @@ virDomainDefFormatInternal(virDomainDefPtr def,
>          VIR_FREE(cpumask);
>      }
>  
> -    for (i = 0; i < def->cputune.niothreadspin; i++) {
> +    for (i = 0; i < def->niothreadids; i++) {
>          char *cpumask;
> -        /* Ignore the iothreadpin which inherit from "cpuset of "<vcpu>." */
> -        if (virBitmapEqual(def->cpumask, def->cputune.iothreadspin[i]->cpumask))
> +
> +        /* Ignore iothreadids with no cpumask or a cpumask that
> +         * inherits from "cpuset of "<vcpu>." */
> +        if (!def->iothreadids[i]->cpumask ||
> +            virBitmapEqual(def->cpumask, def->iothreadids[i]->cpumask))
>              continue;

I still think that comparing the cpu map with the default cpumap is
wrong. It should not be copied there in the first place. Additionally if
the user specifies the same CPU map as the default one, we should not
remove it.

>  
>          virBufferAsprintf(buf, "<iothreadpin iothread='%u' ",
> -                          def->cputune.iothreadspin[i]->id);
> +                          def->iothreadids[i]->iothread_id);
>  
> -        if (!(cpumask = virBitmapFormat(def->cputune.iothreadspin[i]->cpumask)))
> +        if (!(cpumask = virBitmapFormat(def->iothreadids[i]->cpumask)))
>              goto error;
>  
>          virBufferAsprintf(buf, "cpuset='%s'/>\n", cpumask);

...

> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 330ffdf..1fac0b8 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c

...

> @@ -6145,31 +6114,23 @@ qemuDomainPinIOThread(virDomainPtr dom,
>      }
>  
>      if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
> +        virDomainIOThreadIDDefPtr iothrid;
> +        virBitmapPtr cpumask;
> +
>          /* Coverity didn't realize that targetDef must be set if we got here. */
>          sa_assert(persistentDef);
>  
> -        if (iothread_id > persistentDef->iothreads) {
> +        if (!(iothrid = virDomainIOThreadIDFind(persistentDef, iothread_id))) {
>              virReportError(VIR_ERR_INVALID_ARG,
> -                           _("iothread value out of range %d > %d"),
> -                           iothread_id, persistentDef->iothreads);
> +                           _("iothreadid %d not found"), iothread_id);
>              goto endjob;
>          }
>  
> -        if (!persistentDef->cputune.iothreadspin) {
> -            if (VIR_ALLOC(persistentDef->cputune.iothreadspin) < 0)
> -                goto endjob;
> -            persistentDef->cputune.niothreadspin = 0;
> -        }
> -        if (virDomainPinAdd(&persistentDef->cputune.iothreadspin,
> -                            &persistentDef->cputune.niothreadspin,
> -                            cpumap,
> -                            maplen,
> -                            iothread_id) < 0) {
> -            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                           _("failed to update or add iothreadspin xml "
> -                             "of a persistent domain"));
> +        if (!(cpumask = virBitmapNewData(cpumap, maplen)))
>              goto endjob;
> -        }
> +
> +        virBitmapFree(iothrid->cpumask);
> +        iothrid->cpumask = cpumask;

Much nicer!

>  
>          ret = virDomainSaveConfig(cfg->configDir, persistentDef);
>          goto endjob;

The code is much cleaner now. The cpu threads/pinning implementation is
horrible in this aspect.

ACK with the bitmap comparison removed.

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/20150427/529dfb30/attachment-0001.sig>


More information about the libvir-list mailing list