[libvirt] [PATCH 2/2] qemu: Check for thread <=> memory alignment

Martin Kletzander mkletzan at redhat.com
Fri Jun 24 08:48:21 UTC 2016


On Thu, Jun 23, 2016 at 03:21:04PM -0400, John Ferlan wrote:
>
>
>On 06/22/2016 12:37 PM, Martin Kletzander wrote:
>> Some settings may be confusing and in case users use numad placement in
>> combination with static placement we could warn them as it might not be
>> wanted (but it's not forbidden).
>>
>> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1254402
>>
>> Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
>> ---
>>  src/qemu/qemu_driver.c  |   4 +-
>>  src/qemu/qemu_process.c | 107 +++++++++++++++++++++++++++++++++++++++++-------
>>  src/qemu/qemu_process.h |   6 ++-
>>  3 files changed, 99 insertions(+), 18 deletions(-)
>>
>
>Perhaps could have been two patches ... one to add the driver argument
>and the second to use it...
>

I wanted to do that actually, but I had to add ATTRIBUTE_UNUSED
everywhere and then remove it in the next patch which would not shorten
the patch at all, and in my opinion not even made it more readable.

>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index 931efae27dee..4cf9f0560092 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -4702,7 +4702,7 @@ qemuDomainHotplugAddVcpu(virQEMUDriverPtr driver,
>>          goto cleanup;
>>      }
>>
>> -    if (qemuProcessSetupVcpu(vm, vcpu) < 0)
>> +    if (qemuProcessSetupVcpu(driver, vm, vcpu) < 0)
>>          goto cleanup;
>>
>>      ret = 0;
>> @@ -5828,7 +5828,7 @@ qemuDomainHotplugAddIOThread(virQEMUDriverPtr driver,
>>
>>      iothrid->thread_id = new_iothreads[idx]->thread_id;
>>
>> -    if (qemuProcessSetupIOThread(vm, iothrid) < 0)
>> +    if (qemuProcessSetupIOThread(driver, vm, iothrid) < 0)
>>          goto cleanup;
>>
>>      ret = 0;
>> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
>> index d1247d2fd0f9..51709f8c9d58 100644
>> --- a/src/qemu/qemu_process.c
>> +++ b/src/qemu/qemu_process.c
>> @@ -2306,6 +2306,75 @@ qemuProcessSetLinkStates(virQEMUDriverPtr driver,
>>  }
>>
>>
>> +static int
>> +qemuProcessCheckCpusMemsAlignment(virQEMUDriverPtr driver,
>> +                                  virDomainObjPtr vm,
>> +                                  virBitmapPtr cpumask,
>> +                                  const char *mem_mask)
>> +{
>> +    int ret = -1;
>> +    int hostnodes = 0;
>> +    char *cpumask_str = NULL;
>> +    char *tmpmask_str = NULL;
>> +    char *mem_cpus_str = NULL;
>> +    virCapsPtr caps = NULL;
>> +    virBitmapPtr tmpmask = NULL;
>> +    virBitmapPtr mem_cpus = NULL;
>> +    virBitmapPtr mem_nodes = NULL;
>> +    virDomainNumatuneMemMode mem_mode;
>> +
>> +    if (virDomainNumatuneGetMode(vm->def->numa, -1, &mem_mode) != 0)
>> +        return 0;
>> +
>> +    if (mem_mode != VIR_DOMAIN_NUMATUNE_MEM_STRICT)
>> +        return 0;
>> +
>> +    if (!mem_mask || !cpumask)
>> +        return 0;
>> +
>> +    if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
>> +        goto cleanup;
>> +
>> +    if (!(tmpmask = virBitmapNewCopy(cpumask)))
>> +        goto cleanup;
>> +
>> +    if ((hostnodes = virNumaGetMaxNode()) < 0)
>> +        goto cleanup;
>> +
>> +    if (virBitmapParse(mem_mask, &mem_nodes, hostnodes) < 0)
>> +        goto cleanup;
>> +
>> +    if (!(mem_cpus = virCapabilitiesGetCpusForNodemask(caps, mem_nodes)))
>> +        goto cleanup;
>> +
>> +    virBitmapSubtract(tmpmask, mem_cpus);
>> +    if (!virBitmapIsAllClear(tmpmask)) {
>> +        if (!(cpumask_str = virBitmapFormat(cpumask)))
>> +            goto cleanup;
>> +
>> +        if (!(tmpmask_str = virBitmapFormat(tmpmask)))
>> +            goto cleanup;
>> +
>> +        if (!(mem_cpus_str = virBitmapFormat(mem_cpus)))
>> +            goto cleanup;
>> +
>> +        VIR_WARN("CPUs '%s' in cpumask '%s' might not have access to any NUMA "
>> +                 "node in memory's nodeset '%s' which consists of CPUs: '%s'.",
>> +                 tmpmask_str, cpumask_str, mem_mask, mem_cpus_str);
>
>Hopefully enough details ;-)
>
>> +    }
>> +
>> +    ret = 0;
>> + cleanup:
>> +    VIR_FREE(mem_cpus_str);
>> +    VIR_FREE(tmpmask_str);
>> +    VIR_FREE(cpumask_str);
>> +    virBitmapFree(mem_cpus);
>
>Coverity complains that mem_nodes is leaked.
>

Oh, good catch, I renamed them so many times (due to keeping part of the
bad naming and trying to be descriptive at the same time).

[...]

>> @@ -2390,6 +2460,10 @@ qemuProcessSetupPid(virDomainObjPtr vm,
>>          if ((period || quota) &&
>>              qemuSetupCgroupVcpuBW(cgroup, period, quota) < 0)
>>              goto cleanup;
>> +
>> +        if (qemuProcessCheckCpusMemsAlignment(driver, vm,
>> +                                              use_cpumask, mem_mask) < 0)
>> +            goto cleanup;
>
>It doesn't seem to matter that for an emulator virCgroupSetCpusetMems is
>not called yet... But I figured I'd ask to double check!
>

Yes, it will be set a bit later on, so the check still makes sense.

>ACK with the coverity error fixed as this seems reasonable to me.
>

Thanks, I'll wait for the consensus on the first one.

Martin

>John
>
-------------- 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/20160624/13ab4e0d/attachment-0001.sig>


More information about the libvir-list mailing list