[libvirt] [PATCH] fix size parameter in calls to numa_node_to_cpus

Dave Allan dallan at redhat.com
Fri Dec 12 16:48:14 UTC 2008


Jim Meyering wrote:
> Dave Allan <dallan at redhat.com> wrote:
>> I was getting the error:
>>
>> map size mismatch; abort
>>
>> when running the daemon-conf tests.
>>
>> I traced it to two places in which we were passing a parameter as a
>> number of bits to numa_node_to_cpus which expects a number of bytes
>> (see numa_node_to_cpus_compat in numa.h in the numactl source).
>>
>> The attached patch fixes the problem.
>>
>> Dave
>> diff --git a/src/qemu_conf.c b/src/qemu_conf.c
>> index e6c378f..7019c14 100644
>> --- a/src/qemu_conf.c
>> +++ b/src/qemu_conf.c
>> @@ -324,7 +324,7 @@ qemudCapsInitNUMA(virCapsPtr caps)
>>
>>      for (n = 0 ; n <= numa_max_node() ; n++) {
>>
>> -        if (numa_node_to_cpus(n, mask, MAX_CPUS_MASK_LEN) < 0)
>> +        if (numa_node_to_cpus(n, mask, MAX_CPUS_MASK_LEN / 8) < 0)
> 
> Hi Dave,
> 
> [Sorry I didn't catch this earlier. ]
> 
> With that patch, I am now seeing that out of memory message in
> "make check" test failures, e.g.,
> 
>     testing with corrupted config: min_workers
>     --- expected-err 2008-12-12 15:30:20.000000000 +0100
>     +++ err 2008-12-12 15:30:20.000000000 +0100
>     @@ -1,2 +1,5 @@
>     +map size mismatch; abort
>     +: Success
>     +umlStartup: out of memory
>      remoteReadConfigFile: in23.conf: min_workers: invalid type: got string; expected long
> 
> Since we're using NUMA_VERSION1_COMPATIBILITY mode (anyone know why?)
> 
>   #if HAVE_NUMACTL
>   #define NUMA_VERSION1_COMPATIBILITY 1
>   #include <numa.h>
>   #endif
> 
> numa_node_to_cpus expands to a call to numa_node_to_cpus_compat,
> which is defined in numa.h:
> 
>     static inline int numa_node_to_cpus_compat(int node, unsigned long *buffer,
>                                                             int buffer_len)
>     {
>             struct bitmask tmp;
> 
>             tmp.maskp = (unsigned long *)buffer;
>             tmp.size = buffer_len * 8;
>             return numa_node_to_cpus(node, &tmp);
>     }
> 
> 
> So the question is, what units to use in "tmp.size".
> To answer that, I looked above, also in numa.h at this:
> 
>     struct bitmask {
>             unsigned long size; /* number of bits in the map */
>             unsigned long *maskp;
>     };
> 
> And since MAX_CPUS_MASK_LEN is a buffer length, in bytes,
> 
>     from qemu_conf.c:
>     qemudCapsInitNUMA(virCapsPtr caps)
>     {
>     ...
>         if (VIR_ALLOC_N(mask, MAX_CPUS_MASK_LEN) < 0)
>             goto cleanup;
> 
> and tmp.size is measured in bits, we have to continue to use that
> MAX_CPUS_MASK_LEN parameter, and not divide it by 8:
> 
> So I propose this change:
> (with it, "make check" does pass once again)
> 
> From ceae19496cd60bd9a7b3527046b42e9f8460ae82 Mon Sep 17 00:00:00 2001
> From: Jim Meyering <meyering at redhat.com>
> Date: Fri, 12 Dec 2008 16:22:34 +0100
> Subject: [PATCH] Revert "fix bits/bytes memory request mismatches"
> 
> * src/qemu_conf.c (qemudCapsInitNUMA): Do pass MAX_CPUS_MASK_LEN
> as buffer length in call to numa_node_to_cpus.
> * src/uml_conf.c (umlCapsInitNUMA): Likewise.
> ---
>  src/qemu_conf.c |    2 +-
>  src/uml_conf.c  |    2 +-
>  2 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/src/qemu_conf.c b/src/qemu_conf.c
> index 59171e7..206fb0b 100644
> --- a/src/qemu_conf.c
> +++ b/src/qemu_conf.c
> @@ -324,7 +324,7 @@ qemudCapsInitNUMA(virCapsPtr caps)
> 
>      for (n = 0 ; n <= numa_max_node() ; n++) {
> 
> -        if (numa_node_to_cpus(n, mask, MAX_CPUS_MASK_LEN / 8) < 0)
> +        if (numa_node_to_cpus(n, mask, MAX_CPUS_MASK_LEN) < 0)
>              goto cleanup;
> 
>          for (ncpus = 0, i = 0 ; i < MAX_CPUS ; i++)
> diff --git a/src/uml_conf.c b/src/uml_conf.c
> index 3659c6b..7eb630d 100644
> --- a/src/uml_conf.c
> +++ b/src/uml_conf.c
> @@ -80,7 +80,7 @@ umlCapsInitNUMA(virCapsPtr caps)
> 
>      for (n = 0 ; n <= numa_max_node() ; n++) {
> 
> -        if (numa_node_to_cpus(n, mask, MAX_CPUS_MASK_LEN / 8) < 0)
> +        if (numa_node_to_cpus(n, mask, MAX_CPUS_MASK_LEN) < 0)
>              goto cleanup;
> 
>          for (ncpus = 0, i = 0 ; i < MAX_CPUS ; i++)
> --
> 1.6.0.4.1044.g77718

With the patch reverted, I am back to having the errors.  I'll track it 
down.  I must have a different numa version from you guys.

Dave




More information about the libvir-list mailing list