[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 1/2] numa: introduce numa_auto_assign_ram() f
From: |
Eduardo Habkost |
Subject: |
Re: [Qemu-devel] [PATCH v2 1/2] numa: introduce numa_auto_assign_ram() function in MachineClass |
Date: |
Thu, 27 Apr 2017 17:28:24 -0300 |
User-agent: |
Mutt/1.8.0 (2017-02-23) |
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 <address@hidden>
> ---
> 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