qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v7 0/2] deprecate incorrect CPUs topolog
@ 2018-09-12 16:19 Igor Mammedov
  2018-09-12 16:19 ` [Qemu-devel] [PATCH v7 1/2] vl.c deprecate incorrect CPUs topology Igor Mammedov
  2018-09-12 16:19 ` [Qemu-devel] [PATCH v7 2/2] vl:c: make sure that sockets are calculated correctly in '-smp X' case Igor Mammedov
  0 siblings, 2 replies; 5+ messages in thread
From: Igor Mammedov @ 2018-09-12 16:19 UTC (permalink / raw)
  To: qemu-devel; +Cc: libvir-list, ehabkost


Changelog since v5:
  * add(v6) and then remove(v7) Notes section to/from deprication doc
     (Eduardo Habkost <ehabkost@redhat.com>)
  * fix up wording and math formating in deprication doc
     (Eduardo Habkost <ehabkost@redhat.com>)
  * drop !socket check as it always evaluates to true at that point
     (Eduardo Habkost <ehabkost@redhat.com>)
Changelog since v4:
  * extend deprication doc, adding that maxcpus should be multiple of
        present on CLI [sockets/cores/threads] options
        (Eduardo Habkost <ehabkost@redhat.com>)

series bundles together 2 related patches posted separately earlier:
  vl.c deprecate incorrect CPUs topology
  vl:c: make sure that sockets are calculated  correctly in '-smp X' case

Goal is to depricate invalid topologies so we could make sure that topology
configuration is correct by forbidding invalid input once deprecation
period ends.

---
CC: libvir-list@redhat.com
CC: ehabkost@redhat.com

Igor Mammedov (2):
  vl.c deprecate incorrect CPUs topology
  vl:c: make sure that sockets are calculated correctly in '-smp X' case

 qemu-deprecated.texi | 13 +++++++++++++
 vl.c                 | 12 +++++++++++-
 2 files changed, 24 insertions(+), 1 deletion(-)

-- 
2.7.4

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH v7 1/2] vl.c deprecate incorrect CPUs topology
  2018-09-12 16:19 [Qemu-devel] [PATCH v7 0/2] deprecate incorrect CPUs topolog Igor Mammedov
@ 2018-09-12 16:19 ` Igor Mammedov
  2018-09-12 16:46   ` [Qemu-devel] [libvirt] " Eric Blake
  2018-09-12 16:19 ` [Qemu-devel] [PATCH v7 2/2] vl:c: make sure that sockets are calculated correctly in '-smp X' case Igor Mammedov
  1 sibling, 1 reply; 5+ messages in thread
From: Igor Mammedov @ 2018-09-12 16:19 UTC (permalink / raw)
  To: qemu-devel; +Cc: libvir-list, ehabkost

-smp [cpus],sockets/cores/threads[,maxcpus] should describe topology
so that total number of logical CPUs [sockets * cores * threads]
would be equal to [maxcpus], however historically we didn't have
such check in QEMU and it is possible to start VM with an invalid
topology.
Deprecate invalid options combination so we can make sure that
the topology VM started with is always correct in the future.
Users with an invalid sockets/cores/threads/maxcpus values should
fix their CLI to make sure that
   [sockets * cores * threads] == [maxcpus]

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
---
v7:
  - add corrections to deprication doc formulas/math/section title
  - drop Note section
      (Eduardo Habkost <ehabkost@redhat.com>)
v6:
  - s/socket/sockets/, the same for core, thread in subsection
    (Andrew Jones <drjones@redhat.com>)
v5:
  - extend deprecation doc, adding that maxcpus should be multiple of
    present on CLI [sockets/cores/threads] options
    (Eduardo Habkost <ehabkost@redhat.com>)
v4:
  - missed dot comment, fix it with s/./,/ (Andrew Jones <drjones@redhat.com>)
v3:
  - more spelling fixes (Andrew Jones <drjones@redhat.com>)
  - place deprecation check after (sockets * cores * threads > max_cpus) check
    (Eduardo Habkost <ehabkost@redhat.com>)
v2:
  - spelling&&co fixes (Andrew Jones <drjones@redhat.com>)
---
 qemu-deprecated.texi | 13 +++++++++++++
 vl.c                 |  7 +++++++
 2 files changed, 20 insertions(+)

diff --git a/qemu-deprecated.texi b/qemu-deprecated.texi
index 1b9c007..31dc1b3 100644
--- a/qemu-deprecated.texi
+++ b/qemu-deprecated.texi
@@ -139,6 +139,19 @@ The 'file' driver for drives is no longer appropriate for character or host
 devices and will only accept regular files (S_IFREG). The correct driver
 for these file types is 'host_cdrom' or 'host_device' as appropriate.
 
+@subsection -smp (invalid topologies) (since 3.1)
+
+CPU topology properties should describe whole machine topology including
+possible CPUs. In other words: @var{maxcpus} should be equal to
+@math{@var{sockets} * @var{cores} * @var{threads}}.
+
+However, historically it was possible to start QEMU with an incorrect topology
+where @math{@var{n} <= @var{sockets} * @var{cores} * @var{threads} < @var{maxcpus}},
+which could lead to an incorrect topology enumeration by the guest.
+Support for invalid topologies will be removed, the user must ensure
+topologies described with -smp include all possible cpus, i.e.
+  @math{@var{sockets} * @var{cores} * @var{threads} = @var{maxcpus}}.
+
 @section QEMU Machine Protocol (QMP) commands
 
 @subsection block-dirty-bitmap-add "autoload" parameter (since 2.12.0)
diff --git a/vl.c b/vl.c
index 5ba06ad..7fd700e 100644
--- a/vl.c
+++ b/vl.c
@@ -1246,6 +1246,13 @@ static void smp_parse(QemuOpts *opts)
             exit(1);
         }
 
+        if (sockets * cores * threads != max_cpus) {
+            warn_report("Invalid CPU topology deprecated: "
+                        "sockets (%u) * cores (%u) * threads (%u) "
+                        "!= maxcpus (%u)",
+                        sockets, cores, threads, max_cpus);
+        }
+
         smp_cpus = cpus;
         smp_cores = cores;
         smp_threads = threads;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH v7 2/2] vl:c: make sure that sockets are calculated correctly in '-smp X' case
  2018-09-12 16:19 [Qemu-devel] [PATCH v7 0/2] deprecate incorrect CPUs topolog Igor Mammedov
  2018-09-12 16:19 ` [Qemu-devel] [PATCH v7 1/2] vl.c deprecate incorrect CPUs topology Igor Mammedov
@ 2018-09-12 16:19 ` Igor Mammedov
  2018-09-12 16:43   ` [Qemu-devel] [libvirt] " Eric Blake
  1 sibling, 1 reply; 5+ messages in thread
From: Igor Mammedov @ 2018-09-12 16:19 UTC (permalink / raw)
  To: qemu-devel; +Cc: libvir-list, ehabkost

commit
  (5cdc9b76e3 vl.c: Remove dead assignment)
removed sockets calculation when 'sockets' weren't provided on CLI
since there wasn't any users for it back then. Exiting checks
are neither reachable
   } else if (sockets * cores * threads < cpus) {
or nor triggable
   if (sockets * cores * threads > max_cpus)
so we weren't noticing wrong topology since then, since users
recalculate sockets adhoc on their own.

However with deprecation check it becomes noticable, for example
  -smp 2
will start printing warning:
  "warning: Invalid CPU topology deprecated: sockets (1) * cores (1) * threads (1) != maxcpus (2)"
calculating sockets if they weren't specified.

Fix it by returning back sockets calculation if it's omited on CLI.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
---
 vl.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/vl.c b/vl.c
index 7fd700e..9e56696 100644
--- a/vl.c
+++ b/vl.c
@@ -1210,11 +1210,14 @@ static void smp_parse(QemuOpts *opts)
 
         /* 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) {
+                sockets = sockets > 0 ? sockets : 1;
                 cpus = cores * threads * sockets;
+            } else {
+                max_cpus = qemu_opt_get_number(opts, "maxcpus", cpus);
+                sockets = max_cpus / (cores * threads);
             }
         } else if (cores == 0) {
             threads = threads > 0 ? threads : 1;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [libvirt] [PATCH v7 2/2] vl:c: make sure that sockets are calculated correctly in '-smp X' case
  2018-09-12 16:19 ` [Qemu-devel] [PATCH v7 2/2] vl:c: make sure that sockets are calculated correctly in '-smp X' case Igor Mammedov
@ 2018-09-12 16:43   ` Eric Blake
  0 siblings, 0 replies; 5+ messages in thread
From: Eric Blake @ 2018-09-12 16:43 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: libvir-list, ehabkost

On 9/12/18 11:19 AM, Igor Mammedov wrote:
> commit
>    (5cdc9b76e3 vl.c: Remove dead assignment)
> removed sockets calculation when 'sockets' weren't provided on CLI
> since there wasn't any users for it back then. Exiting checks
> are neither reachable
>     } else if (sockets * cores * threads < cpus) {
> or nor triggable

s/triggable/triggerable/

>     if (sockets * cores * threads > max_cpus)
> so we weren't noticing wrong topology since then, since users
> recalculate sockets adhoc on their own.
> 
> However with deprecation check it becomes noticable, for example
>    -smp 2
> will start printing warning:
>    "warning: Invalid CPU topology deprecated: sockets (1) * cores (1) * threads (1) != maxcpus (2)"
> calculating sockets if they weren't specified.
> 
> Fix it by returning back sockets calculation if it's omited on CLI.

s/omited/omitted/

> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> Reviewed-by: Andrew Jones <drjones@redhat.com>
> ---
>   vl.c | 5 ++++-
>   1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/vl.c b/vl.c
> index 7fd700e..9e56696 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -1210,11 +1210,14 @@ static void smp_parse(QemuOpts *opts)
>   
>           /* 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) {
> +                sockets = sockets > 0 ? sockets : 1;
>                   cpus = cores * threads * sockets;
> +            } else {
> +                max_cpus = qemu_opt_get_number(opts, "maxcpus", cpus);
> +                sockets = max_cpus / (cores * threads);
>               }
>           } else if (cores == 0) {
>               threads = threads > 0 ? threads : 1;
> 

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [libvirt] [PATCH v7 1/2] vl.c deprecate incorrect CPUs topology
  2018-09-12 16:19 ` [Qemu-devel] [PATCH v7 1/2] vl.c deprecate incorrect CPUs topology Igor Mammedov
@ 2018-09-12 16:46   ` Eric Blake
  0 siblings, 0 replies; 5+ messages in thread
From: Eric Blake @ 2018-09-12 16:46 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: libvir-list, ehabkost

On 9/12/18 11:19 AM, Igor Mammedov wrote:
> -smp [cpus],sockets/cores/threads[,maxcpus] should describe topology
> so that total number of logical CPUs [sockets * cores * threads]
> would be equal to [maxcpus], however historically we didn't have
> such check in QEMU and it is possible to start VM with an invalid
> topology.
> Deprecate invalid options combination so we can make sure that
> the topology VM started with is always correct in the future.
> Users with an invalid sockets/cores/threads/maxcpus values should
> fix their CLI to make sure that
>     [sockets * cores * threads] == [maxcpus]
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> Reviewed-by: Andrew Jones <drjones@redhat.com>
> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
> ---

> +++ b/qemu-deprecated.texi
> @@ -139,6 +139,19 @@ The 'file' driver for drives is no longer appropriate for character or host
>   devices and will only accept regular files (S_IFREG). The correct driver
>   for these file types is 'host_cdrom' or 'host_device' as appropriate.
>   
> +@subsection -smp (invalid topologies) (since 3.1)
> +
> +CPU topology properties should describe whole machine topology including
> +possible CPUs. In other words: @var{maxcpus} should be equal to
> +@math{@var{sockets} * @var{cores} * @var{threads}}.

This sentence...

> +
> +However, historically it was possible to start QEMU with an incorrect topology
> +where @math{@var{n} <= @var{sockets} * @var{cores} * @var{threads} < @var{maxcpus}},
> +which could lead to an incorrect topology enumeration by the guest.
> +Support for invalid topologies will be removed, the user must ensure
> +topologies described with -smp include all possible cpus, i.e.
> +  @math{@var{sockets} * @var{cores} * @var{threads} = @var{maxcpus}}.

...and this recommendation sound repetitive.  I'd be okay if you removed 
the "In other words" sentence above, leaving just the intro statement 
(what -cpu is supposed to do), then the second paragraph (what we also 
allowed in the past, and how you should fix it before we stop allowing 
that).

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-09-12 16:46 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-09-12 16:19 [Qemu-devel] [PATCH v7 0/2] deprecate incorrect CPUs topolog Igor Mammedov
2018-09-12 16:19 ` [Qemu-devel] [PATCH v7 1/2] vl.c deprecate incorrect CPUs topology Igor Mammedov
2018-09-12 16:46   ` [Qemu-devel] [libvirt] " Eric Blake
2018-09-12 16:19 ` [Qemu-devel] [PATCH v7 2/2] vl:c: make sure that sockets are calculated correctly in '-smp X' case Igor Mammedov
2018-09-12 16:43   ` [Qemu-devel] [libvirt] " Eric Blake

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).