From: Jan Kiszka <jan.kiszka@siemens.com>
To: Gleb Natapov <gleb@redhat.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, 09 Sep 2009 17:57:40 +0200 [thread overview]
Message-ID: <4AA7D074.5010207@siemens.com> (raw)
In-Reply-To: <20090909154919.GE22885@redhat.com>
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
works now for kvm) + you are also touching shared code here. So qemu-kvm
would benefit from keeping the diff small.
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
next prev parent reply other threads:[~2009-09-09 15:57 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 [this message]
2009-09-09 16:07 ` Gleb Natapov
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=4AA7D074.5010207@siemens.com \
--to=jan.kiszka@siemens.com \
--cc=avi@redhat.com \
--cc=gleb@redhat.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.