Message ID | 1434099628-18102-4-git-send-email-bharata@linux.vnet.ibm.com |
---|---|
State | New |
Headers | show |
On Fri, Jun 12, 2015 at 02:30:27PM +0530, Bharata B Rao wrote: > Store memory address range information of boot memory in address > range list of numa_info. > > This helps to have a common NUMA node lookup by address function that > works for both boot time memory and hotplugged memory. > > Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
On Fri, Jun 12, 2015 at 02:30:27PM +0530, Bharata B Rao wrote: > Store memory address range information of boot memory in address > range list of numa_info. > > This helps to have a common NUMA node lookup by address function that > works for both boot time memory and hotplugged memory. > > Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com> > --- > numa.c | 22 ++++++++++++++++++++++ > 1 file changed, 22 insertions(+) > > diff --git a/numa.c b/numa.c > index 27ca743..d67b1fb 100644 > --- a/numa.c > +++ b/numa.c > @@ -75,6 +75,26 @@ void numa_unset_mem_node_id(ram_addr_t addr, uint64_t size, uint32_t node) > } > } > > +static void numa_set_mem_ranges(void) > +{ > + int i; > + ram_addr_t mem_start, mem_end_prev; > + > + /* > + * Deduce start address of each node and use it to store > + * the address range info in numa_info address range list > + */ > + for (i = 0; i < nb_numa_nodes; i++) { > + if (i) { > + mem_start = mem_end_prev; > + } else { > + mem_start = 0; > + } You could simply initialize mem_end_prev=0 before entering the loop, instead. Actually, you don't even need the mem_end_prev variable: int i; ram_addr_t mem_start = 0; for (i = 0; i < nb_numa_nodes; i++) { numa_set_mem_node_id(mem_start, numa_info[i].node_mem, i); mem_start = mem_start + numa_info[i].node_mem; } I was going to suggest moving this to memory_region_allocate_system_memory() instead (that already has a loop calculating the start address for each NUMA node), but the problem is that allocate_system_memory_nonnuma() may be called even if using NUMA if no memdevs are used. So this can be done later, after refactoring memory_region_allocate_system_memory() to have a single memory allocation code path. > + mem_end_prev = mem_start + numa_info[i].node_mem; > + numa_set_mem_node_id(mem_start, numa_info[i].node_mem, i); > + } > +} > + > static void numa_node_parse(NumaNodeOptions *node, QemuOpts *opts, Error **errp) > { > uint16_t nodenr; > @@ -300,6 +320,8 @@ void parse_numa_opts(MachineClass *mc) > QLIST_INIT(&numa_info[i].addr); > } > > + numa_set_mem_ranges(); > + > for (i = 0; i < nb_numa_nodes; i++) { > if (!bitmap_empty(numa_info[i].node_cpu, MAX_CPUMASK_BITS)) { > break; > -- > 2.1.0 >
On Mon, Jun 15, 2015 at 01:31:20PM -0300, Eduardo Habkost wrote: > On Fri, Jun 12, 2015 at 02:30:27PM +0530, Bharata B Rao wrote: > > Store memory address range information of boot memory in address > > range list of numa_info. > > > > This helps to have a common NUMA node lookup by address function that > > works for both boot time memory and hotplugged memory. > > > > Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com> > > --- > > numa.c | 22 ++++++++++++++++++++++ > > 1 file changed, 22 insertions(+) > > > > diff --git a/numa.c b/numa.c > > index 27ca743..d67b1fb 100644 > > --- a/numa.c > > +++ b/numa.c > > @@ -75,6 +75,26 @@ void numa_unset_mem_node_id(ram_addr_t addr, uint64_t size, uint32_t node) > > } > > } > > > > +static void numa_set_mem_ranges(void) > > +{ > > + int i; > > + ram_addr_t mem_start, mem_end_prev; > > + > > + /* > > + * Deduce start address of each node and use it to store > > + * the address range info in numa_info address range list > > + */ > > + for (i = 0; i < nb_numa_nodes; i++) { > > + if (i) { > > + mem_start = mem_end_prev; > > + } else { > > + mem_start = 0; > > + } > > You could simply initialize mem_end_prev=0 before entering the loop, > instead. > > Actually, you don't even need the mem_end_prev variable: > > int i; > ram_addr_t mem_start = 0; > > for (i = 0; i < nb_numa_nodes; i++) { > numa_set_mem_node_id(mem_start, numa_info[i].node_mem, i); > mem_start = mem_start + numa_info[i].node_mem; > } Ok will change to this. > > I was going to suggest moving this to > memory_region_allocate_system_memory() instead (that already has a loop > calculating the start address for each NUMA node), but the problem is > that allocate_system_memory_nonnuma() may be called even if using NUMA > if no memdevs are used. So this can be done later, after refactoring > memory_region_allocate_system_memory() to have a single memory > allocation code path. If there are no more comments to be addressed in this series, I shall spin the next version. Regards, Bharata.
diff --git a/numa.c b/numa.c index 27ca743..d67b1fb 100644 --- a/numa.c +++ b/numa.c @@ -75,6 +75,26 @@ void numa_unset_mem_node_id(ram_addr_t addr, uint64_t size, uint32_t node) } } +static void numa_set_mem_ranges(void) +{ + int i; + ram_addr_t mem_start, mem_end_prev; + + /* + * Deduce start address of each node and use it to store + * the address range info in numa_info address range list + */ + for (i = 0; i < nb_numa_nodes; i++) { + if (i) { + mem_start = mem_end_prev; + } else { + mem_start = 0; + } + mem_end_prev = mem_start + numa_info[i].node_mem; + numa_set_mem_node_id(mem_start, numa_info[i].node_mem, i); + } +} + static void numa_node_parse(NumaNodeOptions *node, QemuOpts *opts, Error **errp) { uint16_t nodenr; @@ -300,6 +320,8 @@ void parse_numa_opts(MachineClass *mc) QLIST_INIT(&numa_info[i].addr); } + numa_set_mem_ranges(); + for (i = 0; i < nb_numa_nodes; i++) { if (!bitmap_empty(numa_info[i].node_cpu, MAX_CPUMASK_BITS)) { break;
Store memory address range information of boot memory in address range list of numa_info. This helps to have a common NUMA node lookup by address function that works for both boot time memory and hotplugged memory. Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com> --- numa.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)