On Tue, Dec 15, 2009 at 10:24:15AM -0200, Marcelo Tosatti wrote:
> On Tue, Dec 15, 2009 at 01:20:38PM +0200, Gleb Natapov wrote:
> > On Mon, Dec 14, 2009 at 06:36:37PM -0200, Marcelo Tosatti wrote:
> > >
> > > So that the vcpu state is initialized, from vcpu thread context, after
> > > machine initialization is settled.
> > >
> > > This allows to revert apic_init's apic_reset call. apic_reset now
> > > happens through system_reset, similarly to qemu upstream.
> > >
> > This patch essentially revers commit 898c51c3. This commit fixes two
> > races. First race is like this:
> >
> > vcpu0 vcpu1
> >
> > starts running
> > loads lapic state into kernel
> > sends event to vcpu1
> > starts running
> > loads lapic state into kernel
> > overwrites event from vcpu0
> >
> > At the time 898c51c3 was committed the race was easily reproducible
> > by starting VM with 16 cpus + seabios. Sometimes some vcpus lost INIT/SIPI
> > events. Now I am not able to reproduce it even with this patch applied,
> > so something else changed, but it doesn't make the race non existent or
> > acceptable.
>
> Note qemu_kvm_load_lapic depends on env->created set (kvm_vcpu_inited),
Uhh. What about doing this:
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 44e8b75..fa6db8e 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -1920,12 +1920,12 @@ static void *ap_main_loop(void *_env)
pthread_mutex_lock(&qemu_mutex);
cpu_single_env = env;
+ current_env->created = 1;
kvm_arch_init_vcpu(env);
kvm_arch_load_regs(env);
/* signal VCPU creation */
- current_env->created = 1;
pthread_cond_signal(&qemu_vcpu_cond);
/* and wait for machine initialization */
> so having init_vcpu+load_regs before signalling vcpu creation did not
> fix this one (but yeah, thanks for the reminder on the races).
>
> > The second race is during machine start after migration. The race is
> > between event loop and vcpu:
> >
> > event loop vcpu
> >
> > starts running
> > gets RTC timer event
> > sends interrupt to vcpu
> > starts running
> > loads lapic state into kernel
> > overwrites interrupt from RTC
> >
> >
> > In short vcpu state that can be influenced by sources outside vcpu thread
> > itself should be uploaded into the kernel before signaling qemu_system_ready
> > condition.
> >
> > --
> > Gleb.
> > --
> > To unsubscribe from this list: send the line "unsubscribe kvm" in
> > the body of a message to [email protected]
> > More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Gleb.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html