All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gleb Natapov <gleb@redhat.com>
To: Jan Kiszka <jan.kiszka@siemens.com>
Cc: "avi@redhat.com" <avi@redhat.com>, kvm-devel <kvm@vger.kernel.org>
Subject: Re: [PATCH] call kvm_cpu_synchronize_state() on target vcpu
Date: Wed, 9 Sep 2009 19:07:34 +0300	[thread overview]
Message-ID: <20090909160734.GG22885@redhat.com> (raw)
In-Reply-To: <4AA7D074.5010207@siemens.com>

On Wed, Sep 09, 2009 at 05:57:40PM +0200, Jan Kiszka wrote:
> Gleb Natapov wrote:
> > On Wed, Sep 09, 2009 at 05:47:13PM +0200, Jan Kiszka wrote:
> >> Gleb Natapov wrote:
> >>> regs_modified logic doesn't work if io thread calls
> >>> kvm_cpu_synchronize_state() since kvm_arch_get_registers()
> >>> returns only after vcpu thread is back to kernel. Setting
> >>> regs_modified to 1 at this stage causes loading of wrong vcpu
> >>> state on the next vcpu_run().
> >> We need this upstream too, right? Could you file the corresponding patch?
> >>
> > Upstream is single threaded. It shouldn't suffer from this bug.
> 
> Not if you enable iothread support (though I don't remember if that
It can't work with kvm since all vcpu ioctls are called on the thread
that issues them.

> works now for kvm) + you are also touching shared code here. So qemu-kvm
> would benefit from keeping the diff small.
> 
The patch doesn't touch shared code. (it is almost impossible to tell
what code is shared and what's not nowadays)

> Jan
> 
> > 
> >> Thanks,
> >> Jan
> >>
> >>> Signed-off-by: Gleb Natapov <gleb@redhat.com>
> >>> diff --git a/qemu-kvm.c b/qemu-kvm.c
> >>> index 06efd41..9ab0cec 100644
> >>> --- a/qemu-kvm.c
> >>> +++ b/qemu-kvm.c
> >>> @@ -874,14 +874,6 @@ int kvm_set_mpstate(kvm_vcpu_context_t vcpu, struct kvm_mp_state *mp_state)
> >>>  }
> >>>  #endif
> >>>  
> >>> -void kvm_cpu_synchronize_state(CPUState *env)
> >>> -{
> >>> -    if (!env->kvm_cpu_state.regs_modified) {
> >>> -        kvm_arch_get_registers(env);
> >>> -        env->kvm_cpu_state.regs_modified = 1;
> >>> -    }
> >>> -}
> >>> -
> >>>  static int handle_mmio(kvm_vcpu_context_t vcpu)
> >>>  {
> >>>      unsigned long addr = vcpu->run->mmio.phys_addr;
> >>> @@ -1539,6 +1531,22 @@ static void on_vcpu(CPUState *env, void (*func)(void *data), void *data)
> >>>          qemu_cond_wait(&qemu_work_cond);
> >>>  }
> >>>  
> >>> +static void do_kvm_cpu_synchronize_state(void *_env)
> >>> +{
> >>> +    CPUState *env = _env;
> >>> +    if (!env->kvm_cpu_state.regs_modified) {
> >>> +        kvm_arch_save_regs(env);
> >>> +        kvm_arch_load_mpstate(env);
> >>> +        env->kvm_cpu_state.regs_modified = 1;
> >>> +    }
> >>> +}
> >>> +
> >>> +void kvm_cpu_synchronize_state(CPUState *env)
> >>> +{
> >>> +    if (!env->kvm_cpu_state.regs_modified)
> >>> +        on_vcpu(env, do_kvm_cpu_synchronize_state, env);
> >>> +}
> >>> +
> >>>  static void inject_interrupt(void *data)
> >>>  {
> >>>      cpu_interrupt(current_env, (long) data);
> >>> diff --git a/qemu-kvm.h b/qemu-kvm.h
> >>> index 2c1730b..32f74b3 100644
> >>> --- a/qemu-kvm.h
> >>> +++ b/qemu-kvm.h
> >>> @@ -1153,12 +1153,6 @@ static inline int kvm_sync_vcpus(void)
> >>>      return 0;
> >>>  }
> >>>  
> >>> -static inline void kvm_arch_get_registers(CPUState *env)
> >>> -{
> >>> -    kvm_save_registers(env);
> >>> -    kvm_save_mpstate(env);
> >>> -}
> >>> -
> >>>  static inline void kvm_arch_put_registers(CPUState *env)
> >>>  {
> >>>      kvm_load_registers(env);
> >>> diff --git a/target-i386/helper.c b/target-i386/helper.c
> >>> index 4a16887..57c74a2 100644
> >>> --- a/target-i386/helper.c
> >>> +++ b/target-i386/helper.c
> >>> @@ -746,7 +746,7 @@ void cpu_dump_state(CPUState *env, FILE *f,
> >>>      static const char *seg_name[6] = { "ES", "CS", "SS", "DS", "FS", "GS" };
> >>>  
> >>>      if (kvm_enabled())
> >>> -        kvm_arch_get_registers(env);
> >>> +        kvm_cpu_synchronize_state(env);
> >>>  
> >>>      eflags = env->eflags;
> >>>  #ifdef TARGET_X86_64
> >>> --
> >>> 			Gleb.
> >> -- 
> >> Siemens AG, Corporate Technology, CT SE 2
> >> Corporate Competence Center Embedded Linux
> > 
> > --
> > 			Gleb.
> 
> -- 
> Siemens AG, Corporate Technology, CT SE 2
> Corporate Competence Center Embedded Linux

--
			Gleb.

  reply	other threads:[~2009-09-09 16:07 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-09 15:33 [PATCH] call kvm_cpu_synchronize_state() on target vcpu Gleb Natapov
2009-09-09 15:41 ` Avi Kivity
2009-09-09 15:47 ` Jan Kiszka
2009-09-09 15:49   ` Gleb Natapov
2009-09-09 15:57     ` Jan Kiszka
2009-09-09 16:07       ` Gleb Natapov [this message]
2009-09-09 16:21         ` Jan Kiszka
2009-09-09 16:27           ` Gleb Natapov
2009-09-09 16:32             ` Jan Kiszka
2009-09-09 16:36               ` 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=20090909160734.GG22885@redhat.com \
    --to=gleb@redhat.com \
    --cc=avi@redhat.com \
    --cc=jan.kiszka@siemens.com \
    --cc=kvm@vger.kernel.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.