]> git.baikalelectronics.ru Git - kernel.git/commitdiff
KVM: ia64: fix locking order entering guest
authorJes Sorensen <jes@sgi.com>
Thu, 9 Apr 2009 14:38:14 +0000 (16:38 +0200)
committerAvi Kivity <avi@redhat.com>
Wed, 22 Apr 2009 10:52:09 +0000 (13:52 +0300)
Reorder locking as down_read() may return with local interrupts enabled,
which means we could go into vti_vcpu_run() with interrupts enabled.

This caused random crashes on the Altix as the timer interrupt tried
to read a memory mapped clock source, for which the TLB had not yet been
reinstated in the exit, before ipsr was retored.

Signed-off-by: Jes Sorensen <jes@sgi.com>
Acked-by: Xiantao Zhang <xiantao.zhang@intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
arch/ia64/kvm/kvm-ia64.c

index 28af6a731bb8a26361a60650263a3c943ff7bb9f..d20a5db4c4dde90674debfd2eb370b4434870b89 100644 (file)
@@ -610,20 +610,22 @@ static int __vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
        int r;
 
 again:
-       preempt_disable();
-       local_irq_disable();
-
        if (signal_pending(current)) {
-               local_irq_enable();
-               preempt_enable();
                r = -EINTR;
                kvm_run->exit_reason = KVM_EXIT_INTR;
                goto out;
        }
 
+       /*
+        * down_read() may sleep and return with interrupts enabled
+        */
+       down_read(&vcpu->kvm->slots_lock);
+
+       preempt_disable();
+       local_irq_disable();
+
        vcpu->guest_mode = 1;
        kvm_guest_enter();
-       down_read(&vcpu->kvm->slots_lock);
        r = vti_vcpu_run(vcpu, kvm_run);
        if (r < 0) {
                local_irq_enable();