On Thu, Apr 27, 2017 at 12:12:58PM +0200, Laurent Vivier wrote: > We need to change the way we distribute the memory across > the nodes. To keep compatibility between machine type version > introduce a machine type dependent function. > > Signed-off-by: Laurent Vivier <lviv...@redhat.com> > --- > include/hw/boards.h | 2 ++ > numa.c | 44 +++++++++++++++++++++++++++++++++----------- > 2 files changed, 35 insertions(+), 11 deletions(-) > > diff --git a/include/hw/boards.h b/include/hw/boards.h > index 31d9c72..e571b22 100644 > --- a/include/hw/boards.h > +++ b/include/hw/boards.h > @@ -136,6 +136,8 @@ struct MachineClass { > int minimum_page_bits; > bool has_hotpluggable_cpus; > int numa_mem_align_shift; > + void (*numa_auto_assign_ram)(uint64_t *nodes, > + int nb_nodes, ram_addr_t size); >
The code looks good, but I would like to have comments here documenting the behavior when the field is NULL. > HotplugHandler *(*get_hotplug_handler)(MachineState *machine, > DeviceState *dev); > diff --git a/numa.c b/numa.c > index 6fc2393..2770c18 100644 > --- a/numa.c > +++ b/numa.c > @@ -294,6 +294,38 @@ static void validate_numa_cpus(void) > g_free(seen_cpus); > } > > +static void numa_auto_assign_ram(MachineClass *mc, NodeInfo *nodes, > + int nb_nodes, ram_addr_t size) > +{ > + int i; > + uint64_t usedmem = 0; > + > + if (mc->numa_auto_assign_ram) { > + uint64_t *mem = g_new(uint64_t, nb_nodes); > + > + mc->numa_auto_assign_ram(mem, nb_nodes, size); > + > + for (i = 0; i < nb_nodes; i++) { > + nodes[i].node_mem = mem[i]; > + } > + > + g_free(mem); > + > + return; > + } > + > + /* Align each node according to the alignment > + * requirements of the machine class > + */ > + > + for (i = 0; i < nb_nodes - 1; i++) { > + nodes[i].node_mem = (size / nb_nodes) & > + ~((1 << mc->numa_mem_align_shift) - 1); > + usedmem += nodes[i].node_mem; > + } > + nodes[i].node_mem = size - usedmem; > +} > + > void parse_numa_opts(MachineClass *mc) > { > int i; > @@ -336,17 +368,7 @@ void parse_numa_opts(MachineClass *mc) > } > } > if (i == nb_numa_nodes) { > - uint64_t usedmem = 0; > - > - /* Align each node according to the alignment > - * requirements of the machine class > - */ > - for (i = 0; i < nb_numa_nodes - 1; i++) { > - numa_info[i].node_mem = (ram_size / nb_numa_nodes) & > - ~((1 << mc->numa_mem_align_shift) - > 1); > - usedmem += numa_info[i].node_mem; > - } > - numa_info[i].node_mem = ram_size - usedmem; > + numa_auto_assign_ram(mc, numa_info, nb_numa_nodes, ram_size); > } > > numa_total = 0; > -- > 2.9.3 > -- Eduardo