[libvirt] [PATCH 1/3] numad: Convert node list to cpumap before setting affinity

Osier Yang jyang at redhat.com
Mon Apr 16 10:11:03 UTC 2012


On 2012年04月16日 15:45, Daniel Veillard wrote:
> On Wed, Apr 11, 2012 at 10:40:32PM +0800, Osier Yang wrote:
>> Instead of returning a CPUs list, numad returns NUMA node
>> list instead, this patch is to convert the node list to
>> cpumap before affinity setting. Otherwise, the domain
>> processes will be pinned only to CPU[$numa_cell_num],
>> which will cause significiant performance losing.
>
>    s/losing/losses/
>
>> Also because numad will balance the affinity dynamically,
>> reflecting the cpuset from numad back doesn't make much
>> sense then, and it may just could produce confusion for
>> users' eyes. Thus the better way is not to reflect it back
>
>    confusion for the users.
>
>> to XML. And in this case, it's better to ignore the cpuset
>> when parsing XML.
>>
>> The codes to update the cpuset is removed in this patch
>> incidentally, and there will be a follow up patch to ignore
>> the manually specified "cpuset" if "placement" is "auto",
>> and document will be updated too.
>>
>> ---
>> The patch is tested on a NUMA box with 4 cells, 24 CPUs.
>> ---
>>   src/qemu/qemu_process.c |   33 ++++++++++++++++++++-------------
>>   1 files changed, 20 insertions(+), 13 deletions(-)
>>
>> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
>> index 481b4f3..0bf743b 100644
>> --- a/src/qemu/qemu_process.c
>> +++ b/src/qemu/qemu_process.c
>> @@ -1819,36 +1819,43 @@ qemuProcessInitCpuAffinity(struct qemud_driver *driver,
>>       }
>>
>>       if (vm->def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO) {
>> -        char *tmp_cpumask = NULL;
>>           char *nodeset = NULL;
>> +        char *nodemask = NULL;
>>
>>           nodeset = qemuGetNumadAdvice(vm->def);
>>           if (!nodeset)
>>               return -1;
>>
>> -        if (VIR_ALLOC_N(tmp_cpumask, VIR_DOMAIN_CPUMASK_LEN)<  0) {
>> +        if (VIR_ALLOC_N(nodemask, VIR_DOMAIN_CPUMASK_LEN)<  0) {
>>               virReportOOMError();
>>               return -1;
>>           }
>>
>> -        if (virDomainCpuSetParse(nodeset, 0, tmp_cpumask,
>> +        if (virDomainCpuSetParse(nodeset, 0, nodemask,
>>                                    VIR_DOMAIN_CPUMASK_LEN)<  0) {
>> -            VIR_FREE(tmp_cpumask);
>> +            VIR_FREE(nodemask);
>>               VIR_FREE(nodeset);
>>               return -1;
>>           }
>>
>> -        for (i = 0; i<  maxcpu&&  i<  VIR_DOMAIN_CPUMASK_LEN; i++) {
>> -            if (tmp_cpumask[i])
>> -                VIR_USE_CPU(cpumap, i);
>> +        /* numad returns the NUMA node list, convert it to cpumap */
>> +        int prev_total_ncpus = 0;
>> +        for (i = 0; i<  driver->caps->host.nnumaCell; i++) {
>> +            int j;
>> +            int cur_ncpus = driver->caps->host.numaCell[i]->ncpus;
>> +            if (nodemask[i]) {
>> +                for (j = prev_total_ncpus;
>> +                     j<  cur_ncpus + prev_total_ncpus&&
>> +                     j<  maxcpu&&
>> +                     j<  VIR_DOMAIN_CPUMASK_LEN;
>> +                     j++) {
>> +                    VIR_USE_CPU(cpumap, j);
>> +                }
>> +            }
>> +            prev_total_ncpus += cur_ncpus;
>>           }
>>
>> -        VIR_FREE(vm->def->cpumask);
>> -        vm->def->cpumask = tmp_cpumask;
>> -        if (virDomainSaveStatus(driver->caps, driver->stateDir, vm)<  0) {
>> -            VIR_WARN("Unable to save status on vm %s after state change",
>> -                     vm->def->name);
>> -        }
>> +        VIR_FREE(nodemask);
>>           VIR_FREE(nodeset);
>>       } else {
>>           if (vm->def->cpumask) {
>
>    ACK, but fix the commit message, and wait to see the feedback on 2/3
>    and 3/3 as this should not be commited in isolation
>
> Daniel

Thanks, pushed series with nits fixed. Also with conflicts with commit
354e6d4ed.

Regards,
Osier
>




More information about the libvir-list mailing list