[libvirt] [PATCH] conf: fix populating of fake NUMA in multi-node hosts

Michal Prívozník mprivozn at redhat.com
Wed Dec 18 14:19:34 UTC 2019


On 12/18/19 12:58 PM, Daniel P. Berrangé wrote:
> If the host OS doesn't have NUMA present, we fallback to
> populating fake NUMA info and the code thus assumes only a
> single NUMA node.
> 
> Unfortunately we also fallback to fake NUMA if numactl-devel
> was not present, and in this case we can still have multiple
> NUMA nodes. In this case we create all CPUs, but only the
> CPUs in the first node have any data filled in, resulting in
> capabilities like:
> 
>     <topology>
>       <cells num='1'>
>         <cell id='0'>
>           <memory unit='KiB'>15977572</memory>
>           <cpus num='48'>
>             <cpu id='0' socket_id='0' core_id='0' siblings='0'/>
>             <cpu id='1' socket_id='0' core_id='0' siblings='1'/>
>             <cpu id='2' socket_id='0' core_id='1' siblings='2'/>
>             <cpu id='3' socket_id='0' core_id='1' siblings='3'/>
>             <cpu id='4' socket_id='0' core_id='2' siblings='4'/>
>             <cpu id='5' socket_id='0' core_id='2' siblings='5'/>
>             <cpu id='6' socket_id='0' core_id='3' siblings='6'/>
>             <cpu id='7' socket_id='0' core_id='3' siblings='7'/>
>             <cpu id='8' socket_id='0' core_id='4' siblings='8'/>
>             <cpu id='9' socket_id='0' core_id='4' siblings='9'/>
>             <cpu id='10' socket_id='0' core_id='5' siblings='10'/>
>             <cpu id='11' socket_id='0' core_id='5' siblings='11'/>
>             <cpu id='0'/>
>             <cpu id='0'/>
>             <cpu id='0'/>
>             <cpu id='0'/>
>             <cpu id='0'/>
>             <cpu id='0'/>
>             <cpu id='0'/>
>             <cpu id='0'/>
>             <cpu id='0'/>
>             <cpu id='0'/>
>             <cpu id='0'/>
>           </cpus>
>         </cell>
>       </cells>
>     </topology>
> 
> With this new code we get something slightly less broken
> 
>     <topology>
>       <cells num='4'>
>         <cell id='0'>
>           <memory unit='KiB'>15977572</memory>
>           <cpus num='12'>
>             <cpu id='0' socket_id='0' core_id='0' siblings='0-1'/>
>             <cpu id='1' socket_id='0' core_id='0' siblings='0-1'/>
>             <cpu id='2' socket_id='0' core_id='1' siblings='2-3'/>
>             <cpu id='3' socket_id='0' core_id='1' siblings='2-3'/>
>             <cpu id='4' socket_id='0' core_id='2' siblings='4-5'/>
>             <cpu id='5' socket_id='0' core_id='2' siblings='4-5'/>
>             <cpu id='6' socket_id='0' core_id='3' siblings='6-7'/>
>             <cpu id='7' socket_id='0' core_id='3' siblings='6-7'/>
>             <cpu id='8' socket_id='0' core_id='4' siblings='8-9'/>
>             <cpu id='9' socket_id='0' core_id='4' siblings='8-9'/>
>             <cpu id='10' socket_id='0' core_id='5' siblings='10-11'/>
>             <cpu id='11' socket_id='0' core_id='5' siblings='10-11'/>
>           </cpus>
>         </cell>
>         <cell id='0'>
>           <memory unit='KiB'>15977572</memory>
>           <cpus num='12'>
>             <cpu id='12' socket_id='0' core_id='0' siblings='12-13'/>
>             <cpu id='13' socket_id='0' core_id='0' siblings='12-13'/>
>             <cpu id='14' socket_id='0' core_id='1' siblings='14-15'/>
>             <cpu id='15' socket_id='0' core_id='1' siblings='14-15'/>
>             <cpu id='16' socket_id='0' core_id='2' siblings='16-17'/>
>             <cpu id='17' socket_id='0' core_id='2' siblings='16-17'/>
>             <cpu id='18' socket_id='0' core_id='3' siblings='18-19'/>
>             <cpu id='19' socket_id='0' core_id='3' siblings='18-19'/>
>             <cpu id='20' socket_id='0' core_id='4' siblings='20-21'/>
>             <cpu id='21' socket_id='0' core_id='4' siblings='20-21'/>
>             <cpu id='22' socket_id='0' core_id='5' siblings='22-23'/>
>             <cpu id='23' socket_id='0' core_id='5' siblings='22-23'/>
>           </cpus>
>         </cell>
>       </cells>
>     </topology>
> 
> The topology at least now reflects what 'virsh nodeinfo' reports.
> The main bug is that the CPU "id" values won't match what the Linux
> host actually uses.
> 
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
>  src/conf/capabilities.c | 67 ++++++++++++++++++++++-------------------
>  1 file changed, 36 insertions(+), 31 deletions(-)

Reviewed-by: Michal Privoznik <mprivozn at redhat.com>

Michal




More information about the libvir-list mailing list