From: Gleb Natapov <gleb@redhat.com>
To: Glauber Costa <glommer@redhat.com>
Cc: agraf@suse.de, aliguori@us.ibm.com, qemu-devel@nongnu.org,
avi@redhat.com
Subject: Re: [Qemu-devel] [PATCH v2 05/11] tell kernel about all registers instead of just mp_state
Date: Wed, 2 Dec 2009 12:48:26 +0200 [thread overview]
Message-ID: <20091202104826.GA9537@redhat.com> (raw)
In-Reply-To: <1259671897-22232-6-git-send-email-glommer@redhat.com>
On Tue, Dec 01, 2009 at 10:51:31AM -0200, Glauber Costa wrote:
> This fix a bug with -smp in kvm. Since we have updated apic_base,
> we also have to tell kernel about it. So instead of just updating
> mp_state, update every regs.
>
> It is mandatory that this happens synchronously, without waiting for
> the next vcpu run. Otherwise, if we are migrating, or initializing
> the cpu's APIC, other cpus can still see an invalid state.
>
> Since putting registers already happen in vcpu entry, we factor
> out the required code in cpu_flush_state()
>
> Signed-off-by: Glauber Costa <glommer@redhat.com>
> ---
> hw/apic-kvm.c | 5 ++++-
> kvm-all.c | 14 +++++++++-----
> kvm.h | 8 ++++++++
> 3 files changed, 21 insertions(+), 6 deletions(-)
>
> diff --git a/hw/apic-kvm.c b/hw/apic-kvm.c
> index e5a0bfc..9e9790f 100644
> --- a/hw/apic-kvm.c
> +++ b/hw/apic-kvm.c
> @@ -126,7 +126,10 @@ static void kvm_apic_reset(void *opaque)
> s->cpu_env->mp_state
> = bsp ? KVM_MP_STATE_RUNNABLE : KVM_MP_STATE_UNINITIALIZED;
>
> - kvm_put_mp_state(s->cpu_env);
> + /* We have to tell the kernel about mp_state, but also save sregs, since
> + * apic base was just updated
> + */
> + cpu_flush_state(s->cpu_env);
>
> if (bsp) {
> /*
> diff --git a/kvm-all.c b/kvm-all.c
> index 40203f0..318a4e6 100644
> --- a/kvm-all.c
> +++ b/kvm-all.c
> @@ -622,7 +622,6 @@ static void kvm_run_coalesced_mmio(CPUState *env, struct kvm_run *run)
> }
> #endif
> }
> -
Spurious line removing.
> void kvm_cpu_synchronize_state(CPUState *env)
> {
> if (!env->kvm_state->regs_modified) {
> @@ -631,6 +630,14 @@ void kvm_cpu_synchronize_state(CPUState *env)
> }
> }
>
> +void kvm_cpu_flush_state(CPUState *env)
> +{
> + if (env->kvm_state->regs_modified) {
> + kvm_arch_put_registers(env);
> + env->kvm_state->regs_modified = 0;
> + }
> +}
> +
> int kvm_cpu_exec(CPUState *env)
> {
> struct kvm_run *run = env->kvm_run;
> @@ -645,10 +652,7 @@ int kvm_cpu_exec(CPUState *env)
> break;
> }
>
> - if (env->kvm_state->regs_modified) {
> - kvm_arch_put_registers(env);
> - env->kvm_state->regs_modified = 0;
> - }
> + kvm_cpu_flush_state(env);
>
> kvm_arch_pre_run(env, run);
> qemu_mutex_unlock_iothread();
> diff --git a/kvm.h b/kvm.h
> index a474d95..d9af176 100644
> --- a/kvm.h
> +++ b/kvm.h
> @@ -139,6 +139,7 @@ int kvm_check_extension(KVMState *s, unsigned int extension);
> uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function,
> int reg);
> void kvm_cpu_synchronize_state(CPUState *env);
> +void kvm_cpu_flush_state(CPUState *env);
>
> /* generic hooks - to be moved/refactored once there are more users */
>
> @@ -149,4 +150,11 @@ static inline void cpu_synchronize_state(CPUState *env)
> }
> }
>
> +static inline void cpu_flush_state(CPUState *env)
> +{
> + if (kvm_enabled()) {
Is this ever called or intended to be called when kvm is disabled?
> + kvm_cpu_flush_state(env);
> + }
> +}
> +
> #endif
> --
> 1.6.5.2
>
>
--
Gleb.
next prev parent reply other threads:[~2009-12-02 10:48 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-12-01 12:51 [Qemu-devel] [PATCH v2 0/11] Glauber Costa
2009-12-01 12:51 ` [Qemu-devel] [PATCH v2 01/11] Don't mess with halted state Glauber Costa
2009-12-01 12:51 ` [Qemu-devel] [PATCH v2 02/11] store thread-specific env information Glauber Costa
2009-12-01 12:51 ` [Qemu-devel] [PATCH v2 03/11] update halted state on mp_state sync Glauber Costa
2009-12-01 12:51 ` [Qemu-devel] [PATCH v2 04/11] qemu_flush_work for remote vcpu execution Glauber Costa
2009-12-01 12:51 ` [Qemu-devel] [PATCH v2 05/11] tell kernel about all registers instead of just mp_state Glauber Costa
2009-12-01 12:51 ` [Qemu-devel] [PATCH v2 06/11] flush state in migration post_load Glauber Costa
2009-12-01 12:51 ` [Qemu-devel] [PATCH v2 07/11] Don't call kvm cpu reset on initialization Glauber Costa
2009-12-01 12:51 ` [Qemu-devel] [PATCH v2 08/11] use cpu_kick instead of direct signalling Glauber Costa
2009-12-01 12:51 ` [Qemu-devel] [PATCH v2 09/11] Use per-cpu reset handlers Glauber Costa
2009-12-01 12:51 ` [Qemu-devel] [PATCH v2 10/11] Use __thread where available Glauber Costa
2009-12-01 12:51 ` [Qemu-devel] [PATCH v2 11/11] remove smp restriction from kvm Glauber Costa
2009-12-02 10:48 ` Gleb Natapov [this message]
2009-12-02 11:22 ` [Qemu-devel] [PATCH v2 05/11] tell kernel about all registers instead of just mp_state Glauber Costa
2009-12-02 12:10 ` [Qemu-devel] " Jan Kiszka
2009-12-02 12:26 ` Gleb Natapov
2009-12-02 12:35 ` Jan Kiszka
2009-12-02 13:27 ` [Qemu-devel] [PATCH v2 04/11] qemu_flush_work for remote vcpu execution Marcelo Tosatti
2009-12-02 13:41 ` Glauber Costa
2009-12-02 13:54 ` Marcelo Tosatti
2009-12-02 14:01 ` Glauber Costa
2009-12-02 10:59 ` [Qemu-devel] [PATCH v2 0/11] Gleb Natapov
2009-12-02 12:00 ` Glauber Costa
2009-12-02 12:04 ` [Qemu-devel] " Jan Kiszka
2009-12-02 12:22 ` Gleb Natapov
2009-12-02 12:25 ` Jan Kiszka
2009-12-02 12:30 ` Gleb Natapov
2009-12-02 12:33 ` Jan Kiszka
2009-12-02 12:49 ` Gleb Natapov
2009-12-03 7:33 ` Gleb Natapov
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=20091202104826.GA9537@redhat.com \
--to=gleb@redhat.com \
--cc=agraf@suse.de \
--cc=aliguori@us.ibm.com \
--cc=avi@redhat.com \
--cc=glommer@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.