Message ID | aff13e013e6e494238ab1c37aea2dd4ab29c311e.1400049817.git.hutao@cn.fujitsu.com |
---|---|
State | New |
Headers | show |
On Wed, May 14, 2014 at 05:43:06PM +0800, Hu Tao wrote: > From: Wanlong Gao <gaowanlong@cn.fujitsu.com> > > If the total number of the assigned numa nodes memory is not > equal to the assigned ram size, it will write the wrong data > to ACPI table, then the guest will ignore the wrong ACPI table > and recognize all memory to one node. It's buggy, we should > check it to ensure that we write the right data to ACPI table. > > Signed-off-by: Wanlong Gao <gaowanlong@cn.fujitsu.com> > Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > Signed-off-by: Hu Tao <hutao@cn.fujitsu.com> > --- > numa.c | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > > diff --git a/numa.c b/numa.c > index 395c14f..1d2f761 100644 > --- a/numa.c > +++ b/numa.c > @@ -27,6 +27,8 @@ > #include "exec/cpu-common.h" > #include "qemu/bitmap.h" > #include "qom/cpu.h" > +#include "qemu/error-report.h" > +#include "include/exec/cpu-common.h" /* for RAM_ADDR_FMT */ > > static void numa_node_parse_cpus(int nodenr, const char *cpus) > { > @@ -127,6 +129,7 @@ void numa_add(const char *optarg) > void set_numa_nodes(void) > { > if (nb_numa_nodes > 0) { > + uint64_t numa_total; > int i; > > if (nb_numa_nodes > MAX_NODES) { > @@ -154,6 +157,17 @@ void set_numa_nodes(void) > node_mem[i] = ram_size - usedmem; > } > > + numa_total = 0; > + for (i = 0; i < nb_numa_nodes; i++) { > + numa_total += node_mem[i]; > + } > + if (numa_total != ram_size) { > + error_report("qemu: total memory size for NUMA nodes (%" PRIu64 ")" > + " should equal to ram_size (" RAM_ADDR_FMT ")\n", should equal RAM size > + numa_total, ram_size); > + exit(1); > + } > + > for (i = 0; i < nb_numa_nodes; i++) { > if (!bitmap_empty(node_cpumask[i], MAX_CPUMASK_BITS)) { > break; > -- > 1.8.5.2.229.g4448466 >
On Sun, Jun 08, 2014 at 01:09:46PM +0300, Michael S. Tsirkin wrote: > On Wed, May 14, 2014 at 05:43:06PM +0800, Hu Tao wrote: > > From: Wanlong Gao <gaowanlong@cn.fujitsu.com> > > > > If the total number of the assigned numa nodes memory is not > > equal to the assigned ram size, it will write the wrong data > > to ACPI table, then the guest will ignore the wrong ACPI table > > and recognize all memory to one node. It's buggy, we should > > check it to ensure that we write the right data to ACPI table. > > > > Signed-off-by: Wanlong Gao <gaowanlong@cn.fujitsu.com> > > Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > > Signed-off-by: Hu Tao <hutao@cn.fujitsu.com> > > --- > > numa.c | 14 ++++++++++++++ > > 1 file changed, 14 insertions(+) > > > > diff --git a/numa.c b/numa.c > > index 395c14f..1d2f761 100644 > > --- a/numa.c > > +++ b/numa.c > > @@ -27,6 +27,8 @@ > > #include "exec/cpu-common.h" > > #include "qemu/bitmap.h" > > #include "qom/cpu.h" > > +#include "qemu/error-report.h" > > +#include "include/exec/cpu-common.h" /* for RAM_ADDR_FMT */ > > > > static void numa_node_parse_cpus(int nodenr, const char *cpus) > > { > > @@ -127,6 +129,7 @@ void numa_add(const char *optarg) > > void set_numa_nodes(void) > > { > > if (nb_numa_nodes > 0) { > > + uint64_t numa_total; > > int i; > > > > if (nb_numa_nodes > MAX_NODES) { > > @@ -154,6 +157,17 @@ void set_numa_nodes(void) > > node_mem[i] = ram_size - usedmem; > > } > > > > + numa_total = 0; > > + for (i = 0; i < nb_numa_nodes; i++) { > > + numa_total += node_mem[i]; > > + } > > + if (numa_total != ram_size) { > > + error_report("qemu: total memory size for NUMA nodes (%" PRIu64 ")" > > + " should equal to ram_size (" RAM_ADDR_FMT ")\n", > > should equal RAM size Thanks. Hu
diff --git a/numa.c b/numa.c index 395c14f..1d2f761 100644 --- a/numa.c +++ b/numa.c @@ -27,6 +27,8 @@ #include "exec/cpu-common.h" #include "qemu/bitmap.h" #include "qom/cpu.h" +#include "qemu/error-report.h" +#include "include/exec/cpu-common.h" /* for RAM_ADDR_FMT */ static void numa_node_parse_cpus(int nodenr, const char *cpus) { @@ -127,6 +129,7 @@ void numa_add(const char *optarg) void set_numa_nodes(void) { if (nb_numa_nodes > 0) { + uint64_t numa_total; int i; if (nb_numa_nodes > MAX_NODES) { @@ -154,6 +157,17 @@ void set_numa_nodes(void) node_mem[i] = ram_size - usedmem; } + numa_total = 0; + for (i = 0; i < nb_numa_nodes; i++) { + numa_total += node_mem[i]; + } + if (numa_total != ram_size) { + error_report("qemu: total memory size for NUMA nodes (%" PRIu64 ")" + " should equal to ram_size (" RAM_ADDR_FMT ")\n", + numa_total, ram_size); + exit(1); + } + for (i = 0; i < nb_numa_nodes; i++) { if (!bitmap_empty(node_cpumask[i], MAX_CPUMASK_BITS)) { break;