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

Avi Kivity
2013-11-26T14:36:03Z

[-- Attachment #1: Type: text/plain, Size: 1057 bytes --]

On Tue, Nov 26, 2013 at 3:47 PM, Paolo Bonzini <pbonzini@redhat.com> wrote:

> Il 26/11/2013 14:18, Avi Kivity ha scritto:
> >
> >> I don't think a workqueue is even needed. You just need to use call_rcu
> >> to free "old" after releasing kvm->irq_lock.
> >>
> >> What do you think?
> >
> > Can this cause an interrupt to be delivered to the wrong (old) vcpu?
>
> No, this would be exactly the same code that is running now:
>
> mutex_lock(&kvm->irq_lock);
> old = kvm->irq_routing;
> kvm_irq_routing_update(kvm, new);
> mutex_unlock(&kvm->irq_lock);
>
> synchronize_rcu();
> kfree(old);
> return 0;
>
> Except that the kfree would run in the call_rcu kernel thread instead of
> the vcpu thread. But the vcpus already see the new routing table after
> the rcu_assign_pointer that is in kvm_irq_routing_update.
>
>

I understood the proposal was also to eliminate the synchronize_rcu(), so
while new interrupts would see the new routing table, interrupts already in
flight could pick up the old one.

[-- Attachment #2: Type: text/html, Size: 1639 bytes --]