On Fri, Aug 31, 2012 at 05:22:59PM +0800, Guannan Ren wrote: > The variable max_id is initialized again in the step of > getting cpu mapping variable map2. But in the next for loop > we still expect original value of max_id, the bug will > crash libvirtd when using on NUMA machine with big number > of cpus. > --- > src/qemu/qemu_driver.c | 11 +++++++---- > 1 file changed, 7 insertions(+), 4 deletions(-) > > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c > index 5081b52..53d6e5b 100644 > --- a/src/qemu/qemu_driver.c > +++ b/src/qemu/qemu_driver.c > @@ -13496,7 +13496,7 @@ qemuDomainGetPercpuStats(virDomainPtr domain, > char *map = NULL; > char *map2 = NULL; > int rv = -1; > - int i, max_id; > + int i, id, max_id; > char *pos; > char *buf = NULL; > unsigned long long *sum_cpu_time = NULL; > @@ -13537,10 +13537,13 @@ qemuDomainGetPercpuStats(virDomainPtr domain, > /* return percpu cputime in index 0 */ > param_idx = 0; > > + /* number of cpus to compute */ > + id = max_id; > + > if (max_id - start_cpu > ncpus - 1) > - max_id = start_cpu + ncpus - 1; > + id = start_cpu + ncpus - 1; > > - for (i = 0; i <= max_id; i++) { > + for (i = 0; i <= id; i++) { > if (!map[i]) { > cpu_time = 0; > } else if (virStrToLong_ull(pos, &pos, 10, &cpu_time) < 0) { > @@ -13580,7 +13583,7 @@ qemuDomainGetPercpuStats(virDomainPtr domain, > } > > sum_cpu_pos = sum_cpu_time; > - for (i = 0; i <= max_id; i++) { > + for (i = 0; i <= id; i++) { > if (!map[i]) > cpu_time = 0; > else ACK, that sounds right, Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list