All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Michael Tokarev <mjt@tls.msk.ru>, qemu-stable@nongnu.org
Cc: qemu-devel@nongnu.org, "Zhao Liu" <zhao1.liu@intel.com>,
	"Ján Tomko" <jtomko@redhat.com>,
	"Philippe Mathieu-Daudé" <philmd@linaro.org>
Subject: Re: [PULL 3/5] hw/core: allow parameter=1 for SMP topology on any machine
Date: Wed, 3 Jul 2024 09:21:11 +0100	[thread overview]
Message-ID: <ZoUJ9yfkjkAzMSOd@redhat.com> (raw)
In-Reply-To: <20240517150227.32205-4-philmd@linaro.org>

Hi Michael,

This patch fixes a regression that was introduced in QEMU 9.0,
reported by yet another user at:

  https://gitlab.com/qemu-project/qemu/-/issues/2420

Could you pull this patch into stable-9.0.  If you think testing
is important for stable, the following patch adds further unit
testing coverage too.

Daniel

On Fri, May 17, 2024 at 05:02:25PM +0200, Philippe Mathieu-Daudé wrote:
> From: Daniel P. Berrangé <berrange@redhat.com>
> 
> This effectively reverts
> 
>   commit 54c4ea8f3ae614054079395842128a856a73dbf9
>   Author: Zhao Liu <zhao1.liu@intel.com>
>   Date:   Sat Mar 9 00:01:37 2024 +0800
> 
>     hw/core/machine-smp: Deprecate unsupported "parameter=1" SMP configurations
> 
> but is not done as a 'git revert' since the part of the changes to the
> file hw/core/machine-smp.c which add 'has_XXX' checks remain desirable.
> Furthermore, we have to tweak the subsequently added unit test to
> account for differing warning message.
> 
> The rationale for the original deprecation was:
> 
>   "Currently, it was allowed for users to specify the unsupported
>    topology parameter as "1". For example, x86 PC machine doesn't
>    support drawer/book/cluster topology levels, but user could specify
>    "-smp drawers=1,books=1,clusters=1".
> 
>    This is meaningless and confusing, so that the support for this kind
>    of configurations is marked deprecated since 9.0."
> 
> There are varying POVs on the topic of 'unsupported' topology levels.
> 
> It is common to say that on a system without hyperthreading, that there
> is always 1 thread. Likewise when new CPUs introduced a concept of
> multiple "dies', it was reasonable to say that all historical CPUs
> before that implicitly had 1 'die'. Likewise for the more recently
> introduced 'modules' and 'clusters' parameter'. From this POV, it is
> valid to set 'parameter=1' on the -smp command line for any machine,
> only a value > 1 is strictly an error condition.
> 
> It doesn't cause any functional difficulty for QEMU, because internally
> the QEMU code is itself assuming that all "unsupported" parameters
> implicitly have a value of '1'.
> 
> At the libvirt level, we've allowed applications to set 'parameter=1'
> when configuring a guest, and pass that through to QEMU.
> 
> Deprecating this creates extra difficulty for because there's no info
> exposed from QEMU about which machine types "support" which parameters.
> Thus, libvirt can't know whether it is valid to pass 'parameter=1' for
> a given machine type, or whether it will trigger deprecation messages.
> 
> Since there's no apparent functional benefit to deleting this deprecated
> behaviour from QEMU, and it creates problems for consumers of QEMU,
> remove this deprecation.
> 
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
> Reviewed-by: Ján Tomko <jtomko@redhat.com>
> Message-ID: <20240513123358.612355-2-berrange@redhat.com>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>  hw/core/machine-smp.c       | 84 ++++++++++++-------------------------
>  tests/unit/test-smp-parse.c |  8 ++--
>  2 files changed, 31 insertions(+), 61 deletions(-)
> 
> diff --git a/hw/core/machine-smp.c b/hw/core/machine-smp.c
> index 2b93fa99c9..5d8d7edcbd 100644
> --- a/hw/core/machine-smp.c
> +++ b/hw/core/machine-smp.c
> @@ -118,76 +118,46 @@ void machine_parse_smp_config(MachineState *ms,
>      }
>  
>      /*
> -     * If not supported by the machine, a topology parameter must be
> -     * omitted.
> +     * If not supported by the machine, a topology parameter must
> +     * not be set to a value greater than 1.
>       */
> -    if (!mc->smp_props.modules_supported && config->has_modules) {
> -        if (config->modules > 1) {
> -            error_setg(errp, "modules not supported by this "
> -                       "machine's CPU topology");
> -            return;
> -        } else {
> -            /* Here modules only equals 1 since we've checked zero case. */
> -            warn_report("Deprecated CPU topology (considered invalid): "
> -                        "Unsupported modules parameter mustn't be "
> -                        "specified as 1");
> -        }
> +    if (!mc->smp_props.modules_supported &&
> +        config->has_modules && config->modules > 1) {
> +        error_setg(errp,
> +                   "modules > 1 not supported by this machine's CPU topology");
> +        return;
>      }
>      modules = modules > 0 ? modules : 1;
>  
> -    if (!mc->smp_props.clusters_supported && config->has_clusters) {
> -        if (config->clusters > 1) {
> -            error_setg(errp, "clusters not supported by this "
> -                       "machine's CPU topology");
> -            return;
> -        } else {
> -            /* Here clusters only equals 1 since we've checked zero case. */
> -            warn_report("Deprecated CPU topology (considered invalid): "
> -                        "Unsupported clusters parameter mustn't be "
> -                        "specified as 1");
> -        }
> +    if (!mc->smp_props.clusters_supported &&
> +        config->has_clusters && config->clusters > 1) {
> +        error_setg(errp,
> +                   "clusters > 1 not supported by this machine's CPU topology");
> +        return;
>      }
>      clusters = clusters > 0 ? clusters : 1;
>  
> -    if (!mc->smp_props.dies_supported && config->has_dies) {
> -        if (config->dies > 1) {
> -            error_setg(errp, "dies not supported by this "
> -                       "machine's CPU topology");
> -            return;
> -        } else {
> -            /* Here dies only equals 1 since we've checked zero case. */
> -            warn_report("Deprecated CPU topology (considered invalid): "
> -                        "Unsupported dies parameter mustn't be "
> -                        "specified as 1");
> -        }
> +    if (!mc->smp_props.dies_supported &&
> +        config->has_dies && config->dies > 1) {
> +        error_setg(errp,
> +                   "dies > 1 not supported by this machine's CPU topology");
> +        return;
>      }
>      dies = dies > 0 ? dies : 1;
>  
> -    if (!mc->smp_props.books_supported && config->has_books) {
> -        if (config->books > 1) {
> -            error_setg(errp, "books not supported by this "
> -                       "machine's CPU topology");
> -            return;
> -        } else {
> -            /* Here books only equals 1 since we've checked zero case. */
> -            warn_report("Deprecated CPU topology (considered invalid): "
> -                        "Unsupported books parameter mustn't be "
> -                        "specified as 1");
> -        }
> +    if (!mc->smp_props.books_supported &&
> +        config->has_books && config->books > 1) {
> +        error_setg(errp,
> +                   "books > 1 not supported by this machine's CPU topology");
> +        return;
>      }
>      books = books > 0 ? books : 1;
>  
> -    if (!mc->smp_props.drawers_supported && config->has_drawers) {
> -        if (config->drawers > 1) {
> -            error_setg(errp, "drawers not supported by this "
> -                       "machine's CPU topology");
> -            return;
> -        } else {
> -            /* Here drawers only equals 1 since we've checked zero case. */
> -            warn_report("Deprecated CPU topology (considered invalid): "
> -                        "Unsupported drawers parameter mustn't be "
> -                        "specified as 1");
> -        }
> +    if (!mc->smp_props.drawers_supported &&
> +        config->has_drawers && config->drawers > 1) {
> +        error_setg(errp,
> +                   "drawers > 1 not supported by this machine's CPU topology");
> +        return;
>      }
>      drawers = drawers > 0 ? drawers : 1;
>  
> diff --git a/tests/unit/test-smp-parse.c b/tests/unit/test-smp-parse.c
> index 8994337e12..56165e6644 100644
> --- a/tests/unit/test-smp-parse.c
> +++ b/tests/unit/test-smp-parse.c
> @@ -337,21 +337,21 @@ static const struct SMPTestData data_generic_invalid[] = {
>      {
>          /* config: -smp 2,dies=2 */
>          .config = SMP_CONFIG_WITH_DIES(T, 2, F, 0, T, 2, F, 0, F, 0, F, 0),
> -        .expect_error = "dies not supported by this machine's CPU topology",
> +        .expect_error = "dies > 1 not supported by this machine's CPU topology",
>      }, {
>          /* config: -smp 2,clusters=2 */
>          .config = SMP_CONFIG_WITH_CLUSTERS(T, 2, F, 0, T, 2, F, 0, F, 0, F, 0),
> -        .expect_error = "clusters not supported by this machine's CPU topology",
> +        .expect_error = "clusters > 1 not supported by this machine's CPU topology",
>      }, {
>          /* config: -smp 2,books=2 */
>          .config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 2, F, 0, T, 2, F,
>                                                  0, F, 0, F, 0, F, 0),
> -        .expect_error = "books not supported by this machine's CPU topology",
> +        .expect_error = "books > 1 not supported by this machine's CPU topology",
>      }, {
>          /* config: -smp 2,drawers=2 */
>          .config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 2, T, 2, F, 0, F,
>                                                  0, F, 0, F, 0, F, 0),
> -        .expect_error = "drawers not supported by this machine's CPU topology",
> +        .expect_error = "drawers > 1 not supported by this machine's CPU topology",
>      }, {
>          /* config: -smp 8,sockets=2,cores=4,threads=2,maxcpus=8 */
>          .config = SMP_CONFIG_GENERIC(T, 8, T, 2, T, 4, T, 2, T, 8),
> -- 
> 2.41.0
> 

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



  reply	other threads:[~2024-07-03  8:21 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-17 15:02 [PULL 0/5] Misc HW patches & fixes for 2024-05-17 Philippe Mathieu-Daudé
2024-05-17 15:02 ` [PULL 1/5] ui/console: Only declare variable fence_fd when CONFIG_GBM is defined Philippe Mathieu-Daudé
2024-05-17 16:56   ` Kim, Dongwon
2024-05-17 15:02 ` [PULL 2/5] hw/pflash: fix block write start Philippe Mathieu-Daudé
2024-05-17 15:02 ` [PULL 3/5] hw/core: allow parameter=1 for SMP topology on any machine Philippe Mathieu-Daudé
2024-07-03  8:21   ` Daniel P. Berrangé [this message]
2024-07-03  8:39     ` Michael Tokarev
2024-05-17 15:02 ` [PULL 4/5] tests: add testing of parameter=1 for SMP topology Philippe Mathieu-Daudé
2024-05-17 15:02 ` [PULL 5/5] tests: Gently exit from GDB when tests complete Philippe Mathieu-Daudé
2024-05-18 13:26 ` [PULL 0/5] Misc HW patches & fixes for 2024-05-17 Richard Henderson

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=ZoUJ9yfkjkAzMSOd@redhat.com \
    --to=berrange@redhat.com \
    --cc=jtomko@redhat.com \
    --cc=mjt@tls.msk.ru \
    --cc=philmd@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-stable@nongnu.org \
    --cc=zhao1.liu@intel.com \
    /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.