aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm
diff options
context:
space:
mode:
authorJoerg Roedel <joerg.roedel@amd.com>2009-08-07 05:49:32 -0400
committerAvi Kivity <avi@redhat.com>2009-09-10 01:33:24 -0400
commita5c3832dfe6324862b4fd1d90831266b15d4b58e (patch)
tree36dc538bbc918a12d91195562949c2d30d485ee0 /arch/x86/kvm
parent0460a979b4b7a564e59eaa8efbba6f5ae38c5b78 (diff)
KVM: SVM: complete interrupts after handling nested exits
The interrupt completion code must run after nested exits are handled because not injected interrupts or exceptions may be handled by the l1 guest first. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> Acked-by: Alexander Graf <agraf@suse.de> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm')
-rw-r--r--arch/x86/kvm/svm.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index df795bcebd22..825b82540f01 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -111,6 +111,7 @@ static int nested = 0;
111module_param(nested, int, S_IRUGO); 111module_param(nested, int, S_IRUGO);
112 112
113static void svm_flush_tlb(struct kvm_vcpu *vcpu); 113static void svm_flush_tlb(struct kvm_vcpu *vcpu);
114static void svm_complete_interrupts(struct vcpu_svm *svm);
114 115
115static int nested_svm_exit_handled(struct vcpu_svm *svm, bool kvm_override); 116static int nested_svm_exit_handled(struct vcpu_svm *svm, bool kvm_override);
116static int nested_svm_vmexit(struct vcpu_svm *svm); 117static int nested_svm_vmexit(struct vcpu_svm *svm);
@@ -2324,6 +2325,8 @@ static int handle_exit(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
2324 } 2325 }
2325 } 2326 }
2326 2327
2328 svm_complete_interrupts(svm);
2329
2327 if (npt_enabled) { 2330 if (npt_enabled) {
2328 int mmu_reload = 0; 2331 int mmu_reload = 0;
2329 if ((vcpu->arch.cr0 ^ svm->vmcb->save.cr0) & X86_CR0_PG) { 2332 if ((vcpu->arch.cr0 ^ svm->vmcb->save.cr0) & X86_CR0_PG) {
@@ -2690,8 +2693,6 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
2690 vcpu->arch.regs_avail &= ~(1 << VCPU_EXREG_PDPTR); 2693 vcpu->arch.regs_avail &= ~(1 << VCPU_EXREG_PDPTR);
2691 vcpu->arch.regs_dirty &= ~(1 << VCPU_EXREG_PDPTR); 2694 vcpu->arch.regs_dirty &= ~(1 << VCPU_EXREG_PDPTR);
2692 } 2695 }
2693
2694 svm_complete_interrupts(svm);
2695} 2696}
2696 2697
2697#undef R 2698#undef R