Re: [Qemu-devel] [RFC] create a single workqueue for each vm to update vm irq routing table

Gleb Natapov
2013-11-26T16:37:08Z

On Tue, Nov 26, 2013 at 05:28:23PM +0100, Paolo Bonzini wrote:
> Il 26/11/2013 17:24, Gleb Natapov ha scritto:
> >> VCPU writes to routing table
> >> e = entry from IRQ routing table
> >> kvm_irq_routing_update(kvm, new);
> >> VCPU resumes execution
> >> kvm_set_msi_irq(e, &irq);
> >> kvm_irq_delivery_to_apic_fast();
> >>
> >> where the entry is stale but the VCPU has already resumed execution.
> >
> > So how is it different from what we have now:
> >
> > disable_irq()
> > VCPU writes to routing table
> > e = entry from IRQ routing table
> > kvm_set_msi_irq(e, &irq);
> > kvm_irq_delivery_to_apic_fast();
> > kvm_irq_routing_update(kvm, new);
> > synchronize_rcu()
> > VCPU resumes execution
> > enable_irq()
> > receive stale irq
>
> Adding a "disable/enable IRQs" looks like a relatively big change. But
> perhaps it's not for some reason I'm missing.
>
You will receive stale irq even without disable/enable IRQs of course. I
put it there so that guest would have a chance to do stupid things like
zeroing idt before receiving interrupt, but on real HW timing is
different from what we emulate, so the same race may happen even without
disable/enable IRQs.
--
Gleb.