android_kernel_motorola_sm6225/drivers/kvm
Avi Kivity cccf748b81 [PATCH] KVM: fix race between mmio reads and injected interrupts
The kvm mmio read path looks like:

 1. guest read faults
 2. kvm emulates read, calls emulator_read_emulated()
 3. fails as a read requires userspace help
 4. exit to userspace
 5. userspace emulates read, kvm sets vcpu->mmio_read_completed
 6. re-enter guest, fault again
 7. kvm emulates read, calls emulator_read_emulated()
 8. succeeds as vcpu->mmio_read_emulated is set
 9. instruction completes and guest is resumed

A problem surfaces if the userspace exit (step 5) also requests an interrupt
injection.  In that case, the guest does not re-execute the original
instruction, but the interrupt handler.  The next time an mmio read is
exectued (likely for a different address), step 3 will find
vcpu->mmio_read_completed set and return the value read for the original
instruction.

The problem manifested itself in a few annoying ways:
- little squares appear randomly on console when switching virtual terminals
- ne2000 fails under nfs read load
- rtl8139 complains about "pci errors" even though the device model is
  incapable of issuing them.

Fix by skipping interrupt injection if an mmio read is pending.

A better fix is to avoid re-entry into the guest, and re-emulating immediately
instead.  However that's a bit more complex.

Signed-off-by: Avi Kivity <avi@qumranet.com>
Cc: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-01-23 07:52:06 -08:00
..
Kconfig [PATCH] KVM: Put KVM in a new Virtualization menu 2006-12-13 09:05:46 -08:00
kvm.h [PATCH] KVM: MMU: Replace atomic allocations by preallocated objects 2007-01-05 23:55:27 -08:00
kvm_main.c [PATCH] KVM: make sure there is a vcpu context loaded when destroying the mmu 2007-01-23 07:52:06 -08:00
kvm_svm.h [PATCH] KVM: Replace __x86_64__ with CONFIG_X86_64 2006-12-13 09:05:46 -08:00
kvm_vmx.h [PATCH] KVM: Replace __x86_64__ with CONFIG_X86_64 2006-12-13 09:05:46 -08:00
Makefile [PATCH] kvm: userspace interface 2006-12-10 09:57:22 -08:00
mmu.c [PATCH] KVM: Simplify mmu_alloc_roots() 2007-01-05 23:55:28 -08:00
paging_tmpl.h [PATCH] KVM: MMU: Add missing dirty bit 2007-01-05 23:55:28 -08:00
segment_descriptor.h [PATCH] kvm: userspace interface 2006-12-10 09:57:22 -08:00
svm.c [PATCH] KVM: fix race between mmio reads and injected interrupts 2007-01-23 07:52:06 -08:00
svm.h [PATCH] kvm: userspace interface 2006-12-10 09:57:22 -08:00
vmx.c [PATCH] KVM: fix race between mmio reads and injected interrupts 2007-01-23 07:52:06 -08:00
vmx.h [PATCH] KVM: Rename some msrs 2006-12-30 10:56:44 -08:00
x86_emulate.c [PATCH] KVM: MMU: Fix cmpxchg8b emulation 2007-01-05 23:55:26 -08:00
x86_emulate.h [PATCH] KVM: Replace __x86_64__ with CONFIG_X86_64 2006-12-13 09:05:46 -08:00