All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kurz <groug@kaod.org>
To: Thiago Jung Bauermann <bauerman@linux.ibm.com>
Cc: qemu-ppc@nongnu.org, qemu-arm@nongnu.org, qemu-s390x@nongnu.org,
	qemu-devel@nongnu.org,
	"David Gibson" <david@gibson.dropbear.id.au>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
	"Eduardo Habkost" <ehabkost@redhat.com>,
	"Richard Henderson" <rth@twiddle.net>,
	"Peter Maydell" <peter.maydell@linaro.org>,
	"Aleksandar Markovic" <aleksandar.qemu.devel@gmail.com>,
	"Aurelien Jarno" <aurelien@aurel32.net>,
	"Jiaxun Yang" <jiaxun.yang@flygoat.com>,
	"Aleksandar Rikalo" <aleksandar.rikalo@syrmia.com>,
	"Mark Cave-Ayland" <mark.cave-ayland@ilande.co.uk>,
	"Artyom Tarasenko" <atar4qemu@gmail.com>,
	"Cornelia Huck" <cohuck@redhat.com>,
	"Thomas Huth" <thuth@redhat.com>,
	"David Hildenbrand" <david@redhat.com>,
	"Philippe Mathieu-Daudé" <philmd@redhat.com>,
	"Alex Bennée" <alex.bennee@linaro.org>
Subject: Re: [PATCH v3 3/8] ppc/spapr: Use start-powered-off CPUState property
Date: Mon, 27 Jul 2020 15:28:28 +0200	[thread overview]
Message-ID: <20200727152828.133ee76a@bahia.lan> (raw)
In-Reply-To: <20200723025657.644724-4-bauerman@linux.ibm.com>

On Wed, 22 Jul 2020 23:56:52 -0300
Thiago Jung Bauermann <bauerman@linux.ibm.com> wrote:

> PowerPC sPAPR CPUs start in the halted state, and spapr_reset_vcpu()
> attempts to implement this by setting CPUState::halted to 1. But that's too
> late for the case of hotplugged CPUs in a machine configure with 2 or more
> threads per core.
> 
> By then, other parts of QEMU have already caused the vCPU to run in an
> unitialized state a couple of times. For example, ppc_cpu_reset() calls
> ppc_tlb_invalidate_all(), which ends up calling async_run_on_cpu(). This
> kicks the new vCPU while it has CPUState::halted = 0, causing QEMU to issue
> a KVM_RUN ioctl on the new vCPU before the guest is able to make the
> start-cpu RTAS call to initialize its register state.
> 
> This problem doesn't seem to cause visible issues for regular guests, but
> on a secure guest running under the Ultravisor it does. The Ultravisor
> relies on being able to snoop on the start-cpu RTAS call to map vCPUs to
> guests, and this issue causes it to see a stray vCPU that doesn't belong to
> any guest.
> 
> Fix by setting the start-powered-off CPUState property in
> spapr_create_vcpu(), which makes cpu_common_reset() initialize
> CPUState::halted to 1 at an earlier moment.
> 
> Suggested-by: Eduardo Habkost <ehabkost@redhat.com>
> Signed-off-by: Thiago Jung Bauermann <bauerman@linux.ibm.com>
> ---

Thanks for doing this ! I remember seeing partly initialized CPUs being
kicked in the past, which is clearly wrong but I never got time to find
a proper fix (especially since it didn't seem to break anything).

Reviewed-by: Greg Kurz <groug@kaod.org>

>  hw/ppc/spapr_cpu_core.c | 10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)
> 
> NB: Tested on ppc64le pseries KVM guest with two threads per core. 
> Hot-plugging additional cores doesn't cause the bug described above
> anymore.
> 
> diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
> index c4f47dcc04..2125fdac34 100644
> --- a/hw/ppc/spapr_cpu_core.c
> +++ b/hw/ppc/spapr_cpu_core.c
> @@ -36,11 +36,6 @@ static void spapr_reset_vcpu(PowerPCCPU *cpu)
>  
>      cpu_reset(cs);
>  
> -    /* All CPUs start halted.  CPU0 is unhalted from the machine level
> -     * reset code and the rest are explicitly started up by the guest
> -     * using an RTAS call */
> -    cs->halted = 1;
> -
>      env->spr[SPR_HIOR] = 0;
>  
>      lpcr = env->spr[SPR_LPCR];
> @@ -274,6 +269,11 @@ static PowerPCCPU *spapr_create_vcpu(SpaprCpuCore *sc, int i, Error **errp)
>  
>      cs = CPU(obj);
>      cpu = POWERPC_CPU(obj);
> +    /*
> +     * All CPUs start halted. CPU0 is unhalted from the machine level reset code
> +     * and the rest are explicitly started up by the guest using an RTAS call.
> +     */
> +    cs->start_powered_off = true;
>      cs->cpu_index = cc->core_id + i;
>      spapr_set_vcpu_id(cpu, cs->cpu_index, &local_err);
>      if (local_err) {

WARNING: multiple messages have this Message-ID (diff)
From: Greg Kurz <groug@kaod.org>
To: Thiago Jung Bauermann <bauerman@linux.ibm.com>
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
	"Aleksandar Rikalo" <aleksandar.rikalo@syrmia.com>,
	"Eduardo Habkost" <ehabkost@redhat.com>,
	"Aleksandar Markovic" <aleksandar.qemu.devel@gmail.com>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Cornelia Huck" <cohuck@redhat.com>,
	"Mark Cave-Ayland" <mark.cave-ayland@ilande.co.uk>,
	qemu-devel@nongnu.org, qemu-s390x@nongnu.org,
	qemu-arm@nongnu.org, qemu-ppc@nongnu.org,
	"Artyom Tarasenko" <atar4qemu@gmail.com>,
	"Thomas Huth" <thuth@redhat.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"David Hildenbrand" <david@redhat.com>,
	"Richard Henderson" <rth@twiddle.net>,
	"Philippe Mathieu-Daudé" <philmd@redhat.com>,
	"Aurelien Jarno" <aurelien@aurel32.net>,
	"David Gibson" <david@gibson.dropbear.id.au>
Subject: Re: [PATCH v3 3/8] ppc/spapr: Use start-powered-off CPUState property
Date: Mon, 27 Jul 2020 15:28:28 +0200	[thread overview]
Message-ID: <20200727152828.133ee76a@bahia.lan> (raw)
In-Reply-To: <20200723025657.644724-4-bauerman@linux.ibm.com>

On Wed, 22 Jul 2020 23:56:52 -0300
Thiago Jung Bauermann <bauerman@linux.ibm.com> wrote:

> PowerPC sPAPR CPUs start in the halted state, and spapr_reset_vcpu()
> attempts to implement this by setting CPUState::halted to 1. But that's too
> late for the case of hotplugged CPUs in a machine configure with 2 or more
> threads per core.
> 
> By then, other parts of QEMU have already caused the vCPU to run in an
> unitialized state a couple of times. For example, ppc_cpu_reset() calls
> ppc_tlb_invalidate_all(), which ends up calling async_run_on_cpu(). This
> kicks the new vCPU while it has CPUState::halted = 0, causing QEMU to issue
> a KVM_RUN ioctl on the new vCPU before the guest is able to make the
> start-cpu RTAS call to initialize its register state.
> 
> This problem doesn't seem to cause visible issues for regular guests, but
> on a secure guest running under the Ultravisor it does. The Ultravisor
> relies on being able to snoop on the start-cpu RTAS call to map vCPUs to
> guests, and this issue causes it to see a stray vCPU that doesn't belong to
> any guest.
> 
> Fix by setting the start-powered-off CPUState property in
> spapr_create_vcpu(), which makes cpu_common_reset() initialize
> CPUState::halted to 1 at an earlier moment.
> 
> Suggested-by: Eduardo Habkost <ehabkost@redhat.com>
> Signed-off-by: Thiago Jung Bauermann <bauerman@linux.ibm.com>
> ---

Thanks for doing this ! I remember seeing partly initialized CPUs being
kicked in the past, which is clearly wrong but I never got time to find
a proper fix (especially since it didn't seem to break anything).

Reviewed-by: Greg Kurz <groug@kaod.org>

>  hw/ppc/spapr_cpu_core.c | 10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)
> 
> NB: Tested on ppc64le pseries KVM guest with two threads per core. 
> Hot-plugging additional cores doesn't cause the bug described above
> anymore.
> 
> diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
> index c4f47dcc04..2125fdac34 100644
> --- a/hw/ppc/spapr_cpu_core.c
> +++ b/hw/ppc/spapr_cpu_core.c
> @@ -36,11 +36,6 @@ static void spapr_reset_vcpu(PowerPCCPU *cpu)
>  
>      cpu_reset(cs);
>  
> -    /* All CPUs start halted.  CPU0 is unhalted from the machine level
> -     * reset code and the rest are explicitly started up by the guest
> -     * using an RTAS call */
> -    cs->halted = 1;
> -
>      env->spr[SPR_HIOR] = 0;
>  
>      lpcr = env->spr[SPR_LPCR];
> @@ -274,6 +269,11 @@ static PowerPCCPU *spapr_create_vcpu(SpaprCpuCore *sc, int i, Error **errp)
>  
>      cs = CPU(obj);
>      cpu = POWERPC_CPU(obj);
> +    /*
> +     * All CPUs start halted. CPU0 is unhalted from the machine level reset code
> +     * and the rest are explicitly started up by the guest using an RTAS call.
> +     */
> +    cs->start_powered_off = true;
>      cs->cpu_index = cc->core_id + i;
>      spapr_set_vcpu_id(cpu, cs->cpu_index, &local_err);
>      if (local_err) {



  parent reply	other threads:[~2020-07-27 13:28 UTC|newest]

Thread overview: 84+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-23  2:56 [PATCH v3 0/8] Generalize start-powered-off property from ARM Thiago Jung Bauermann
2020-07-23  2:56 ` Thiago Jung Bauermann
2020-07-23  2:56 ` [PATCH v3 1/8] target/arm: Move start-powered-off property to generic CPUState Thiago Jung Bauermann
2020-07-23  2:56   ` Thiago Jung Bauermann
2020-07-23  3:06   ` David Gibson
2020-07-23  3:06     ` David Gibson
2020-07-23  3:33     ` Thiago Jung Bauermann
2020-07-23  3:33       ` Thiago Jung Bauermann
2020-07-27 12:36     ` Greg Kurz
2020-07-27 12:36       ` Greg Kurz
2020-07-28 23:00       ` Thiago Jung Bauermann
2020-07-28 23:00         ` Thiago Jung Bauermann
2020-07-23  2:56 ` [PATCH v3 2/8] target/arm: Move setting of CPU halted state to generic code Thiago Jung Bauermann
2020-07-23  2:56   ` Thiago Jung Bauermann
2020-07-23  3:06   ` David Gibson
2020-07-23  3:06     ` David Gibson
2020-07-27 12:39   ` Greg Kurz
2020-07-27 12:39     ` Greg Kurz
2020-07-23  2:56 ` [PATCH v3 3/8] ppc/spapr: Use start-powered-off CPUState property Thiago Jung Bauermann
2020-07-23  2:56   ` Thiago Jung Bauermann
2020-07-23  3:06   ` David Gibson
2020-07-23  3:06     ` David Gibson
2020-07-27 13:28   ` Greg Kurz [this message]
2020-07-27 13:28     ` Greg Kurz
2020-07-28 23:03     ` Thiago Jung Bauermann
2020-07-28 23:03       ` Thiago Jung Bauermann
2020-07-27 14:25   ` Philippe Mathieu-Daudé
2020-07-27 14:25     ` Philippe Mathieu-Daudé
2020-07-23  2:56 ` [PATCH v3 4/8] ppc/e500: " Thiago Jung Bauermann
2020-07-23  2:56   ` Thiago Jung Bauermann
2020-07-23  3:07   ` David Gibson
2020-07-23  3:07     ` David Gibson
2020-07-23  2:56 ` [PATCH v3 5/8] mips/cps: " Thiago Jung Bauermann
2020-07-23  2:56   ` Thiago Jung Bauermann
2020-07-23  3:07   ` David Gibson
2020-07-23  3:07     ` David Gibson
2020-07-23  2:56 ` [PATCH v3 6/8] sparc/sun4m: Remove main_cpu_reset() Thiago Jung Bauermann
2020-07-23  2:56   ` Thiago Jung Bauermann
2020-07-23  3:08   ` David Gibson
2020-07-23  3:08     ` David Gibson
2020-07-23  2:56 ` [PATCH v3 7/8] sparc/sun4m: Use start-powered-off CPUState property Thiago Jung Bauermann
2020-07-23  2:56   ` Thiago Jung Bauermann
2020-07-23  3:08   ` David Gibson
2020-07-23  3:08     ` David Gibson
2020-07-27 14:15   ` Philippe Mathieu-Daudé
2020-07-27 14:15     ` Philippe Mathieu-Daudé
2020-07-23  2:56 ` [RFC PATCH v3 8/8] target/s390x: " Thiago Jung Bauermann
2020-07-23  2:56   ` Thiago Jung Bauermann
2020-07-27 12:43   ` Cornelia Huck
2020-07-27 12:43     ` Cornelia Huck
2020-07-29  0:51     ` Thiago Jung Bauermann
2020-07-29  0:51       ` Thiago Jung Bauermann
2020-07-30  9:45       ` Cornelia Huck
2020-07-30  9:45         ` Cornelia Huck
2020-08-11 11:04         ` Cornelia Huck
2020-08-11 11:04           ` Cornelia Huck
2020-08-13  1:25           ` Thiago Jung Bauermann
2020-08-13  1:25             ` Thiago Jung Bauermann
2020-07-29  0:56 ` [PATCH v3 0/8] Generalize start-powered-off property from ARM Thiago Jung Bauermann
2020-07-29  0:56   ` Thiago Jung Bauermann
2020-07-30  0:59   ` David Gibson
2020-07-30  0:59     ` David Gibson
2020-07-30 11:05     ` Philippe Mathieu-Daudé
2020-07-30 15:04       ` Thiago Jung Bauermann
2020-07-30 15:04         ` Thiago Jung Bauermann
2020-08-05 17:01         ` Thiago Jung Bauermann
2020-08-05 17:01           ` Thiago Jung Bauermann
2020-08-05 19:04           ` Peter Maydell
2020-08-05 20:22             ` Thiago Jung Bauermann
2020-08-05 20:22               ` Thiago Jung Bauermann
2020-08-06  5:13             ` David Gibson
2020-08-06  5:13               ` David Gibson
2020-08-06  9:17               ` Peter Maydell
2020-08-06  9:17                 ` Peter Maydell
2020-07-30 15:47 ` Peter Maydell
2020-07-30 15:47   ` Peter Maydell
2020-08-17  4:47 ` David Gibson
2020-08-17  4:47   ` David Gibson
2020-08-17  5:24   ` Philippe Mathieu-Daudé
2020-08-17  5:24     ` Philippe Mathieu-Daudé
2020-08-17  5:43     ` David Gibson
2020-08-17  5:43       ` David Gibson
2020-08-18  1:43       ` Thiago Jung Bauermann
2020-08-18  1:43         ` Thiago Jung Bauermann

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=20200727152828.133ee76a@bahia.lan \
    --to=groug@kaod.org \
    --cc=aleksandar.qemu.devel@gmail.com \
    --cc=aleksandar.rikalo@syrmia.com \
    --cc=alex.bennee@linaro.org \
    --cc=atar4qemu@gmail.com \
    --cc=aurelien@aurel32.net \
    --cc=bauerman@linux.ibm.com \
    --cc=cohuck@redhat.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=david@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=jiaxun.yang@flygoat.com \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=mark.cave-ayland@ilande.co.uk \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=philmd@redhat.com \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=qemu-s390x@nongnu.org \
    --cc=rth@twiddle.net \
    --cc=thuth@redhat.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.