[libvirt] [PATCH v2] libxl: report numa sibling distances on host capabilities

Wim Ten Have posted 1 patch 6 years, 11 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/20170509180629.12930-2-wim.ten.have@oracle.com
src/libxl/libxl_capabilities.c | 19 +++++++++++++++++--
1 file changed, 17 insertions(+), 2 deletions(-)
[libvirt] [PATCH v2] libxl: report numa sibling distances on host capabilities
Posted by Wim Ten Have 6 years, 11 months ago
From: Wim ten Have <wim.ten.have@oracle.com>

When running on a NUMA machine, populate the sibling node
and distance information using data supplied by Xen.

With locality distances information, under Xen, new host
capabilities would like:

    <topology>
      <cells num='4'>
        <cell id='0'>
          <memory unit='KiB'>263902380</memory>
          <distances>
            <sibling id='0' value='10'/>
            <sibling id='1' value='21'/>
          </distances>
          ...
        </cell>
        ...
      </cells>
      ...
    </topology>

Signed-off-by: Wim ten Have <wim.ten.have@oracle.com>
---
 src/libxl/libxl_capabilities.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/src/libxl/libxl_capabilities.c b/src/libxl/libxl_capabilities.c
index 839a2ee..e095920 100644
--- a/src/libxl/libxl_capabilities.c
+++ b/src/libxl/libxl_capabilities.c
@@ -247,8 +247,9 @@ libxlCapsInitNuma(libxl_ctx *ctx, virCapsPtr caps)
 {
     libxl_numainfo *numa_info = NULL;
     libxl_cputopology *cpu_topo = NULL;
-    int nr_nodes = 0, nr_cpus = 0;
+    int nr_nodes = 0, nr_cpus = 0, nr_siblings = 0;
     virCapsHostNUMACellCPUPtr *cpus = NULL;
+    virCapsHostNUMACellSiblingInfoPtr siblings = NULL;
     int *nr_cpus_node = NULL;
     size_t i;
     int ret = -1;
@@ -322,10 +323,23 @@ libxlCapsInitNuma(libxl_ctx *ctx, virCapsPtr caps)
         if (numa_info[i].size == LIBXL_NUMAINFO_INVALID_ENTRY)
             continue;
 
+        nr_siblings = numa_info[i].num_dists;
+        if (nr_siblings) {
+            size_t j;
+
+            if (VIR_ALLOC_N(siblings, nr_siblings) < 0)
+                goto cleanup;
+
+            for (j = 0; j < nr_siblings; j++) {
+                siblings[j].node = j;
+                siblings[j].distance = numa_info[i].dists[j];
+            }
+        }
+
         if (virCapabilitiesAddHostNUMACell(caps, i,
                                            numa_info[i].size / 1024,
                                            nr_cpus_node[i], cpus[i],
-                                           0, NULL,
+                                           nr_siblings, siblings,
                                            0, NULL) < 0) {
             virCapabilitiesClearHostNUMACellCPUTopology(cpus[i],
                                                         nr_cpus_node[i]);
@@ -343,6 +357,7 @@ libxlCapsInitNuma(libxl_ctx *ctx, virCapsPtr caps)
         for (i = 0; cpus && i < nr_nodes; i++)
             VIR_FREE(cpus[i]);
         virCapabilitiesFreeNUMAInfo(caps);
+        VIR_FREE(siblings);
     }
 
     VIR_FREE(cpus);
-- 
2.9.3

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2] libxl: report numa sibling distances on host capabilities
Posted by Joao Martins 6 years, 11 months ago
On 05/09/2017 07:06 PM, Wim Ten Have wrote:
> From: Wim ten Have <wim.ten.have@oracle.com>
> 
> When running on a NUMA machine, populate the sibling node
> and distance information using data supplied by Xen.
> 
> With locality distances information, under Xen, new host
> capabilities would like:
> 
>     <topology>
>       <cells num='4'>
>         <cell id='0'>
>           <memory unit='KiB'>263902380</memory>
>           <distances>
>             <sibling id='0' value='10'/>
>             <sibling id='1' value='21'/>
>           </distances>
>           ...
>         </cell>
>         ...
>       </cells>
>       ...
>     </topology>
> 
> Signed-off-by: Wim ten Have <wim.ten.have@oracle.com>

I had reviewed this internally so FWIW,

Reviewed-by: Joao Martins <joao.m.martins@oracle.com>

>  src/libxl/libxl_capabilities.c | 19 +++++++++++++++++--
>  1 file changed, 17 insertions(+), 2 deletions(-)
> 
> diff --git a/src/libxl/libxl_capabilities.c b/src/libxl/libxl_capabilities.c
> index 839a2ee..e095920 100644
> --- a/src/libxl/libxl_capabilities.c
> +++ b/src/libxl/libxl_capabilities.c
> @@ -247,8 +247,9 @@ libxlCapsInitNuma(libxl_ctx *ctx, virCapsPtr caps)
>  {
>      libxl_numainfo *numa_info = NULL;
>      libxl_cputopology *cpu_topo = NULL;
> -    int nr_nodes = 0, nr_cpus = 0;
> +    int nr_nodes = 0, nr_cpus = 0, nr_siblings = 0;
>      virCapsHostNUMACellCPUPtr *cpus = NULL;
> +    virCapsHostNUMACellSiblingInfoPtr siblings = NULL;
>      int *nr_cpus_node = NULL;
>      size_t i;
>      int ret = -1;
> @@ -322,10 +323,23 @@ libxlCapsInitNuma(libxl_ctx *ctx, virCapsPtr caps)
>          if (numa_info[i].size == LIBXL_NUMAINFO_INVALID_ENTRY)
>              continue;
>  
> +        nr_siblings = numa_info[i].num_dists;
> +        if (nr_siblings) {
> +            size_t j;
> +
> +            if (VIR_ALLOC_N(siblings, nr_siblings) < 0)
> +                goto cleanup;
> +
> +            for (j = 0; j < nr_siblings; j++) {
> +                siblings[j].node = j;
> +                siblings[j].distance = numa_info[i].dists[j];
> +            }
> +        }
> +
>          if (virCapabilitiesAddHostNUMACell(caps, i,
>                                             numa_info[i].size / 1024,
>                                             nr_cpus_node[i], cpus[i],
> -                                           0, NULL,
> +                                           nr_siblings, siblings,
>                                             0, NULL) < 0) {
>              virCapabilitiesClearHostNUMACellCPUTopology(cpus[i],
>                                                          nr_cpus_node[i]);
> @@ -343,6 +357,7 @@ libxlCapsInitNuma(libxl_ctx *ctx, virCapsPtr caps)
>          for (i = 0; cpus && i < nr_nodes; i++)
>              VIR_FREE(cpus[i]);
>          virCapabilitiesFreeNUMAInfo(caps);
> +        VIR_FREE(siblings);
>      }
>  
>      VIR_FREE(cpus);
> 

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2] libxl: report numa sibling distances on host capabilities
Posted by Jim Fehlig 6 years, 11 months ago
On 05/10/2017 05:38 AM, Joao Martins wrote:
> On 05/09/2017 07:06 PM, Wim Ten Have wrote:
>> From: Wim ten Have <wim.ten.have@oracle.com>
>>
>> When running on a NUMA machine, populate the sibling node
>> and distance information using data supplied by Xen.
>>
>> With locality distances information, under Xen, new host
>> capabilities would like:
>>
>>     <topology>
>>       <cells num='4'>
>>         <cell id='0'>
>>           <memory unit='KiB'>263902380</memory>
>>           <distances>
>>             <sibling id='0' value='10'/>
>>             <sibling id='1' value='21'/>
>>           </distances>
>>           ...
>>         </cell>
>>         ...
>>       </cells>
>>       ...
>>     </topology>
>>
>> Signed-off-by: Wim ten Have <wim.ten.have@oracle.com>
>
> I had reviewed this internally so FWIW,
>
> Reviewed-by: Joao Martins <joao.m.martins@oracle.com>

Thanks, looks good to me too. I've added our 'Reviewed-by' and pushed the patch.

Regards,
Jim

>
>>  src/libxl/libxl_capabilities.c | 19 +++++++++++++++++--
>>  1 file changed, 17 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/libxl/libxl_capabilities.c b/src/libxl/libxl_capabilities.c
>> index 839a2ee..e095920 100644
>> --- a/src/libxl/libxl_capabilities.c
>> +++ b/src/libxl/libxl_capabilities.c
>> @@ -247,8 +247,9 @@ libxlCapsInitNuma(libxl_ctx *ctx, virCapsPtr caps)
>>  {
>>      libxl_numainfo *numa_info = NULL;
>>      libxl_cputopology *cpu_topo = NULL;
>> -    int nr_nodes = 0, nr_cpus = 0;
>> +    int nr_nodes = 0, nr_cpus = 0, nr_siblings = 0;
>>      virCapsHostNUMACellCPUPtr *cpus = NULL;
>> +    virCapsHostNUMACellSiblingInfoPtr siblings = NULL;
>>      int *nr_cpus_node = NULL;
>>      size_t i;
>>      int ret = -1;
>> @@ -322,10 +323,23 @@ libxlCapsInitNuma(libxl_ctx *ctx, virCapsPtr caps)
>>          if (numa_info[i].size == LIBXL_NUMAINFO_INVALID_ENTRY)
>>              continue;
>>
>> +        nr_siblings = numa_info[i].num_dists;
>> +        if (nr_siblings) {
>> +            size_t j;
>> +
>> +            if (VIR_ALLOC_N(siblings, nr_siblings) < 0)
>> +                goto cleanup;
>> +
>> +            for (j = 0; j < nr_siblings; j++) {
>> +                siblings[j].node = j;
>> +                siblings[j].distance = numa_info[i].dists[j];
>> +            }
>> +        }
>> +
>>          if (virCapabilitiesAddHostNUMACell(caps, i,
>>                                             numa_info[i].size / 1024,
>>                                             nr_cpus_node[i], cpus[i],
>> -                                           0, NULL,
>> +                                           nr_siblings, siblings,
>>                                             0, NULL) < 0) {
>>              virCapabilitiesClearHostNUMACellCPUTopology(cpus[i],
>>                                                          nr_cpus_node[i]);
>> @@ -343,6 +357,7 @@ libxlCapsInitNuma(libxl_ctx *ctx, virCapsPtr caps)
>>          for (i = 0; cpus && i < nr_nodes; i++)
>>              VIR_FREE(cpus[i]);
>>          virCapabilitiesFreeNUMAInfo(caps);
>> +        VIR_FREE(siblings);
>>      }
>>
>>      VIR_FREE(cpus);
>>
>
> --
> libvir-list mailing list
> libvir-list@redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
>

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list