From ca6e7ab79850e122c6af439037e6b2d4febafbe7 Mon Sep 17 00:00:00 2001 From: Avi Kivity Date: Wed, 15 Aug 2007 15:23:34 +0300 Subject: [PATCH] --- yaml --- r: 68391 b: refs/heads/master c: 7e66f350cfc853043bfa71b281581dd6f92fa347 h: refs/heads/master i: 68389: ec10341321bd3ab31c083ab870da7d87203975ac 68387: 67bbf300cf035c0d969260d3d0f4fc4cfc07b7b0 68383: 9fcf42a1d220f7d15f95cff8e1f81b0fbb8eb7c4 v: v3 --- [refs] | 2 +- trunk/drivers/kvm/svm.c | 19 ++++++++++--------- trunk/drivers/kvm/vmx.c | 23 ++++++++++++----------- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/[refs] b/[refs] index 1a8e773aa461..7731d61f554e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3090dd7377c7eb5cbe229e2a538f9dc7e5b06814 +refs/heads/master: 7e66f350cfc853043bfa71b281581dd6f92fa347 diff --git a/trunk/drivers/kvm/svm.c b/trunk/drivers/kvm/svm.c index e3c6d891326b..cc674bfd31d9 100644 --- a/trunk/drivers/kvm/svm.c +++ b/trunk/drivers/kvm/svm.c @@ -1398,11 +1398,19 @@ static int svm_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) if (unlikely(r)) return r; + clgi(); + + if (signal_pending(current)) { + stgi(); + ++vcpu->stat.signal_exits; + post_kvm_run_save(svm, kvm_run); + kvm_run->exit_reason = KVM_EXIT_INTR; + return -EINTR; + } + if (!vcpu->mmio_read_completed) do_interrupt_requests(svm, kvm_run); - clgi(); - vcpu->guest_mode = 1; if (vcpu->requests) if (test_and_clear_bit(KVM_TLB_FLUSH, &vcpu->requests)) @@ -1582,13 +1590,6 @@ static int svm_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) r = handle_exit(svm, kvm_run); if (r > 0) { - if (signal_pending(current)) { - ++vcpu->stat.signal_exits; - post_kvm_run_save(svm, kvm_run); - kvm_run->exit_reason = KVM_EXIT_INTR; - return -EINTR; - } - if (dm_request_for_irq_injection(svm, kvm_run)) { ++vcpu->stat.request_irq_exits; post_kvm_run_save(svm, kvm_run); diff --git a/trunk/drivers/kvm/vmx.c b/trunk/drivers/kvm/vmx.c index 906d4fa13d10..a9b4cb51dec8 100644 --- a/trunk/drivers/kvm/vmx.c +++ b/trunk/drivers/kvm/vmx.c @@ -2066,9 +2066,6 @@ static int vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) preempt_disable(); - if (!vcpu->mmio_read_completed) - do_interrupt_requests(vcpu, kvm_run); - vmx_save_host_state(vmx); kvm_load_guest_fpu(vcpu); @@ -2079,6 +2076,18 @@ static int vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) local_irq_disable(); + if (signal_pending(current)) { + local_irq_enable(); + preempt_enable(); + r = -EINTR; + kvm_run->exit_reason = KVM_EXIT_INTR; + ++vcpu->stat.signal_exits; + goto out; + } + + if (!vcpu->mmio_read_completed) + do_interrupt_requests(vcpu, kvm_run); + vcpu->guest_mode = 1; if (vcpu->requests) if (test_and_clear_bit(KVM_TLB_FLUSH, &vcpu->requests)) @@ -2227,14 +2236,6 @@ static int vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) r = kvm_handle_exit(kvm_run, vcpu); if (r > 0) { - /* Give scheduler a change to reschedule. */ - if (signal_pending(current)) { - r = -EINTR; - kvm_run->exit_reason = KVM_EXIT_INTR; - ++vcpu->stat.signal_exits; - goto out; - } - if (dm_request_for_irq_injection(vcpu, kvm_run)) { r = -EINTR; kvm_run->exit_reason = KVM_EXIT_INTR;