Message ID | 1466086585-16526-31-git-send-email-pbonzini@redhat.com |
---|---|
State | Accepted |
Commit | 0544edd88a6acea81aefe22fd0cd9a85d1eef093 |
Headers | show |
On Tue, Jun 21, 2016 at 05:40:13PM +0200, Igor Mammedov wrote: > On Thu, 16 Jun 2016 16:16:25 +0200 > Paolo Bonzini <pbonzini@redhat.com> wrote: > > > From: Andrew Jones <drjones@redhat.com> > > > > No functional changes; only some code movement and removal of > > dead code (impossible conditions). Also, max_cpus can be > > initialized to 1, like smp_cpus, because it's either set by the > > user or set to smp_cpus, when smp_cpus is set by the user, or > > set to 1, when nothing is set. > > > > Signed-off-by: Andrew Jones <drjones@redhat.com> > > Message-Id: <1465580427-13596-2-git-send-email-drjones@redhat.com> > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > this patch broke master with following CLI > -machine q35,accel=tcg -smp 2,cores=3,sockets=2,maxcpus=6 I see why. The "real" problem is the whole using 'cpus' instead of 'maxcpus' again, but, since that ship sailed, I guess I should be careful with calculations like threads = cpus / (cores * sockets) which can result in zero. I'll send a patch right now. Thanks, drew > > > > > --- > > vl.c | 34 +++++++++++++++------------------- > > 1 file changed, 15 insertions(+), 19 deletions(-) > > > > diff --git a/vl.c b/vl.c > > index 99c3030..e69ebfd 100644 > > --- a/vl.c > > +++ b/vl.c > > @@ -154,7 +154,7 @@ CharDriverState *sclp_hds[MAX_SCLP_CONSOLES]; > > int win2k_install_hack = 0; > > int singlestep = 0; > > int smp_cpus = 1; > > -int max_cpus = 0; > > +int max_cpus = 1; > > int smp_cores = 1; > > int smp_threads = 1; > > int acpi_enabled = 1; > > @@ -1223,7 +1223,6 @@ static QemuOptsList qemu_smp_opts = { > > static void smp_parse(QemuOpts *opts) > > { > > if (opts) { > > - > > unsigned cpus = qemu_opt_get_number(opts, "cpus", 0); > > unsigned sockets = qemu_opt_get_number(opts, "sockets", 0); > > unsigned cores = qemu_opt_get_number(opts, "cores", 0); > > @@ -1251,6 +1250,17 @@ static void smp_parse(QemuOpts *opts) > > } > > > > max_cpus = qemu_opt_get_number(opts, "maxcpus", cpus); > > + > > + if (max_cpus > MAX_CPUMASK_BITS) { > > + error_report("unsupported number of maxcpus"); > > + exit(1); > > + } > > + > > + if (max_cpus < cpus) { > > + error_report("maxcpus must be equal to or greater than > > smp"); > > + exit(1); > > + } > > + > > if (sockets * cores * threads > max_cpus) { > > error_report("cpu topology: " > > "sockets (%u) * cores (%u) * threads (%u) > > > " @@ -1260,25 +1270,11 @@ static void smp_parse(QemuOpts *opts) > > } > > > > smp_cpus = cpus; > > - smp_cores = cores > 0 ? cores : 1; > > - smp_threads = threads > 0 ? threads : 1; > > - > > - } > > - > > - if (max_cpus == 0) { > > - max_cpus = smp_cpus; > > - } > > - > > - if (max_cpus > MAX_CPUMASK_BITS) { > > - error_report("unsupported number of maxcpus"); > > - exit(1); > > - } > > - if (max_cpus < smp_cpus) { > > - error_report("maxcpus must be equal to or greater than smp"); > > - exit(1); > > + smp_cores = cores; > > + smp_threads = threads; > > } > > > > - if (smp_cpus > 1 || smp_cores > 1 || smp_threads > 1) { > > + if (smp_cpus > 1) { > > Error *blocker = NULL; > > error_setg(&blocker, QERR_REPLAY_NOT_SUPPORTED, "smp"); > > replay_add_blocker(blocker); > >
diff --git a/vl.c b/vl.c index 99c3030..e69ebfd 100644 --- a/vl.c +++ b/vl.c @@ -154,7 +154,7 @@ CharDriverState *sclp_hds[MAX_SCLP_CONSOLES]; int win2k_install_hack = 0; int singlestep = 0; int smp_cpus = 1; -int max_cpus = 0; +int max_cpus = 1; int smp_cores = 1; int smp_threads = 1; int acpi_enabled = 1; @@ -1223,7 +1223,6 @@ static QemuOptsList qemu_smp_opts = { static void smp_parse(QemuOpts *opts) { if (opts) { - unsigned cpus = qemu_opt_get_number(opts, "cpus", 0); unsigned sockets = qemu_opt_get_number(opts, "sockets", 0); unsigned cores = qemu_opt_get_number(opts, "cores", 0); @@ -1251,6 +1250,17 @@ static void smp_parse(QemuOpts *opts) } max_cpus = qemu_opt_get_number(opts, "maxcpus", cpus); + + if (max_cpus > MAX_CPUMASK_BITS) { + error_report("unsupported number of maxcpus"); + exit(1); + } + + if (max_cpus < cpus) { + error_report("maxcpus must be equal to or greater than smp"); + exit(1); + } + if (sockets * cores * threads > max_cpus) { error_report("cpu topology: " "sockets (%u) * cores (%u) * threads (%u) > " @@ -1260,25 +1270,11 @@ static void smp_parse(QemuOpts *opts) } smp_cpus = cpus; - smp_cores = cores > 0 ? cores : 1; - smp_threads = threads > 0 ? threads : 1; - - } - - if (max_cpus == 0) { - max_cpus = smp_cpus; - } - - if (max_cpus > MAX_CPUMASK_BITS) { - error_report("unsupported number of maxcpus"); - exit(1); - } - if (max_cpus < smp_cpus) { - error_report("maxcpus must be equal to or greater than smp"); - exit(1); + smp_cores = cores; + smp_threads = threads; } - if (smp_cpus > 1 || smp_cores > 1 || smp_threads > 1) { + if (smp_cpus > 1) { Error *blocker = NULL; error_setg(&blocker, QERR_REPLAY_NOT_SUPPORTED, "smp"); replay_add_blocker(blocker);