From: Andrew Jones <drjones@redhat.com>
To: qemu-devel@nongnu.org
Cc: pbonzini@redhat.com, ehabkost@redhat.com
Subject: Re: [Qemu-devel] [PATCH] vl: rework smp_parse
Date: Fri, 7 Nov 2014 17:03:28 +0100 [thread overview]
Message-ID: <20141107160328.GA14058@hawk.usersys.redhat.com> (raw)
In-Reply-To: <1415290175-17314-1-git-send-email-drjones@redhat.com>
On Thu, Nov 06, 2014 at 05:09:35PM +0100, Andrew Jones wrote:
> smp_parse has a couple problems. First, it should use max_cpus,
> not smp_cpus when calculating missing topology information.
> Conversely, if maxcpus is not input, then the topology should
> dictate max_cpus, as the topology may support more than the
> input smp_cpus number. Second, smp_parse shouldn't silently
> adjust the number of threads a user provides, which it currently
> does in order to ensure the topology supports the number
> of cpus provided. smp_parse should rather complain and exit
> when input isn't consistent. This patch fixes those issues and
> attempts to clarify the code a bit too.
>
> I don't believe we need to consider compatibility with the old
> behaviors. Specifying something like
>
> -smp 4,sockets=1,cores=1,threads=1
>
> is wrong, even though it currently works (the number of threads
> is silently adjusted to 4). And, specifying something like
>
> -smp 4,sockets=1,cores=4,threads=1,maxcpus=8
>
> is also wrong, as there's no way to hotplug the additional 4 cpus
> with this topology. So, any users doing these things should be
> corrected. The new error message this patch provides should help
> them do that.
>
> Below are some examples with before/after results
>
> // topology should support up to max_cpus
> < -smp 4,sockets=2,maxcpus=8 sockets=2 cores=2 threads=1 smp_cpus=4 max_cpus=8
> > -smp 4,sockets=2,maxcpus=8 sockets=2 cores=4 threads=1 smp_cpus=4 max_cpus=8
>
> // topology supports more than smp_cpus, max_cpus should be higher
> < -smp 4,sockets=4,cores=2 sockets=4 cores=2 threads=1 smp_cpus=4 max_cpus=4
> > -smp 4,sockets=4,cores=2 sockets=4 cores=2 threads=1 smp_cpus=4 max_cpus=8
>
> // shouldn't silently adjust threads
> < -smp 4,sockets=1,cores=2,threads=1 sockets=1 cores=2 threads=2 smp_cpus=4 max_cpus=4
> > -smp 4,sockets=1,cores=2,threads=1 "maxcpus must be equal to or greater than smp"
> < -smp 4,sockets=2,cores=2,threads=4,maxcpus=8 sockets=2 cores=2 threads=1 smp_cpus=4 max_cpus=8
> > -smp 4,sockets=2,cores=2,threads=4,maxcpus=8 "cpu topology: sockets (2) * cores (2) * threads (4) != max_cpus (8)"
>
> Signed-off-by: Andrew Jones <drjones@redhat.com>
> ---
> vl.c | 59 ++++++++++++++++++++++++++++++++++++++---------------------
> 1 file changed, 38 insertions(+), 21 deletions(-)
>
> diff --git a/vl.c b/vl.c
> index f4a6e5e05bce2..23b21a5fbca50 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -1270,35 +1270,52 @@ 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);
> unsigned threads = qemu_opt_get_number(opts, "threads", 0);
> + unsigned cpus;
> +
> + smp_cpus = qemu_opt_get_number(opts, "cpus", 0);
> + max_cpus = qemu_opt_get_number(opts, "maxcpus", 0);
> +
> + cpus = max_cpus ? max_cpus : smp_cpus;
>
> /* compute missing values, prefer sockets over cores over threads */
> - if (cpus == 0 || sockets == 0) {
> - sockets = sockets > 0 ? sockets : 1;
> - cores = cores > 0 ? cores : 1;
> - threads = threads > 0 ? threads : 1;
> - if (cpus == 0) {
> - cpus = cores * threads * sockets;
> - }
> - } else {
> - if (cores == 0) {
> - threads = threads > 0 ? threads : 1;
> - cores = cpus / (sockets * threads);
> - } else {
> - threads = cpus / (cores * sockets);
> - }
> + if (cpus == 0) {
> + cpus = sockets ? sockets : 1;
> + cpus = cpus * cores ? cpus * cores : cpus;
> + cpus = cpus * threads ? cpus * threads : cpus;
> }
>
> - max_cpus = qemu_opt_get_number(opts, "maxcpus", 0);
> + if (sockets == 0) {
> + sockets = 1;
> + }
>
> - smp_cpus = cpus;
> - smp_cores = cores > 0 ? cores : 1;
> - smp_threads = threads > 0 ? threads : 1;
> + if (cores == 0) {
> + threads = threads ? threads : 1;
> + cores = cpus / (sockets * threads);
> + cores = cores ? cores : 1;
> + }
> +
> + if (threads == 0) {
> + threads = cpus / (sockets * cores);
> + threads = threads ? threads : 1;
> + }
> +
> + if (max_cpus == 0) {
> + max_cpus = sockets * cores * threads;
> + }
>
> + if (sockets * cores * threads != max_cpus) {
> + fprintf(stderr, "cpu topology: "
> + "sockets (%u) * cores (%u) * threads (%u) != max_cpus (%u)\n",
> + sockets, cores, threads, max_cpus);
> + exit(1);
> + }
> +
> + smp_cpus = smp_cpus ? smp_cpus : max_cpus;
> + smp_cores = cores;
> + smp_threads = threads;
> }
>
> if (max_cpus == 0) {
> @@ -1309,11 +1326,11 @@ static void smp_parse(QemuOpts *opts)
> fprintf(stderr, "Unsupported number of maxcpus\n");
> exit(1);
> }
> +
> if (max_cpus < smp_cpus) {
> fprintf(stderr, "maxcpus must be equal to or greater than smp\n");
> exit(1);
> }
> -
> }
>
> static void realtime_init(void)
> --
> 1.9.3
>
Dropping this patch in favor of series I'll post in a few seconds.
drew
prev parent reply other threads:[~2014-11-07 16:03 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-06 16:09 [Qemu-devel] [PATCH] vl: rework smp_parse Andrew Jones
2014-11-06 19:17 ` Eduardo Habkost
2014-11-07 9:22 ` Andrew Jones
2014-11-07 11:29 ` Andrew Jones
2014-11-06 22:11 ` Paolo Bonzini
2014-11-07 9:29 ` Andrew Jones
2014-11-07 9:40 ` Paolo Bonzini
2014-11-07 9:52 ` Andrew Jones
2014-11-07 11:21 ` Andrew Jones
2014-11-07 12:16 ` Eduardo Habkost
2014-11-07 12:23 ` Andrew Jones
2014-11-07 12:32 ` Eduardo Habkost
2014-11-07 16:03 ` Andrew Jones [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20141107160328.GA14058@hawk.usersys.redhat.com \
--to=drjones@redhat.com \
--cc=ehabkost@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.