diff options
author | Igor Mammedov <imammedo@redhat.com> | 2015-03-19 17:09:21 +0000 |
---|---|---|
committer | Eduardo Habkost <ehabkost@redhat.com> | 2015-03-19 16:12:09 -0300 |
commit | 57924bcd87cb03cc21ebd7efed880d16ca048dce (patch) | |
tree | 6c64141a2db6ef60b6445a204d633dbb7608063a /numa.c | |
parent | 3ef7197505e483e2f28c5fbd6ed54b4061221200 (diff) |
numa: introduce machine callback for VCPU to node mapping
Current default round-robin way of distributing VCPUs among
NUMA nodes might be wrong in case on multi-core/threads
CPUs. Making guests confused wrt topology where cores from
the same socket are on different nodes.
Allow a machine to override default mapping by providing
MachineClass::cpu_index_to_socket_id()
callback which would allow it group VCPUs from a socket
on the same NUMA node.
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Andreas Färber <afaerber@suse.de>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Diffstat (limited to 'numa.c')
-rw-r--r-- | numa.c | 18 |
1 files changed, 13 insertions, 5 deletions
@@ -202,7 +202,7 @@ static void validate_numa_cpus(void) } } -void parse_numa_opts(void) +void parse_numa_opts(MachineClass *mc) { int i; @@ -270,13 +270,21 @@ void parse_numa_opts(void) break; } } - /* assigning the VCPUs round-robin is easier to implement, guest OSes - * must cope with this anyway, because there are BIOSes out there in - * real machines which also use this scheme. + /* Historically VCPUs were assigned in round-robin order to NUMA + * nodes. However it causes issues with guest not handling it nice + * in case where cores/threads from a multicore CPU appear on + * different nodes. So allow boards to override default distribution + * rule grouping VCPUs by socket so that VCPUs from the same socket + * would be on the same node. */ if (i == nb_numa_nodes) { for (i = 0; i < max_cpus; i++) { - set_bit(i, numa_info[i % nb_numa_nodes].node_cpu); + unsigned node_id = i % nb_numa_nodes; + if (mc->cpu_index_to_socket_id) { + node_id = mc->cpu_index_to_socket_id(i) % nb_numa_nodes; + } + + set_bit(i, numa_info[node_id].node_cpu); } } |