From: Eduardo Habkost <ehabkost@redhat.com>
To: Andrew Jones <drjones@redhat.com>
Cc: pbonzini@redhat.com, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 2/3] vl: sanity check cpu topology
Date: Tue, 11 Nov 2014 10:41:00 -0200 [thread overview]
Message-ID: <20141111124100.GA4985@thinpad.lan.raisama.net> (raw)
In-Reply-To: <1415376280-14130-3-git-send-email-drjones@redhat.com>
On Fri, Nov 07, 2014 at 05:04:39PM +0100, Andrew Jones wrote:
> 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. We shouldn't do this. Add
> warnings when input isn't adding up right, and even abort when
> the complete cpu topology has been input, but isn't correct.
>
> Signed-off-by: Andrew Jones <drjones@redhat.com>
So, we are fixing bugs and changing behavior on two different cases
here:
1) when all options are provided and they aren't enough for smp_cpus;
2) when one option was missing, but the existing calculation was
incorrect because of division truncation.
I don't think we need to keep compatibility on (1) because the user is
obviously providing an invalid configuration. That's why I suggested we
implemented it in 2.2. And it is safer because we won't be silently
changing behavior: QEMU is going to abort and the mistake will be easily
detected.
But (2) is fixing a QEMU bug, not user error. The user may be unaware of
the bug, and will get a silent ABI change once upgrading to a newer
QEMU.
I suggest fixing only (1) by now and keeping the behavior for (2) on
QEMU 2.2. Something like:
if (sockets == 0) {
/* keep existing code for sockets == 0 */
} else if (cores == 0) {
/* keep existing code for cores == 0 */
} else if (threads == 0) {
/* keep existing code for threads == 0 */
} else {
/* new code: */
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);
}
}
> ---
> vl.c | 27 +++++++++++++++++++++++----
> 1 file changed, 23 insertions(+), 4 deletions(-)
>
> diff --git a/vl.c b/vl.c
> index 9d9855092ab4a..c62fe29aa8075 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -1288,16 +1288,35 @@ 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)) {
> + fprintf(stderr, "cpu topology: warning: "
> + "Calculation results in fractional cores number. "
> + "Adjusting.\n");
> + cores += 1;
> + }
> + } else if (threads == 0) {
> + threads = cpus / (sockets * cores);
> + if (cpus % (sockets * cores)) {
> + fprintf(stderr, "cpu topology: warning: "
> + "Calculation results in fractional threads number. "
> + "Adjusting.\n");
> + 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;
>
> }
>
> --
> 1.9.3
>
>
--
Eduardo
next prev parent reply other threads:[~2014-11-11 12:41 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-07 16:04 [Qemu-devel] [PATCH 0/3] vl: smp_parse sanity checks Andrew Jones
2014-11-07 16:04 ` [Qemu-devel] [PATCH 1/3] vl: fix max_cpus check Andrew Jones
2014-11-07 16:58 ` Eduardo Habkost
2014-11-07 16:04 ` [Qemu-devel] [PATCH 2/3] vl: sanity check cpu topology Andrew Jones
2014-11-11 12:41 ` Eduardo Habkost [this message]
2014-11-11 14:37 ` Andrew Jones
2014-11-11 15:48 ` Eduardo Habkost
2014-11-11 17:04 ` Andrew Jones
2014-11-11 17:27 ` Eduardo Habkost
2014-11-11 18:31 ` Eduardo Habkost
2014-11-12 9:14 ` Andrew Jones
2014-11-07 16:04 ` [Qemu-devel] [PATCH 3/3] vl: warn on topology <-> maxcpus mismatch Andrew Jones
2014-11-11 11:15 ` [Qemu-devel] [PATCH 0/3] vl: smp_parse sanity checks Paolo Bonzini
2014-11-11 12:42 ` Eduardo Habkost
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=20141111124100.GA4985@thinpad.lan.raisama.net \
--to=ehabkost@redhat.com \
--cc=drjones@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.