On Tue, Nov 26, 2013 at 3:47 PM, Paolo Bonzini <pbonz...@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.