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>
Showing
- arch/x86/include/asm/kvm_host.h 14 additions, 1 deletionarch/x86/include/asm/kvm_host.h
- arch/x86/kvm/i8259.c 14 additions, 3 deletionsarch/x86/kvm/i8259.c
- virt/kvm/ioapic.c 16 additions, 3 deletionsvirt/kvm/ioapic.c
- virt/kvm/ioapic.h 3 additions, 1 deletionvirt/kvm/ioapic.h
- virt/kvm/irq_comm.c 4 additions, 27 deletionsvirt/kvm/irq_comm.c
Loading
Please register or sign in to comment