Message ID | 20141111143709.GA14394@hawk.usersys.redhat.com |
---|---|
State | New |
Headers | show |
On Tue, Nov 11, 2014 at 03:37:11PM +0100, Andrew Jones wrote: [...] > Below is a v2 I can post if it looks good to you. > > From: Andrew Jones <drjones@redhat.com> > Date: Fri, 7 Nov 2014 15:45:07 +0100 > Subject: [PATCH v2] vl: sanity check cpu topology > > smp_parse allows partial or complete cpu topology to be given. > In either case there may be inconsistencies in the input which > are currently not sounding any alarms. In some cases the input > is even being silently corrected. Stop silently adjusting input > and abort when the complete cpu topology has been input, but > isn't correct. > > Signed-off-by: Andrew Jones <drjones@redhat.com> After applying this patch: $ ./install/bin/qemu-system-x86_64 -smp 12 cpu topology: error: sockets (1) * cores (1) * threads (1) < smp_cpus (12) That is why I wanted to address the most obvious (and less risky) issues first (aborting only if all options were explicitly set), and touch automatic calculation later.
On Tue, Nov 11, 2014 at 04:31:24PM -0200, Eduardo Habkost wrote: > On Tue, Nov 11, 2014 at 03:37:11PM +0100, Andrew Jones wrote: > [...] > > Below is a v2 I can post if it looks good to you. > > > > From: Andrew Jones <drjones@redhat.com> > > Date: Fri, 7 Nov 2014 15:45:07 +0100 > > Subject: [PATCH v2] vl: sanity check cpu topology > > > > smp_parse allows partial or complete cpu topology to be given. > > In either case there may be inconsistencies in the input which > > are currently not sounding any alarms. In some cases the input > > is even being silently corrected. Stop silently adjusting input > > and abort when the complete cpu topology has been input, but > > isn't correct. > > > > Signed-off-by: Andrew Jones <drjones@redhat.com> > > After applying this patch: > > $ ./install/bin/qemu-system-x86_64 -smp 12 > cpu topology: error: sockets (1) * cores (1) * threads (1) < smp_cpus (12) > > That is why I wanted to address the most obvious (and less risky) issues first > (aborting only if all options were explicitly set), and touch automatic > calculation later. > Oh right. I fixed that once, but then lost the change when trying to produce these half fixes. drew
diff --git a/vl.c b/vl.c index 9d9855092ab4a..e686fd21e266f 100644 --- a/vl.c +++ b/vl.c @@ -1288,16 +1288,39 @@ static void smp_parse(QemuOpts *opts) if (cores == 0) { threads = threads > 0 ? threads : 1; cores = cpus / (sockets * threads); - } else { - threads = cpus / (cores * sockets); + if (cpus % (sockets * threads)) { + /* The calculation resulted in a fractional number, so we + * need to adjust it. The below adjustment is wrong, it + * should be '+= 1', but we need to keep it this way for + * compatibility. + */ + cores = cores > 0 ? cores : 1; + } + } else if (threads == 0) { + threads = cpus / (sockets * cores); + if (cpus % (sockets * cores)) { + /* The calculation resulted in a fractional number, so we + * need to adjust it. The below adjustment is wrong, it + * should be '+= 1', but we need to keep it this way for + * compatibility. + */ + threads = threads > 0 ? threads : 1; + } } } + if (sockets * cores * threads < cpus) { + fprintf(stderr, "cpu topology: error: " + "sockets (%u) * cores (%u) * threads (%u) < smp_cpus (%u)\n", + sockets, cores, threads, cpus); + exit(1); + } + max_cpus = qemu_opt_get_number(opts, "maxcpus", 0); smp_cpus = cpus; - smp_cores = cores > 0 ? cores : 1; - smp_threads = threads > 0 ? threads : 1; + smp_cores = cores; + smp_threads = threads; }