KVM: fix race with level interrupts
authorMichael S. Tsirkin <mst@redhat.com>
Thu, 19 Jul 2012 10:45:20 +0000 (13:45 +0300)
committerMarcelo Tosatti <mtosatti@redhat.com>
Fri, 20 Jul 2012 19:12:00 +0000 (16:12 -0300)
commit1a577b72475d161b6677c05abe57301362023bb2
treed8a9910f0016ada479c5a88c1a330b5e1cbc7ef1
parentd63d3e6217c49b81d74141b7920bbe5950532432
KVM: fix race with level interrupts

When more than 1 source id is in use for the same GSI, we have the
following race related to handling irq_states race:

CPU 0 clears bit 0. CPU 0 read irq_state as 0. CPU 1 sets level to 1.
CPU 1 calls kvm_ioapic_set_irq(1). CPU 0 calls kvm_ioapic_set_irq(0).
Now ioapic thinks the level is 0 but irq_state is not 0.

Fix by performing all irq_states bitmap handling under pic/ioapic lock.
This also removes the need for atomics with irq_states handling.

Reported-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
arch/x86/include/asm/kvm_host.h
arch/x86/kvm/i8259.c
virt/kvm/ioapic.c
virt/kvm/ioapic.h
virt/kvm/irq_comm.c