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

John Ferlan jferlan at redhat.com
Mon Apr 27 15:06:14 UTC 2015



On 04/27/2015 10:20 AM, Peter Krempa wrote:
> 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.
> 

Removed the "virBitmapEqual(def->cpumask, def->iothreadids[i]->cpumask)"
check.

John

>>  
>>          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
> 




More information about the libvir-list mailing list